| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579 |
- /**
- * @license Angular v8.1.3
- * (c) 2010-2019 Google LLC. https://angular.io/
- * License: MIT
- */
- var $reflect = {defineMetadata: function() {}, getOwnMetadata: function() {}};
- var Reflect = (typeof global !== 'undefined' ? global : {})['Reflect'] || {};
- Object.keys($reflect).forEach(function(key) { Reflect[key] = Reflect[key] || $reflect[key]; });
- var $deferred, $resolved, $provided;
- function $getModule(name) { return $provided[name] || require(name); }
- function define(modules, cb) { $deferred = { modules: modules, cb: cb }; }
- module.exports = function(provided) {
- if ($resolved) return $resolved;
- var result = {};
- $provided = Object.assign({'reflect-metadata': $reflect}, provided || {}, { exports: result });
- $deferred.cb.apply(this, $deferred.modules.map($getModule));
- $resolved = result;
- return result;
- }
- define(['exports', 'path', 'typescript', 'fs'], function (exports, path, ts, fs) { 'use strict';
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
- this file except in compliance with the License. You may obtain a copy of the
- License at http://www.apache.org/licenses/LICENSE-2.0
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
- MERCHANTABLITY OR NON-INFRINGEMENT.
- See the Apache Version 2.0 License for specific language governing permissions
- and limitations under the License.
- ***************************************************************************** */
- /* global Reflect, Promise */
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
- function __decorate(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- }
- function __param(paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- }
- function __metadata(metadataKey, metadataValue) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
- }
- function __values(o) {
- var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
- if (m) return m.call(o);
- return {
- next: function () {
- if (o && i >= o.length) o = void 0;
- return { value: o && o[i++], done: !o };
- }
- };
- }
- function __read(o, n) {
- var m = typeof Symbol === "function" && o[Symbol.iterator];
- if (!m) return o;
- var i = m.call(o), r, ar = [], e;
- try {
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
- }
- catch (error) { e = { error: error }; }
- finally {
- try {
- if (r && !r.done && (m = i["return"])) m.call(i);
- }
- finally { if (e) throw e.error; }
- }
- return ar;
- }
- function __spread() {
- for (var ar = [], i = 0; i < arguments.length; i++)
- ar = ar.concat(__read(arguments[i]));
- return ar;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TagContentType;
- (function (TagContentType) {
- TagContentType[TagContentType["RAW_TEXT"] = 0] = "RAW_TEXT";
- TagContentType[TagContentType["ESCAPABLE_RAW_TEXT"] = 1] = "ESCAPABLE_RAW_TEXT";
- TagContentType[TagContentType["PARSABLE_DATA"] = 2] = "PARSABLE_DATA";
- })(TagContentType || (TagContentType = {}));
- function splitNsName(elementName) {
- if (elementName[0] != ':') {
- return [null, elementName];
- }
- var colonIndex = elementName.indexOf(':', 1);
- if (colonIndex == -1) {
- throw new Error("Unsupported format \"" + elementName + "\" expecting \":namespace:name\"");
- }
- return [elementName.slice(1, colonIndex), elementName.slice(colonIndex + 1)];
- }
- // `<ng-container>` tags work the same regardless the namespace
- function isNgContainer(tagName) {
- return splitNsName(tagName)[1] === 'ng-container';
- }
- // `<ng-content>` tags work the same regardless the namespace
- function isNgContent(tagName) {
- return splitNsName(tagName)[1] === 'ng-content';
- }
- // `<ng-template>` tags work the same regardless the namespace
- function isNgTemplate(tagName) {
- return splitNsName(tagName)[1] === 'ng-template';
- }
- function getNsPrefix(fullName) {
- return fullName === null ? null : splitNsName(fullName)[0];
- }
- function mergeNsAndName(prefix, localName) {
- return prefix ? ":" + prefix + ":" + localName : localName;
- }
- // see http://www.w3.org/TR/html51/syntax.html#named-character-references
- // see https://html.spec.whatwg.org/multipage/entities.json
- // This list is not exhaustive to keep the compiler footprint low.
- // The `{` / `ƫ` syntax should be used when the named character reference does not
- // exist.
- var NAMED_ENTITIES = {
- 'Aacute': '\u00C1',
- 'aacute': '\u00E1',
- 'Acirc': '\u00C2',
- 'acirc': '\u00E2',
- 'acute': '\u00B4',
- 'AElig': '\u00C6',
- 'aelig': '\u00E6',
- 'Agrave': '\u00C0',
- 'agrave': '\u00E0',
- 'alefsym': '\u2135',
- 'Alpha': '\u0391',
- 'alpha': '\u03B1',
- 'amp': '&',
- 'and': '\u2227',
- 'ang': '\u2220',
- 'apos': '\u0027',
- 'Aring': '\u00C5',
- 'aring': '\u00E5',
- 'asymp': '\u2248',
- 'Atilde': '\u00C3',
- 'atilde': '\u00E3',
- 'Auml': '\u00C4',
- 'auml': '\u00E4',
- 'bdquo': '\u201E',
- 'Beta': '\u0392',
- 'beta': '\u03B2',
- 'brvbar': '\u00A6',
- 'bull': '\u2022',
- 'cap': '\u2229',
- 'Ccedil': '\u00C7',
- 'ccedil': '\u00E7',
- 'cedil': '\u00B8',
- 'cent': '\u00A2',
- 'Chi': '\u03A7',
- 'chi': '\u03C7',
- 'circ': '\u02C6',
- 'clubs': '\u2663',
- 'cong': '\u2245',
- 'copy': '\u00A9',
- 'crarr': '\u21B5',
- 'cup': '\u222A',
- 'curren': '\u00A4',
- 'dagger': '\u2020',
- 'Dagger': '\u2021',
- 'darr': '\u2193',
- 'dArr': '\u21D3',
- 'deg': '\u00B0',
- 'Delta': '\u0394',
- 'delta': '\u03B4',
- 'diams': '\u2666',
- 'divide': '\u00F7',
- 'Eacute': '\u00C9',
- 'eacute': '\u00E9',
- 'Ecirc': '\u00CA',
- 'ecirc': '\u00EA',
- 'Egrave': '\u00C8',
- 'egrave': '\u00E8',
- 'empty': '\u2205',
- 'emsp': '\u2003',
- 'ensp': '\u2002',
- 'Epsilon': '\u0395',
- 'epsilon': '\u03B5',
- 'equiv': '\u2261',
- 'Eta': '\u0397',
- 'eta': '\u03B7',
- 'ETH': '\u00D0',
- 'eth': '\u00F0',
- 'Euml': '\u00CB',
- 'euml': '\u00EB',
- 'euro': '\u20AC',
- 'exist': '\u2203',
- 'fnof': '\u0192',
- 'forall': '\u2200',
- 'frac12': '\u00BD',
- 'frac14': '\u00BC',
- 'frac34': '\u00BE',
- 'frasl': '\u2044',
- 'Gamma': '\u0393',
- 'gamma': '\u03B3',
- 'ge': '\u2265',
- 'gt': '>',
- 'harr': '\u2194',
- 'hArr': '\u21D4',
- 'hearts': '\u2665',
- 'hellip': '\u2026',
- 'Iacute': '\u00CD',
- 'iacute': '\u00ED',
- 'Icirc': '\u00CE',
- 'icirc': '\u00EE',
- 'iexcl': '\u00A1',
- 'Igrave': '\u00CC',
- 'igrave': '\u00EC',
- 'image': '\u2111',
- 'infin': '\u221E',
- 'int': '\u222B',
- 'Iota': '\u0399',
- 'iota': '\u03B9',
- 'iquest': '\u00BF',
- 'isin': '\u2208',
- 'Iuml': '\u00CF',
- 'iuml': '\u00EF',
- 'Kappa': '\u039A',
- 'kappa': '\u03BA',
- 'Lambda': '\u039B',
- 'lambda': '\u03BB',
- 'lang': '\u27E8',
- 'laquo': '\u00AB',
- 'larr': '\u2190',
- 'lArr': '\u21D0',
- 'lceil': '\u2308',
- 'ldquo': '\u201C',
- 'le': '\u2264',
- 'lfloor': '\u230A',
- 'lowast': '\u2217',
- 'loz': '\u25CA',
- 'lrm': '\u200E',
- 'lsaquo': '\u2039',
- 'lsquo': '\u2018',
- 'lt': '<',
- 'macr': '\u00AF',
- 'mdash': '\u2014',
- 'micro': '\u00B5',
- 'middot': '\u00B7',
- 'minus': '\u2212',
- 'Mu': '\u039C',
- 'mu': '\u03BC',
- 'nabla': '\u2207',
- 'nbsp': '\u00A0',
- 'ndash': '\u2013',
- 'ne': '\u2260',
- 'ni': '\u220B',
- 'not': '\u00AC',
- 'notin': '\u2209',
- 'nsub': '\u2284',
- 'Ntilde': '\u00D1',
- 'ntilde': '\u00F1',
- 'Nu': '\u039D',
- 'nu': '\u03BD',
- 'Oacute': '\u00D3',
- 'oacute': '\u00F3',
- 'Ocirc': '\u00D4',
- 'ocirc': '\u00F4',
- 'OElig': '\u0152',
- 'oelig': '\u0153',
- 'Ograve': '\u00D2',
- 'ograve': '\u00F2',
- 'oline': '\u203E',
- 'Omega': '\u03A9',
- 'omega': '\u03C9',
- 'Omicron': '\u039F',
- 'omicron': '\u03BF',
- 'oplus': '\u2295',
- 'or': '\u2228',
- 'ordf': '\u00AA',
- 'ordm': '\u00BA',
- 'Oslash': '\u00D8',
- 'oslash': '\u00F8',
- 'Otilde': '\u00D5',
- 'otilde': '\u00F5',
- 'otimes': '\u2297',
- 'Ouml': '\u00D6',
- 'ouml': '\u00F6',
- 'para': '\u00B6',
- 'permil': '\u2030',
- 'perp': '\u22A5',
- 'Phi': '\u03A6',
- 'phi': '\u03C6',
- 'Pi': '\u03A0',
- 'pi': '\u03C0',
- 'piv': '\u03D6',
- 'plusmn': '\u00B1',
- 'pound': '\u00A3',
- 'prime': '\u2032',
- 'Prime': '\u2033',
- 'prod': '\u220F',
- 'prop': '\u221D',
- 'Psi': '\u03A8',
- 'psi': '\u03C8',
- 'quot': '\u0022',
- 'radic': '\u221A',
- 'rang': '\u27E9',
- 'raquo': '\u00BB',
- 'rarr': '\u2192',
- 'rArr': '\u21D2',
- 'rceil': '\u2309',
- 'rdquo': '\u201D',
- 'real': '\u211C',
- 'reg': '\u00AE',
- 'rfloor': '\u230B',
- 'Rho': '\u03A1',
- 'rho': '\u03C1',
- 'rlm': '\u200F',
- 'rsaquo': '\u203A',
- 'rsquo': '\u2019',
- 'sbquo': '\u201A',
- 'Scaron': '\u0160',
- 'scaron': '\u0161',
- 'sdot': '\u22C5',
- 'sect': '\u00A7',
- 'shy': '\u00AD',
- 'Sigma': '\u03A3',
- 'sigma': '\u03C3',
- 'sigmaf': '\u03C2',
- 'sim': '\u223C',
- 'spades': '\u2660',
- 'sub': '\u2282',
- 'sube': '\u2286',
- 'sum': '\u2211',
- 'sup': '\u2283',
- 'sup1': '\u00B9',
- 'sup2': '\u00B2',
- 'sup3': '\u00B3',
- 'supe': '\u2287',
- 'szlig': '\u00DF',
- 'Tau': '\u03A4',
- 'tau': '\u03C4',
- 'there4': '\u2234',
- 'Theta': '\u0398',
- 'theta': '\u03B8',
- 'thetasym': '\u03D1',
- 'thinsp': '\u2009',
- 'THORN': '\u00DE',
- 'thorn': '\u00FE',
- 'tilde': '\u02DC',
- 'times': '\u00D7',
- 'trade': '\u2122',
- 'Uacute': '\u00DA',
- 'uacute': '\u00FA',
- 'uarr': '\u2191',
- 'uArr': '\u21D1',
- 'Ucirc': '\u00DB',
- 'ucirc': '\u00FB',
- 'Ugrave': '\u00D9',
- 'ugrave': '\u00F9',
- 'uml': '\u00A8',
- 'upsih': '\u03D2',
- 'Upsilon': '\u03A5',
- 'upsilon': '\u03C5',
- 'Uuml': '\u00DC',
- 'uuml': '\u00FC',
- 'weierp': '\u2118',
- 'Xi': '\u039E',
- 'xi': '\u03BE',
- 'Yacute': '\u00DD',
- 'yacute': '\u00FD',
- 'yen': '\u00A5',
- 'yuml': '\u00FF',
- 'Yuml': '\u0178',
- 'Zeta': '\u0396',
- 'zeta': '\u03B6',
- 'zwj': '\u200D',
- 'zwnj': '\u200C',
- };
- // The &ngsp; pseudo-entity is denoting a space. see:
- // https://github.com/dart-lang/angular/blob/0bb611387d29d65b5af7f9d2515ab571fd3fbee4/_tests/test/compiler/preserve_whitespace_test.dart
- var NGSP_UNICODE = '\uE500';
- NAMED_ENTITIES['ngsp'] = NGSP_UNICODE;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var HtmlTagDefinition = /** @class */ (function () {
- function HtmlTagDefinition(_a) {
- var _this = this;
- var _b = _a === void 0 ? {} : _a, closedByChildren = _b.closedByChildren, implicitNamespacePrefix = _b.implicitNamespacePrefix, _c = _b.contentType, contentType = _c === void 0 ? TagContentType.PARSABLE_DATA : _c, _d = _b.closedByParent, closedByParent = _d === void 0 ? false : _d, _e = _b.isVoid, isVoid = _e === void 0 ? false : _e, _f = _b.ignoreFirstLf, ignoreFirstLf = _f === void 0 ? false : _f;
- this.closedByChildren = {};
- this.closedByParent = false;
- this.canSelfClose = false;
- if (closedByChildren && closedByChildren.length > 0) {
- closedByChildren.forEach(function (tagName) { return _this.closedByChildren[tagName] = true; });
- }
- this.isVoid = isVoid;
- this.closedByParent = closedByParent || isVoid;
- this.implicitNamespacePrefix = implicitNamespacePrefix || null;
- this.contentType = contentType;
- this.ignoreFirstLf = ignoreFirstLf;
- }
- HtmlTagDefinition.prototype.isClosedByChild = function (name) {
- return this.isVoid || name.toLowerCase() in this.closedByChildren;
- };
- return HtmlTagDefinition;
- }());
- var _DEFAULT_TAG_DEFINITION;
- // see http://www.w3.org/TR/html51/syntax.html#optional-tags
- // This implementation does not fully conform to the HTML5 spec.
- var TAG_DEFINITIONS;
- function getHtmlTagDefinition(tagName) {
- if (!TAG_DEFINITIONS) {
- _DEFAULT_TAG_DEFINITION = new HtmlTagDefinition();
- TAG_DEFINITIONS = {
- 'base': new HtmlTagDefinition({ isVoid: true }),
- 'meta': new HtmlTagDefinition({ isVoid: true }),
- 'area': new HtmlTagDefinition({ isVoid: true }),
- 'embed': new HtmlTagDefinition({ isVoid: true }),
- 'link': new HtmlTagDefinition({ isVoid: true }),
- 'img': new HtmlTagDefinition({ isVoid: true }),
- 'input': new HtmlTagDefinition({ isVoid: true }),
- 'param': new HtmlTagDefinition({ isVoid: true }),
- 'hr': new HtmlTagDefinition({ isVoid: true }),
- 'br': new HtmlTagDefinition({ isVoid: true }),
- 'source': new HtmlTagDefinition({ isVoid: true }),
- 'track': new HtmlTagDefinition({ isVoid: true }),
- 'wbr': new HtmlTagDefinition({ isVoid: true }),
- 'p': new HtmlTagDefinition({
- closedByChildren: [
- 'address', 'article', 'aside', 'blockquote', 'div', 'dl', 'fieldset',
- 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5',
- 'h6', 'header', 'hgroup', 'hr', 'main', 'nav', 'ol',
- 'p', 'pre', 'section', 'table', 'ul'
- ],
- closedByParent: true
- }),
- 'thead': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'] }),
- 'tbody': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'], closedByParent: true }),
- 'tfoot': new HtmlTagDefinition({ closedByChildren: ['tbody'], closedByParent: true }),
- 'tr': new HtmlTagDefinition({ closedByChildren: ['tr'], closedByParent: true }),
- 'td': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
- 'th': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
- 'col': new HtmlTagDefinition({ isVoid: true }),
- 'svg': new HtmlTagDefinition({ implicitNamespacePrefix: 'svg' }),
- 'math': new HtmlTagDefinition({ implicitNamespacePrefix: 'math' }),
- 'li': new HtmlTagDefinition({ closedByChildren: ['li'], closedByParent: true }),
- 'dt': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'] }),
- 'dd': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'], closedByParent: true }),
- 'rb': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
- 'rt': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
- 'rtc': new HtmlTagDefinition({ closedByChildren: ['rb', 'rtc', 'rp'], closedByParent: true }),
- 'rp': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
- 'optgroup': new HtmlTagDefinition({ closedByChildren: ['optgroup'], closedByParent: true }),
- 'option': new HtmlTagDefinition({ closedByChildren: ['option', 'optgroup'], closedByParent: true }),
- 'pre': new HtmlTagDefinition({ ignoreFirstLf: true }),
- 'listing': new HtmlTagDefinition({ ignoreFirstLf: true }),
- 'style': new HtmlTagDefinition({ contentType: TagContentType.RAW_TEXT }),
- 'script': new HtmlTagDefinition({ contentType: TagContentType.RAW_TEXT }),
- 'title': new HtmlTagDefinition({ contentType: TagContentType.ESCAPABLE_RAW_TEXT }),
- 'textarea': new HtmlTagDefinition({ contentType: TagContentType.ESCAPABLE_RAW_TEXT, ignoreFirstLf: true }),
- };
- }
- return TAG_DEFINITIONS[tagName.toLowerCase()] || _DEFAULT_TAG_DEFINITION;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _SELECTOR_REGEXP = new RegExp('(\\:not\\()|' + //":not("
- '([-\\w]+)|' + // "tag"
- '(?:\\.([-\\w]+))|' + // ".class"
- // "-" should appear first in the regexp below as FF31 parses "[.-\w]" as a range
- '(?:\\[([-.\\w*]+)(?:=([\"\']?)([^\\]\"\']*)\\5)?\\])|' + // "[name]", "[name=value]",
- // "[name="value"]",
- // "[name='value']"
- '(\\))|' + // ")"
- '(\\s*,\\s*)', // ","
- 'g');
- /**
- * A css selector contains an element name,
- * css classes and attribute/value pairs with the purpose
- * of selecting subsets out of them.
- */
- var CssSelector = /** @class */ (function () {
- function CssSelector() {
- this.element = null;
- this.classNames = [];
- /**
- * The selectors are encoded in pairs where:
- * - even locations are attribute names
- * - odd locations are attribute values.
- *
- * Example:
- * Selector: `[key1=value1][key2]` would parse to:
- * ```
- * ['key1', 'value1', 'key2', '']
- * ```
- */
- this.attrs = [];
- this.notSelectors = [];
- }
- CssSelector.parse = function (selector) {
- var results = [];
- var _addResult = function (res, cssSel) {
- if (cssSel.notSelectors.length > 0 && !cssSel.element && cssSel.classNames.length == 0 &&
- cssSel.attrs.length == 0) {
- cssSel.element = '*';
- }
- res.push(cssSel);
- };
- var cssSelector = new CssSelector();
- var match;
- var current = cssSelector;
- var inNot = false;
- _SELECTOR_REGEXP.lastIndex = 0;
- while (match = _SELECTOR_REGEXP.exec(selector)) {
- if (match[1]) {
- if (inNot) {
- throw new Error('Nesting :not is not allowed in a selector');
- }
- inNot = true;
- current = new CssSelector();
- cssSelector.notSelectors.push(current);
- }
- if (match[2]) {
- current.setElement(match[2]);
- }
- if (match[3]) {
- current.addClassName(match[3]);
- }
- if (match[4]) {
- current.addAttribute(match[4], match[6]);
- }
- if (match[7]) {
- inNot = false;
- current = cssSelector;
- }
- if (match[8]) {
- if (inNot) {
- throw new Error('Multiple selectors in :not are not supported');
- }
- _addResult(results, cssSelector);
- cssSelector = current = new CssSelector();
- }
- }
- _addResult(results, cssSelector);
- return results;
- };
- CssSelector.prototype.isElementSelector = function () {
- return this.hasElementSelector() && this.classNames.length == 0 && this.attrs.length == 0 &&
- this.notSelectors.length === 0;
- };
- CssSelector.prototype.hasElementSelector = function () { return !!this.element; };
- CssSelector.prototype.setElement = function (element) {
- if (element === void 0) { element = null; }
- this.element = element;
- };
- /** Gets a template string for an element that matches the selector. */
- CssSelector.prototype.getMatchingElementTemplate = function () {
- var tagName = this.element || 'div';
- var classAttr = this.classNames.length > 0 ? " class=\"" + this.classNames.join(' ') + "\"" : '';
- var attrs = '';
- for (var i = 0; i < this.attrs.length; i += 2) {
- var attrName = this.attrs[i];
- var attrValue = this.attrs[i + 1] !== '' ? "=\"" + this.attrs[i + 1] + "\"" : '';
- attrs += " " + attrName + attrValue;
- }
- return getHtmlTagDefinition(tagName).isVoid ? "<" + tagName + classAttr + attrs + "/>" :
- "<" + tagName + classAttr + attrs + "></" + tagName + ">";
- };
- CssSelector.prototype.getAttrs = function () {
- var result = [];
- if (this.classNames.length > 0) {
- result.push('class', this.classNames.join(' '));
- }
- return result.concat(this.attrs);
- };
- CssSelector.prototype.addAttribute = function (name, value) {
- if (value === void 0) { value = ''; }
- this.attrs.push(name, value && value.toLowerCase() || '');
- };
- CssSelector.prototype.addClassName = function (name) { this.classNames.push(name.toLowerCase()); };
- CssSelector.prototype.toString = function () {
- var res = this.element || '';
- if (this.classNames) {
- this.classNames.forEach(function (klass) { return res += "." + klass; });
- }
- if (this.attrs) {
- for (var i = 0; i < this.attrs.length; i += 2) {
- var name_1 = this.attrs[i];
- var value = this.attrs[i + 1];
- res += "[" + name_1 + (value ? '=' + value : '') + "]";
- }
- }
- this.notSelectors.forEach(function (notSelector) { return res += ":not(" + notSelector + ")"; });
- return res;
- };
- return CssSelector;
- }());
- /**
- * Reads a list of CssSelectors and allows to calculate which ones
- * are contained in a given CssSelector.
- */
- var SelectorMatcher = /** @class */ (function () {
- function SelectorMatcher() {
- this._elementMap = new Map();
- this._elementPartialMap = new Map();
- this._classMap = new Map();
- this._classPartialMap = new Map();
- this._attrValueMap = new Map();
- this._attrValuePartialMap = new Map();
- this._listContexts = [];
- }
- SelectorMatcher.createNotMatcher = function (notSelectors) {
- var notMatcher = new SelectorMatcher();
- notMatcher.addSelectables(notSelectors, null);
- return notMatcher;
- };
- SelectorMatcher.prototype.addSelectables = function (cssSelectors, callbackCtxt) {
- var listContext = null;
- if (cssSelectors.length > 1) {
- listContext = new SelectorListContext(cssSelectors);
- this._listContexts.push(listContext);
- }
- for (var i = 0; i < cssSelectors.length; i++) {
- this._addSelectable(cssSelectors[i], callbackCtxt, listContext);
- }
- };
- /**
- * Add an object that can be found later on by calling `match`.
- * @param cssSelector A css selector
- * @param callbackCtxt An opaque object that will be given to the callback of the `match` function
- */
- SelectorMatcher.prototype._addSelectable = function (cssSelector, callbackCtxt, listContext) {
- var matcher = this;
- var element = cssSelector.element;
- var classNames = cssSelector.classNames;
- var attrs = cssSelector.attrs;
- var selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);
- if (element) {
- var isTerminal = attrs.length === 0 && classNames.length === 0;
- if (isTerminal) {
- this._addTerminal(matcher._elementMap, element, selectable);
- }
- else {
- matcher = this._addPartial(matcher._elementPartialMap, element);
- }
- }
- if (classNames) {
- for (var i = 0; i < classNames.length; i++) {
- var isTerminal = attrs.length === 0 && i === classNames.length - 1;
- var className = classNames[i];
- if (isTerminal) {
- this._addTerminal(matcher._classMap, className, selectable);
- }
- else {
- matcher = this._addPartial(matcher._classPartialMap, className);
- }
- }
- }
- if (attrs) {
- for (var i = 0; i < attrs.length; i += 2) {
- var isTerminal = i === attrs.length - 2;
- var name_2 = attrs[i];
- var value = attrs[i + 1];
- if (isTerminal) {
- var terminalMap = matcher._attrValueMap;
- var terminalValuesMap = terminalMap.get(name_2);
- if (!terminalValuesMap) {
- terminalValuesMap = new Map();
- terminalMap.set(name_2, terminalValuesMap);
- }
- this._addTerminal(terminalValuesMap, value, selectable);
- }
- else {
- var partialMap = matcher._attrValuePartialMap;
- var partialValuesMap = partialMap.get(name_2);
- if (!partialValuesMap) {
- partialValuesMap = new Map();
- partialMap.set(name_2, partialValuesMap);
- }
- matcher = this._addPartial(partialValuesMap, value);
- }
- }
- }
- };
- SelectorMatcher.prototype._addTerminal = function (map, name, selectable) {
- var terminalList = map.get(name);
- if (!terminalList) {
- terminalList = [];
- map.set(name, terminalList);
- }
- terminalList.push(selectable);
- };
- SelectorMatcher.prototype._addPartial = function (map, name) {
- var matcher = map.get(name);
- if (!matcher) {
- matcher = new SelectorMatcher();
- map.set(name, matcher);
- }
- return matcher;
- };
- /**
- * Find the objects that have been added via `addSelectable`
- * whose css selector is contained in the given css selector.
- * @param cssSelector A css selector
- * @param matchedCallback This callback will be called with the object handed into `addSelectable`
- * @return boolean true if a match was found
- */
- SelectorMatcher.prototype.match = function (cssSelector, matchedCallback) {
- var result = false;
- var element = cssSelector.element;
- var classNames = cssSelector.classNames;
- var attrs = cssSelector.attrs;
- for (var i = 0; i < this._listContexts.length; i++) {
- this._listContexts[i].alreadyMatched = false;
- }
- result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;
- result = this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) ||
- result;
- if (classNames) {
- for (var i = 0; i < classNames.length; i++) {
- var className = classNames[i];
- result =
- this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;
- result =
- this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) ||
- result;
- }
- }
- if (attrs) {
- for (var i = 0; i < attrs.length; i += 2) {
- var name_3 = attrs[i];
- var value = attrs[i + 1];
- var terminalValuesMap = this._attrValueMap.get(name_3);
- if (value) {
- result =
- this._matchTerminal(terminalValuesMap, '', cssSelector, matchedCallback) || result;
- }
- result =
- this._matchTerminal(terminalValuesMap, value, cssSelector, matchedCallback) || result;
- var partialValuesMap = this._attrValuePartialMap.get(name_3);
- if (value) {
- result = this._matchPartial(partialValuesMap, '', cssSelector, matchedCallback) || result;
- }
- result =
- this._matchPartial(partialValuesMap, value, cssSelector, matchedCallback) || result;
- }
- }
- return result;
- };
- /** @internal */
- SelectorMatcher.prototype._matchTerminal = function (map, name, cssSelector, matchedCallback) {
- if (!map || typeof name !== 'string') {
- return false;
- }
- var selectables = map.get(name) || [];
- var starSelectables = map.get('*');
- if (starSelectables) {
- selectables = selectables.concat(starSelectables);
- }
- if (selectables.length === 0) {
- return false;
- }
- var selectable;
- var result = false;
- for (var i = 0; i < selectables.length; i++) {
- selectable = selectables[i];
- result = selectable.finalize(cssSelector, matchedCallback) || result;
- }
- return result;
- };
- /** @internal */
- SelectorMatcher.prototype._matchPartial = function (map, name, cssSelector, matchedCallback) {
- if (!map || typeof name !== 'string') {
- return false;
- }
- var nestedSelector = map.get(name);
- if (!nestedSelector) {
- return false;
- }
- // TODO(perf): get rid of recursion and measure again
- // TODO(perf): don't pass the whole selector into the recursion,
- // but only the not processed parts
- return nestedSelector.match(cssSelector, matchedCallback);
- };
- return SelectorMatcher;
- }());
- var SelectorListContext = /** @class */ (function () {
- function SelectorListContext(selectors) {
- this.selectors = selectors;
- this.alreadyMatched = false;
- }
- return SelectorListContext;
- }());
- // Store context to pass back selector and context when a selector is matched
- var SelectorContext = /** @class */ (function () {
- function SelectorContext(selector, cbContext, listContext) {
- this.selector = selector;
- this.cbContext = cbContext;
- this.listContext = listContext;
- this.notSelectors = selector.notSelectors;
- }
- SelectorContext.prototype.finalize = function (cssSelector, callback) {
- var result = true;
- if (this.notSelectors.length > 0 && (!this.listContext || !this.listContext.alreadyMatched)) {
- var notMatcher = SelectorMatcher.createNotMatcher(this.notSelectors);
- result = !notMatcher.match(cssSelector, null);
- }
- if (result && callback && (!this.listContext || !this.listContext.alreadyMatched)) {
- if (this.listContext) {
- this.listContext.alreadyMatched = true;
- }
- callback(this.selector, this.cbContext);
- }
- return result;
- };
- return SelectorContext;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var createInject = makeMetadataFactory('Inject', function (token) { return ({ token: token }); });
- var createInjectionToken = makeMetadataFactory('InjectionToken', function (desc) { return ({ _desc: desc, ngInjectableDef: undefined }); });
- var createAttribute = makeMetadataFactory('Attribute', function (attributeName) { return ({ attributeName: attributeName }); });
- var createContentChildren = makeMetadataFactory('ContentChildren', function (selector, data) {
- if (data === void 0) { data = {}; }
- return (__assign({ selector: selector, first: false, isViewQuery: false, descendants: false }, data));
- });
- var createContentChild = makeMetadataFactory('ContentChild', function (selector, data) {
- if (data === void 0) { data = {}; }
- return (__assign({ selector: selector, first: true, isViewQuery: false, descendants: true }, data));
- });
- var createViewChildren = makeMetadataFactory('ViewChildren', function (selector, data) {
- if (data === void 0) { data = {}; }
- return (__assign({ selector: selector, first: false, isViewQuery: true, descendants: true }, data));
- });
- var createViewChild = makeMetadataFactory('ViewChild', function (selector, data) {
- return (__assign({ selector: selector, first: true, isViewQuery: true, descendants: true }, data));
- });
- var createDirective = makeMetadataFactory('Directive', function (dir) {
- if (dir === void 0) { dir = {}; }
- return dir;
- });
- var ViewEncapsulation;
- (function (ViewEncapsulation) {
- ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
- ViewEncapsulation[ViewEncapsulation["Native"] = 1] = "Native";
- ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
- ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
- })(ViewEncapsulation || (ViewEncapsulation = {}));
- var ChangeDetectionStrategy;
- (function (ChangeDetectionStrategy) {
- ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush";
- ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default";
- })(ChangeDetectionStrategy || (ChangeDetectionStrategy = {}));
- var createComponent = makeMetadataFactory('Component', function (c) {
- if (c === void 0) { c = {}; }
- return (__assign({ changeDetection: ChangeDetectionStrategy.Default }, c));
- });
- var createPipe = makeMetadataFactory('Pipe', function (p) { return (__assign({ pure: true }, p)); });
- var createInput = makeMetadataFactory('Input', function (bindingPropertyName) { return ({ bindingPropertyName: bindingPropertyName }); });
- var createOutput = makeMetadataFactory('Output', function (bindingPropertyName) { return ({ bindingPropertyName: bindingPropertyName }); });
- var createHostBinding = makeMetadataFactory('HostBinding', function (hostPropertyName) { return ({ hostPropertyName: hostPropertyName }); });
- var createHostListener = makeMetadataFactory('HostListener', function (eventName, args) { return ({ eventName: eventName, args: args }); });
- var createNgModule = makeMetadataFactory('NgModule', function (ngModule) { return ngModule; });
- var createInjectable = makeMetadataFactory('Injectable', function (injectable) {
- if (injectable === void 0) { injectable = {}; }
- return injectable;
- });
- var CUSTOM_ELEMENTS_SCHEMA = {
- name: 'custom-elements'
- };
- var NO_ERRORS_SCHEMA = {
- name: 'no-errors-schema'
- };
- var createOptional = makeMetadataFactory('Optional');
- var createSelf = makeMetadataFactory('Self');
- var createSkipSelf = makeMetadataFactory('SkipSelf');
- var createHost = makeMetadataFactory('Host');
- var Type = Function;
- var SecurityContext;
- (function (SecurityContext) {
- SecurityContext[SecurityContext["NONE"] = 0] = "NONE";
- SecurityContext[SecurityContext["HTML"] = 1] = "HTML";
- SecurityContext[SecurityContext["STYLE"] = 2] = "STYLE";
- SecurityContext[SecurityContext["SCRIPT"] = 3] = "SCRIPT";
- SecurityContext[SecurityContext["URL"] = 4] = "URL";
- SecurityContext[SecurityContext["RESOURCE_URL"] = 5] = "RESOURCE_URL";
- })(SecurityContext || (SecurityContext = {}));
- var MissingTranslationStrategy;
- (function (MissingTranslationStrategy) {
- MissingTranslationStrategy[MissingTranslationStrategy["Error"] = 0] = "Error";
- MissingTranslationStrategy[MissingTranslationStrategy["Warning"] = 1] = "Warning";
- MissingTranslationStrategy[MissingTranslationStrategy["Ignore"] = 2] = "Ignore";
- })(MissingTranslationStrategy || (MissingTranslationStrategy = {}));
- function makeMetadataFactory(name, props) {
- // This must be declared as a function, not a fat arrow, so that ES2015 devmode produces code
- // that works with the static_reflector.ts in the ViewEngine compiler.
- // In particular, `_registerDecoratorOrConstructor` assumes that the value returned here can be
- // new'ed.
- function factory() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var values = props ? props.apply(void 0, __spread(args)) : {};
- return __assign({ ngMetadataName: name }, values);
- }
- factory.isTypeOf = function (obj) { return obj && obj.ngMetadataName === name; };
- factory.ngMetadataName = name;
- return factory;
- }
- function parserSelectorToSimpleSelector(selector) {
- var classes = selector.classNames && selector.classNames.length ? __spread([8 /* CLASS */], selector.classNames) :
- [];
- var elementName = selector.element && selector.element !== '*' ? selector.element : '';
- return __spread([elementName], selector.attrs, classes);
- }
- function parserSelectorToNegativeSelector(selector) {
- var classes = selector.classNames && selector.classNames.length ? __spread([8 /* CLASS */], selector.classNames) :
- [];
- if (selector.element) {
- return __spread([
- 1 /* NOT */ | 4 /* ELEMENT */, selector.element
- ], selector.attrs, classes);
- }
- else if (selector.attrs.length) {
- return __spread([1 /* NOT */ | 2 /* ATTRIBUTE */], selector.attrs, classes);
- }
- else {
- return selector.classNames && selector.classNames.length ? __spread([1 /* NOT */ | 8 /* CLASS */], selector.classNames) :
- [];
- }
- }
- function parserSelectorToR3Selector(selector) {
- var positive = parserSelectorToSimpleSelector(selector);
- var negative = selector.notSelectors && selector.notSelectors.length ?
- selector.notSelectors.map(function (notSelector) { return parserSelectorToNegativeSelector(notSelector); }) :
- [];
- return positive.concat.apply(positive, __spread(negative));
- }
- function parseSelectorToR3Selector(selector) {
- return selector ? CssSelector.parse(selector).map(parserSelectorToR3Selector) : [];
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- //// Types
- var TypeModifier;
- (function (TypeModifier) {
- TypeModifier[TypeModifier["Const"] = 0] = "Const";
- })(TypeModifier || (TypeModifier = {}));
- var Type$1 = /** @class */ (function () {
- function Type(modifiers) {
- if (modifiers === void 0) { modifiers = null; }
- this.modifiers = modifiers;
- if (!modifiers) {
- this.modifiers = [];
- }
- }
- Type.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };
- return Type;
- }());
- var BuiltinTypeName;
- (function (BuiltinTypeName) {
- BuiltinTypeName[BuiltinTypeName["Dynamic"] = 0] = "Dynamic";
- BuiltinTypeName[BuiltinTypeName["Bool"] = 1] = "Bool";
- BuiltinTypeName[BuiltinTypeName["String"] = 2] = "String";
- BuiltinTypeName[BuiltinTypeName["Int"] = 3] = "Int";
- BuiltinTypeName[BuiltinTypeName["Number"] = 4] = "Number";
- BuiltinTypeName[BuiltinTypeName["Function"] = 5] = "Function";
- BuiltinTypeName[BuiltinTypeName["Inferred"] = 6] = "Inferred";
- BuiltinTypeName[BuiltinTypeName["None"] = 7] = "None";
- })(BuiltinTypeName || (BuiltinTypeName = {}));
- var BuiltinType = /** @class */ (function (_super) {
- __extends(BuiltinType, _super);
- function BuiltinType(name, modifiers) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, modifiers) || this;
- _this.name = name;
- return _this;
- }
- BuiltinType.prototype.visitType = function (visitor, context) {
- return visitor.visitBuiltinType(this, context);
- };
- return BuiltinType;
- }(Type$1));
- var ExpressionType = /** @class */ (function (_super) {
- __extends(ExpressionType, _super);
- function ExpressionType(value, modifiers, typeParams) {
- if (modifiers === void 0) { modifiers = null; }
- if (typeParams === void 0) { typeParams = null; }
- var _this = _super.call(this, modifiers) || this;
- _this.value = value;
- _this.typeParams = typeParams;
- return _this;
- }
- ExpressionType.prototype.visitType = function (visitor, context) {
- return visitor.visitExpressionType(this, context);
- };
- return ExpressionType;
- }(Type$1));
- var ArrayType = /** @class */ (function (_super) {
- __extends(ArrayType, _super);
- function ArrayType(of, modifiers) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, modifiers) || this;
- _this.of = of;
- return _this;
- }
- ArrayType.prototype.visitType = function (visitor, context) {
- return visitor.visitArrayType(this, context);
- };
- return ArrayType;
- }(Type$1));
- var MapType = /** @class */ (function (_super) {
- __extends(MapType, _super);
- function MapType(valueType, modifiers) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, modifiers) || this;
- _this.valueType = valueType || null;
- return _this;
- }
- MapType.prototype.visitType = function (visitor, context) { return visitor.visitMapType(this, context); };
- return MapType;
- }(Type$1));
- var DYNAMIC_TYPE = new BuiltinType(BuiltinTypeName.Dynamic);
- var INFERRED_TYPE = new BuiltinType(BuiltinTypeName.Inferred);
- var BOOL_TYPE = new BuiltinType(BuiltinTypeName.Bool);
- var INT_TYPE = new BuiltinType(BuiltinTypeName.Int);
- var NUMBER_TYPE = new BuiltinType(BuiltinTypeName.Number);
- var STRING_TYPE = new BuiltinType(BuiltinTypeName.String);
- var FUNCTION_TYPE = new BuiltinType(BuiltinTypeName.Function);
- var NONE_TYPE = new BuiltinType(BuiltinTypeName.None);
- ///// Expressions
- var BinaryOperator;
- (function (BinaryOperator) {
- BinaryOperator[BinaryOperator["Equals"] = 0] = "Equals";
- BinaryOperator[BinaryOperator["NotEquals"] = 1] = "NotEquals";
- BinaryOperator[BinaryOperator["Identical"] = 2] = "Identical";
- BinaryOperator[BinaryOperator["NotIdentical"] = 3] = "NotIdentical";
- BinaryOperator[BinaryOperator["Minus"] = 4] = "Minus";
- BinaryOperator[BinaryOperator["Plus"] = 5] = "Plus";
- BinaryOperator[BinaryOperator["Divide"] = 6] = "Divide";
- BinaryOperator[BinaryOperator["Multiply"] = 7] = "Multiply";
- BinaryOperator[BinaryOperator["Modulo"] = 8] = "Modulo";
- BinaryOperator[BinaryOperator["And"] = 9] = "And";
- BinaryOperator[BinaryOperator["Or"] = 10] = "Or";
- BinaryOperator[BinaryOperator["BitwiseAnd"] = 11] = "BitwiseAnd";
- BinaryOperator[BinaryOperator["Lower"] = 12] = "Lower";
- BinaryOperator[BinaryOperator["LowerEquals"] = 13] = "LowerEquals";
- BinaryOperator[BinaryOperator["Bigger"] = 14] = "Bigger";
- BinaryOperator[BinaryOperator["BiggerEquals"] = 15] = "BiggerEquals";
- })(BinaryOperator || (BinaryOperator = {}));
- function nullSafeIsEquivalent(base, other) {
- if (base == null || other == null) {
- return base == other;
- }
- return base.isEquivalent(other);
- }
- function areAllEquivalent(base, other) {
- var len = base.length;
- if (len !== other.length) {
- return false;
- }
- for (var i = 0; i < len; i++) {
- if (!base[i].isEquivalent(other[i])) {
- return false;
- }
- }
- return true;
- }
- var Expression = /** @class */ (function () {
- function Expression(type, sourceSpan) {
- this.type = type || null;
- this.sourceSpan = sourceSpan || null;
- }
- Expression.prototype.prop = function (name, sourceSpan) {
- return new ReadPropExpr(this, name, null, sourceSpan);
- };
- Expression.prototype.key = function (index, type, sourceSpan) {
- return new ReadKeyExpr(this, index, type, sourceSpan);
- };
- Expression.prototype.callMethod = function (name, params, sourceSpan) {
- return new InvokeMethodExpr(this, name, params, null, sourceSpan);
- };
- Expression.prototype.callFn = function (params, sourceSpan) {
- return new InvokeFunctionExpr(this, params, null, sourceSpan);
- };
- Expression.prototype.instantiate = function (params, type, sourceSpan) {
- return new InstantiateExpr(this, params, type, sourceSpan);
- };
- Expression.prototype.conditional = function (trueCase, falseCase, sourceSpan) {
- if (falseCase === void 0) { falseCase = null; }
- return new ConditionalExpr(this, trueCase, falseCase, null, sourceSpan);
- };
- Expression.prototype.equals = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Equals, this, rhs, null, sourceSpan);
- };
- Expression.prototype.notEquals = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.NotEquals, this, rhs, null, sourceSpan);
- };
- Expression.prototype.identical = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Identical, this, rhs, null, sourceSpan);
- };
- Expression.prototype.notIdentical = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.NotIdentical, this, rhs, null, sourceSpan);
- };
- Expression.prototype.minus = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Minus, this, rhs, null, sourceSpan);
- };
- Expression.prototype.plus = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Plus, this, rhs, null, sourceSpan);
- };
- Expression.prototype.divide = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Divide, this, rhs, null, sourceSpan);
- };
- Expression.prototype.multiply = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Multiply, this, rhs, null, sourceSpan);
- };
- Expression.prototype.modulo = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Modulo, this, rhs, null, sourceSpan);
- };
- Expression.prototype.and = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.And, this, rhs, null, sourceSpan);
- };
- Expression.prototype.bitwiseAnd = function (rhs, sourceSpan, parens) {
- if (parens === void 0) { parens = true; }
- return new BinaryOperatorExpr(BinaryOperator.BitwiseAnd, this, rhs, null, sourceSpan, parens);
- };
- Expression.prototype.or = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Or, this, rhs, null, sourceSpan);
- };
- Expression.prototype.lower = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Lower, this, rhs, null, sourceSpan);
- };
- Expression.prototype.lowerEquals = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.LowerEquals, this, rhs, null, sourceSpan);
- };
- Expression.prototype.bigger = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.Bigger, this, rhs, null, sourceSpan);
- };
- Expression.prototype.biggerEquals = function (rhs, sourceSpan) {
- return new BinaryOperatorExpr(BinaryOperator.BiggerEquals, this, rhs, null, sourceSpan);
- };
- Expression.prototype.isBlank = function (sourceSpan) {
- // Note: We use equals by purpose here to compare to null and undefined in JS.
- // We use the typed null to allow strictNullChecks to narrow types.
- return this.equals(TYPED_NULL_EXPR, sourceSpan);
- };
- Expression.prototype.cast = function (type, sourceSpan) {
- return new CastExpr(this, type, sourceSpan);
- };
- Expression.prototype.toStmt = function () { return new ExpressionStatement(this, null); };
- return Expression;
- }());
- var BuiltinVar;
- (function (BuiltinVar) {
- BuiltinVar[BuiltinVar["This"] = 0] = "This";
- BuiltinVar[BuiltinVar["Super"] = 1] = "Super";
- BuiltinVar[BuiltinVar["CatchError"] = 2] = "CatchError";
- BuiltinVar[BuiltinVar["CatchStack"] = 3] = "CatchStack";
- })(BuiltinVar || (BuiltinVar = {}));
- var ReadVarExpr = /** @class */ (function (_super) {
- __extends(ReadVarExpr, _super);
- function ReadVarExpr(name, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- if (typeof name === 'string') {
- _this.name = name;
- _this.builtin = null;
- }
- else {
- _this.name = null;
- _this.builtin = name;
- }
- return _this;
- }
- ReadVarExpr.prototype.isEquivalent = function (e) {
- return e instanceof ReadVarExpr && this.name === e.name && this.builtin === e.builtin;
- };
- ReadVarExpr.prototype.isConstant = function () { return false; };
- ReadVarExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitReadVarExpr(this, context);
- };
- ReadVarExpr.prototype.set = function (value) {
- if (!this.name) {
- throw new Error("Built in variable " + this.builtin + " can not be assigned to.");
- }
- return new WriteVarExpr(this.name, value, null, this.sourceSpan);
- };
- return ReadVarExpr;
- }(Expression));
- var TypeofExpr = /** @class */ (function (_super) {
- __extends(TypeofExpr, _super);
- function TypeofExpr(expr, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.expr = expr;
- return _this;
- }
- TypeofExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitTypeofExpr(this, context);
- };
- TypeofExpr.prototype.isEquivalent = function (e) {
- return e instanceof TypeofExpr && e.expr.isEquivalent(this.expr);
- };
- TypeofExpr.prototype.isConstant = function () { return this.expr.isConstant(); };
- return TypeofExpr;
- }(Expression));
- var WrappedNodeExpr = /** @class */ (function (_super) {
- __extends(WrappedNodeExpr, _super);
- function WrappedNodeExpr(node, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.node = node;
- return _this;
- }
- WrappedNodeExpr.prototype.isEquivalent = function (e) {
- return e instanceof WrappedNodeExpr && this.node === e.node;
- };
- WrappedNodeExpr.prototype.isConstant = function () { return false; };
- WrappedNodeExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitWrappedNodeExpr(this, context);
- };
- return WrappedNodeExpr;
- }(Expression));
- var WriteVarExpr = /** @class */ (function (_super) {
- __extends(WriteVarExpr, _super);
- function WriteVarExpr(name, value, type, sourceSpan) {
- var _this = _super.call(this, type || value.type, sourceSpan) || this;
- _this.name = name;
- _this.value = value;
- return _this;
- }
- WriteVarExpr.prototype.isEquivalent = function (e) {
- return e instanceof WriteVarExpr && this.name === e.name && this.value.isEquivalent(e.value);
- };
- WriteVarExpr.prototype.isConstant = function () { return false; };
- WriteVarExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitWriteVarExpr(this, context);
- };
- WriteVarExpr.prototype.toDeclStmt = function (type, modifiers) {
- return new DeclareVarStmt(this.name, this.value, type, modifiers, this.sourceSpan);
- };
- WriteVarExpr.prototype.toConstDecl = function () { return this.toDeclStmt(INFERRED_TYPE, [StmtModifier.Final]); };
- return WriteVarExpr;
- }(Expression));
- var WriteKeyExpr = /** @class */ (function (_super) {
- __extends(WriteKeyExpr, _super);
- function WriteKeyExpr(receiver, index, value, type, sourceSpan) {
- var _this = _super.call(this, type || value.type, sourceSpan) || this;
- _this.receiver = receiver;
- _this.index = index;
- _this.value = value;
- return _this;
- }
- WriteKeyExpr.prototype.isEquivalent = function (e) {
- return e instanceof WriteKeyExpr && this.receiver.isEquivalent(e.receiver) &&
- this.index.isEquivalent(e.index) && this.value.isEquivalent(e.value);
- };
- WriteKeyExpr.prototype.isConstant = function () { return false; };
- WriteKeyExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitWriteKeyExpr(this, context);
- };
- return WriteKeyExpr;
- }(Expression));
- var WritePropExpr = /** @class */ (function (_super) {
- __extends(WritePropExpr, _super);
- function WritePropExpr(receiver, name, value, type, sourceSpan) {
- var _this = _super.call(this, type || value.type, sourceSpan) || this;
- _this.receiver = receiver;
- _this.name = name;
- _this.value = value;
- return _this;
- }
- WritePropExpr.prototype.isEquivalent = function (e) {
- return e instanceof WritePropExpr && this.receiver.isEquivalent(e.receiver) &&
- this.name === e.name && this.value.isEquivalent(e.value);
- };
- WritePropExpr.prototype.isConstant = function () { return false; };
- WritePropExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitWritePropExpr(this, context);
- };
- return WritePropExpr;
- }(Expression));
- var BuiltinMethod;
- (function (BuiltinMethod) {
- BuiltinMethod[BuiltinMethod["ConcatArray"] = 0] = "ConcatArray";
- BuiltinMethod[BuiltinMethod["SubscribeObservable"] = 1] = "SubscribeObservable";
- BuiltinMethod[BuiltinMethod["Bind"] = 2] = "Bind";
- })(BuiltinMethod || (BuiltinMethod = {}));
- var InvokeMethodExpr = /** @class */ (function (_super) {
- __extends(InvokeMethodExpr, _super);
- function InvokeMethodExpr(receiver, method, args, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.receiver = receiver;
- _this.args = args;
- if (typeof method === 'string') {
- _this.name = method;
- _this.builtin = null;
- }
- else {
- _this.name = null;
- _this.builtin = method;
- }
- return _this;
- }
- InvokeMethodExpr.prototype.isEquivalent = function (e) {
- return e instanceof InvokeMethodExpr && this.receiver.isEquivalent(e.receiver) &&
- this.name === e.name && this.builtin === e.builtin && areAllEquivalent(this.args, e.args);
- };
- InvokeMethodExpr.prototype.isConstant = function () { return false; };
- InvokeMethodExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitInvokeMethodExpr(this, context);
- };
- return InvokeMethodExpr;
- }(Expression));
- var InvokeFunctionExpr = /** @class */ (function (_super) {
- __extends(InvokeFunctionExpr, _super);
- function InvokeFunctionExpr(fn, args, type, sourceSpan, pure) {
- if (pure === void 0) { pure = false; }
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.fn = fn;
- _this.args = args;
- _this.pure = pure;
- return _this;
- }
- InvokeFunctionExpr.prototype.isEquivalent = function (e) {
- return e instanceof InvokeFunctionExpr && this.fn.isEquivalent(e.fn) &&
- areAllEquivalent(this.args, e.args) && this.pure === e.pure;
- };
- InvokeFunctionExpr.prototype.isConstant = function () { return false; };
- InvokeFunctionExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitInvokeFunctionExpr(this, context);
- };
- return InvokeFunctionExpr;
- }(Expression));
- var InstantiateExpr = /** @class */ (function (_super) {
- __extends(InstantiateExpr, _super);
- function InstantiateExpr(classExpr, args, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.classExpr = classExpr;
- _this.args = args;
- return _this;
- }
- InstantiateExpr.prototype.isEquivalent = function (e) {
- return e instanceof InstantiateExpr && this.classExpr.isEquivalent(e.classExpr) &&
- areAllEquivalent(this.args, e.args);
- };
- InstantiateExpr.prototype.isConstant = function () { return false; };
- InstantiateExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitInstantiateExpr(this, context);
- };
- return InstantiateExpr;
- }(Expression));
- var LiteralExpr = /** @class */ (function (_super) {
- __extends(LiteralExpr, _super);
- function LiteralExpr(value, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.value = value;
- return _this;
- }
- LiteralExpr.prototype.isEquivalent = function (e) {
- return e instanceof LiteralExpr && this.value === e.value;
- };
- LiteralExpr.prototype.isConstant = function () { return true; };
- LiteralExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitLiteralExpr(this, context);
- };
- return LiteralExpr;
- }(Expression));
- var ExternalExpr = /** @class */ (function (_super) {
- __extends(ExternalExpr, _super);
- function ExternalExpr(value, type, typeParams, sourceSpan) {
- if (typeParams === void 0) { typeParams = null; }
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.value = value;
- _this.typeParams = typeParams;
- return _this;
- }
- ExternalExpr.prototype.isEquivalent = function (e) {
- return e instanceof ExternalExpr && this.value.name === e.value.name &&
- this.value.moduleName === e.value.moduleName && this.value.runtime === e.value.runtime;
- };
- ExternalExpr.prototype.isConstant = function () { return false; };
- ExternalExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitExternalExpr(this, context);
- };
- return ExternalExpr;
- }(Expression));
- var ConditionalExpr = /** @class */ (function (_super) {
- __extends(ConditionalExpr, _super);
- function ConditionalExpr(condition, trueCase, falseCase, type, sourceSpan) {
- if (falseCase === void 0) { falseCase = null; }
- var _this = _super.call(this, type || trueCase.type, sourceSpan) || this;
- _this.condition = condition;
- _this.falseCase = falseCase;
- _this.trueCase = trueCase;
- return _this;
- }
- ConditionalExpr.prototype.isEquivalent = function (e) {
- return e instanceof ConditionalExpr && this.condition.isEquivalent(e.condition) &&
- this.trueCase.isEquivalent(e.trueCase) && nullSafeIsEquivalent(this.falseCase, e.falseCase);
- };
- ConditionalExpr.prototype.isConstant = function () { return false; };
- ConditionalExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitConditionalExpr(this, context);
- };
- return ConditionalExpr;
- }(Expression));
- var NotExpr = /** @class */ (function (_super) {
- __extends(NotExpr, _super);
- function NotExpr(condition, sourceSpan) {
- var _this = _super.call(this, BOOL_TYPE, sourceSpan) || this;
- _this.condition = condition;
- return _this;
- }
- NotExpr.prototype.isEquivalent = function (e) {
- return e instanceof NotExpr && this.condition.isEquivalent(e.condition);
- };
- NotExpr.prototype.isConstant = function () { return false; };
- NotExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitNotExpr(this, context);
- };
- return NotExpr;
- }(Expression));
- var AssertNotNull = /** @class */ (function (_super) {
- __extends(AssertNotNull, _super);
- function AssertNotNull(condition, sourceSpan) {
- var _this = _super.call(this, condition.type, sourceSpan) || this;
- _this.condition = condition;
- return _this;
- }
- AssertNotNull.prototype.isEquivalent = function (e) {
- return e instanceof AssertNotNull && this.condition.isEquivalent(e.condition);
- };
- AssertNotNull.prototype.isConstant = function () { return false; };
- AssertNotNull.prototype.visitExpression = function (visitor, context) {
- return visitor.visitAssertNotNullExpr(this, context);
- };
- return AssertNotNull;
- }(Expression));
- var CastExpr = /** @class */ (function (_super) {
- __extends(CastExpr, _super);
- function CastExpr(value, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.value = value;
- return _this;
- }
- CastExpr.prototype.isEquivalent = function (e) {
- return e instanceof CastExpr && this.value.isEquivalent(e.value);
- };
- CastExpr.prototype.isConstant = function () { return false; };
- CastExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitCastExpr(this, context);
- };
- return CastExpr;
- }(Expression));
- var FnParam = /** @class */ (function () {
- function FnParam(name, type) {
- if (type === void 0) { type = null; }
- this.name = name;
- this.type = type;
- }
- FnParam.prototype.isEquivalent = function (param) { return this.name === param.name; };
- return FnParam;
- }());
- var FunctionExpr = /** @class */ (function (_super) {
- __extends(FunctionExpr, _super);
- function FunctionExpr(params, statements, type, sourceSpan, name) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.params = params;
- _this.statements = statements;
- _this.name = name;
- return _this;
- }
- FunctionExpr.prototype.isEquivalent = function (e) {
- return e instanceof FunctionExpr && areAllEquivalent(this.params, e.params) &&
- areAllEquivalent(this.statements, e.statements);
- };
- FunctionExpr.prototype.isConstant = function () { return false; };
- FunctionExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitFunctionExpr(this, context);
- };
- FunctionExpr.prototype.toDeclStmt = function (name, modifiers) {
- if (modifiers === void 0) { modifiers = null; }
- return new DeclareFunctionStmt(name, this.params, this.statements, this.type, modifiers, this.sourceSpan);
- };
- return FunctionExpr;
- }(Expression));
- var BinaryOperatorExpr = /** @class */ (function (_super) {
- __extends(BinaryOperatorExpr, _super);
- function BinaryOperatorExpr(operator, lhs, rhs, type, sourceSpan, parens) {
- if (parens === void 0) { parens = true; }
- var _this = _super.call(this, type || lhs.type, sourceSpan) || this;
- _this.operator = operator;
- _this.rhs = rhs;
- _this.parens = parens;
- _this.lhs = lhs;
- return _this;
- }
- BinaryOperatorExpr.prototype.isEquivalent = function (e) {
- return e instanceof BinaryOperatorExpr && this.operator === e.operator &&
- this.lhs.isEquivalent(e.lhs) && this.rhs.isEquivalent(e.rhs);
- };
- BinaryOperatorExpr.prototype.isConstant = function () { return false; };
- BinaryOperatorExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitBinaryOperatorExpr(this, context);
- };
- return BinaryOperatorExpr;
- }(Expression));
- var ReadPropExpr = /** @class */ (function (_super) {
- __extends(ReadPropExpr, _super);
- function ReadPropExpr(receiver, name, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.receiver = receiver;
- _this.name = name;
- return _this;
- }
- ReadPropExpr.prototype.isEquivalent = function (e) {
- return e instanceof ReadPropExpr && this.receiver.isEquivalent(e.receiver) &&
- this.name === e.name;
- };
- ReadPropExpr.prototype.isConstant = function () { return false; };
- ReadPropExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitReadPropExpr(this, context);
- };
- ReadPropExpr.prototype.set = function (value) {
- return new WritePropExpr(this.receiver, this.name, value, null, this.sourceSpan);
- };
- return ReadPropExpr;
- }(Expression));
- var ReadKeyExpr = /** @class */ (function (_super) {
- __extends(ReadKeyExpr, _super);
- function ReadKeyExpr(receiver, index, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.receiver = receiver;
- _this.index = index;
- return _this;
- }
- ReadKeyExpr.prototype.isEquivalent = function (e) {
- return e instanceof ReadKeyExpr && this.receiver.isEquivalent(e.receiver) &&
- this.index.isEquivalent(e.index);
- };
- ReadKeyExpr.prototype.isConstant = function () { return false; };
- ReadKeyExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitReadKeyExpr(this, context);
- };
- ReadKeyExpr.prototype.set = function (value) {
- return new WriteKeyExpr(this.receiver, this.index, value, null, this.sourceSpan);
- };
- return ReadKeyExpr;
- }(Expression));
- var LiteralArrayExpr = /** @class */ (function (_super) {
- __extends(LiteralArrayExpr, _super);
- function LiteralArrayExpr(entries, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.entries = entries;
- return _this;
- }
- LiteralArrayExpr.prototype.isConstant = function () { return this.entries.every(function (e) { return e.isConstant(); }); };
- LiteralArrayExpr.prototype.isEquivalent = function (e) {
- return e instanceof LiteralArrayExpr && areAllEquivalent(this.entries, e.entries);
- };
- LiteralArrayExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitLiteralArrayExpr(this, context);
- };
- return LiteralArrayExpr;
- }(Expression));
- var LiteralMapEntry = /** @class */ (function () {
- function LiteralMapEntry(key, value, quoted) {
- this.key = key;
- this.value = value;
- this.quoted = quoted;
- }
- LiteralMapEntry.prototype.isEquivalent = function (e) {
- return this.key === e.key && this.value.isEquivalent(e.value);
- };
- return LiteralMapEntry;
- }());
- var LiteralMapExpr = /** @class */ (function (_super) {
- __extends(LiteralMapExpr, _super);
- function LiteralMapExpr(entries, type, sourceSpan) {
- var _this = _super.call(this, type, sourceSpan) || this;
- _this.entries = entries;
- _this.valueType = null;
- if (type) {
- _this.valueType = type.valueType;
- }
- return _this;
- }
- LiteralMapExpr.prototype.isEquivalent = function (e) {
- return e instanceof LiteralMapExpr && areAllEquivalent(this.entries, e.entries);
- };
- LiteralMapExpr.prototype.isConstant = function () { return this.entries.every(function (e) { return e.value.isConstant(); }); };
- LiteralMapExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitLiteralMapExpr(this, context);
- };
- return LiteralMapExpr;
- }(Expression));
- var CommaExpr = /** @class */ (function (_super) {
- __extends(CommaExpr, _super);
- function CommaExpr(parts, sourceSpan) {
- var _this = _super.call(this, parts[parts.length - 1].type, sourceSpan) || this;
- _this.parts = parts;
- return _this;
- }
- CommaExpr.prototype.isEquivalent = function (e) {
- return e instanceof CommaExpr && areAllEquivalent(this.parts, e.parts);
- };
- CommaExpr.prototype.isConstant = function () { return false; };
- CommaExpr.prototype.visitExpression = function (visitor, context) {
- return visitor.visitCommaExpr(this, context);
- };
- return CommaExpr;
- }(Expression));
- var THIS_EXPR = new ReadVarExpr(BuiltinVar.This, null, null);
- var SUPER_EXPR = new ReadVarExpr(BuiltinVar.Super, null, null);
- var CATCH_ERROR_VAR = new ReadVarExpr(BuiltinVar.CatchError, null, null);
- var CATCH_STACK_VAR = new ReadVarExpr(BuiltinVar.CatchStack, null, null);
- var NULL_EXPR = new LiteralExpr(null, null, null);
- var TYPED_NULL_EXPR = new LiteralExpr(null, INFERRED_TYPE, null);
- //// Statements
- var StmtModifier;
- (function (StmtModifier) {
- StmtModifier[StmtModifier["Final"] = 0] = "Final";
- StmtModifier[StmtModifier["Private"] = 1] = "Private";
- StmtModifier[StmtModifier["Exported"] = 2] = "Exported";
- StmtModifier[StmtModifier["Static"] = 3] = "Static";
- })(StmtModifier || (StmtModifier = {}));
- var Statement = /** @class */ (function () {
- function Statement(modifiers, sourceSpan) {
- this.modifiers = modifiers || [];
- this.sourceSpan = sourceSpan || null;
- }
- Statement.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };
- return Statement;
- }());
- var DeclareVarStmt = /** @class */ (function (_super) {
- __extends(DeclareVarStmt, _super);
- function DeclareVarStmt(name, value, type, modifiers, sourceSpan) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, modifiers, sourceSpan) || this;
- _this.name = name;
- _this.value = value;
- _this.type = type || (value && value.type) || null;
- return _this;
- }
- DeclareVarStmt.prototype.isEquivalent = function (stmt) {
- return stmt instanceof DeclareVarStmt && this.name === stmt.name &&
- (this.value ? !!stmt.value && this.value.isEquivalent(stmt.value) : !stmt.value);
- };
- DeclareVarStmt.prototype.visitStatement = function (visitor, context) {
- return visitor.visitDeclareVarStmt(this, context);
- };
- return DeclareVarStmt;
- }(Statement));
- var DeclareFunctionStmt = /** @class */ (function (_super) {
- __extends(DeclareFunctionStmt, _super);
- function DeclareFunctionStmt(name, params, statements, type, modifiers, sourceSpan) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, modifiers, sourceSpan) || this;
- _this.name = name;
- _this.params = params;
- _this.statements = statements;
- _this.type = type || null;
- return _this;
- }
- DeclareFunctionStmt.prototype.isEquivalent = function (stmt) {
- return stmt instanceof DeclareFunctionStmt && areAllEquivalent(this.params, stmt.params) &&
- areAllEquivalent(this.statements, stmt.statements);
- };
- DeclareFunctionStmt.prototype.visitStatement = function (visitor, context) {
- return visitor.visitDeclareFunctionStmt(this, context);
- };
- return DeclareFunctionStmt;
- }(Statement));
- var ExpressionStatement = /** @class */ (function (_super) {
- __extends(ExpressionStatement, _super);
- function ExpressionStatement(expr, sourceSpan) {
- var _this = _super.call(this, null, sourceSpan) || this;
- _this.expr = expr;
- return _this;
- }
- ExpressionStatement.prototype.isEquivalent = function (stmt) {
- return stmt instanceof ExpressionStatement && this.expr.isEquivalent(stmt.expr);
- };
- ExpressionStatement.prototype.visitStatement = function (visitor, context) {
- return visitor.visitExpressionStmt(this, context);
- };
- return ExpressionStatement;
- }(Statement));
- var ReturnStatement = /** @class */ (function (_super) {
- __extends(ReturnStatement, _super);
- function ReturnStatement(value, sourceSpan) {
- var _this = _super.call(this, null, sourceSpan) || this;
- _this.value = value;
- return _this;
- }
- ReturnStatement.prototype.isEquivalent = function (stmt) {
- return stmt instanceof ReturnStatement && this.value.isEquivalent(stmt.value);
- };
- ReturnStatement.prototype.visitStatement = function (visitor, context) {
- return visitor.visitReturnStmt(this, context);
- };
- return ReturnStatement;
- }(Statement));
- var AbstractClassPart = /** @class */ (function () {
- function AbstractClassPart(type, modifiers) {
- this.modifiers = modifiers;
- if (!modifiers) {
- this.modifiers = [];
- }
- this.type = type || null;
- }
- AbstractClassPart.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };
- return AbstractClassPart;
- }());
- var ClassField = /** @class */ (function (_super) {
- __extends(ClassField, _super);
- function ClassField(name, type, modifiers, initializer) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, type, modifiers) || this;
- _this.name = name;
- _this.initializer = initializer;
- return _this;
- }
- ClassField.prototype.isEquivalent = function (f) { return this.name === f.name; };
- return ClassField;
- }(AbstractClassPart));
- var ClassMethod = /** @class */ (function (_super) {
- __extends(ClassMethod, _super);
- function ClassMethod(name, params, body, type, modifiers) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, type, modifiers) || this;
- _this.name = name;
- _this.params = params;
- _this.body = body;
- return _this;
- }
- ClassMethod.prototype.isEquivalent = function (m) {
- return this.name === m.name && areAllEquivalent(this.body, m.body);
- };
- return ClassMethod;
- }(AbstractClassPart));
- var ClassGetter = /** @class */ (function (_super) {
- __extends(ClassGetter, _super);
- function ClassGetter(name, body, type, modifiers) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, type, modifiers) || this;
- _this.name = name;
- _this.body = body;
- return _this;
- }
- ClassGetter.prototype.isEquivalent = function (m) {
- return this.name === m.name && areAllEquivalent(this.body, m.body);
- };
- return ClassGetter;
- }(AbstractClassPart));
- var ClassStmt = /** @class */ (function (_super) {
- __extends(ClassStmt, _super);
- function ClassStmt(name, parent, fields, getters, constructorMethod, methods, modifiers, sourceSpan) {
- if (modifiers === void 0) { modifiers = null; }
- var _this = _super.call(this, modifiers, sourceSpan) || this;
- _this.name = name;
- _this.parent = parent;
- _this.fields = fields;
- _this.getters = getters;
- _this.constructorMethod = constructorMethod;
- _this.methods = methods;
- return _this;
- }
- ClassStmt.prototype.isEquivalent = function (stmt) {
- return stmt instanceof ClassStmt && this.name === stmt.name &&
- nullSafeIsEquivalent(this.parent, stmt.parent) &&
- areAllEquivalent(this.fields, stmt.fields) &&
- areAllEquivalent(this.getters, stmt.getters) &&
- this.constructorMethod.isEquivalent(stmt.constructorMethod) &&
- areAllEquivalent(this.methods, stmt.methods);
- };
- ClassStmt.prototype.visitStatement = function (visitor, context) {
- return visitor.visitDeclareClassStmt(this, context);
- };
- return ClassStmt;
- }(Statement));
- var IfStmt = /** @class */ (function (_super) {
- __extends(IfStmt, _super);
- function IfStmt(condition, trueCase, falseCase, sourceSpan) {
- if (falseCase === void 0) { falseCase = []; }
- var _this = _super.call(this, null, sourceSpan) || this;
- _this.condition = condition;
- _this.trueCase = trueCase;
- _this.falseCase = falseCase;
- return _this;
- }
- IfStmt.prototype.isEquivalent = function (stmt) {
- return stmt instanceof IfStmt && this.condition.isEquivalent(stmt.condition) &&
- areAllEquivalent(this.trueCase, stmt.trueCase) &&
- areAllEquivalent(this.falseCase, stmt.falseCase);
- };
- IfStmt.prototype.visitStatement = function (visitor, context) {
- return visitor.visitIfStmt(this, context);
- };
- return IfStmt;
- }(Statement));
- var CommentStmt = /** @class */ (function (_super) {
- __extends(CommentStmt, _super);
- function CommentStmt(comment, multiline, sourceSpan) {
- if (multiline === void 0) { multiline = false; }
- var _this = _super.call(this, null, sourceSpan) || this;
- _this.comment = comment;
- _this.multiline = multiline;
- return _this;
- }
- CommentStmt.prototype.isEquivalent = function (stmt) { return stmt instanceof CommentStmt; };
- CommentStmt.prototype.visitStatement = function (visitor, context) {
- return visitor.visitCommentStmt(this, context);
- };
- return CommentStmt;
- }(Statement));
- var JSDocCommentStmt = /** @class */ (function (_super) {
- __extends(JSDocCommentStmt, _super);
- function JSDocCommentStmt(tags, sourceSpan) {
- if (tags === void 0) { tags = []; }
- var _this = _super.call(this, null, sourceSpan) || this;
- _this.tags = tags;
- return _this;
- }
- JSDocCommentStmt.prototype.isEquivalent = function (stmt) {
- return stmt instanceof JSDocCommentStmt && this.toString() === stmt.toString();
- };
- JSDocCommentStmt.prototype.visitStatement = function (visitor, context) {
- return visitor.visitJSDocCommentStmt(this, context);
- };
- JSDocCommentStmt.prototype.toString = function () { return serializeTags(this.tags); };
- return JSDocCommentStmt;
- }(Statement));
- var TryCatchStmt = /** @class */ (function (_super) {
- __extends(TryCatchStmt, _super);
- function TryCatchStmt(bodyStmts, catchStmts, sourceSpan) {
- var _this = _super.call(this, null, sourceSpan) || this;
- _this.bodyStmts = bodyStmts;
- _this.catchStmts = catchStmts;
- return _this;
- }
- TryCatchStmt.prototype.isEquivalent = function (stmt) {
- return stmt instanceof TryCatchStmt && areAllEquivalent(this.bodyStmts, stmt.bodyStmts) &&
- areAllEquivalent(this.catchStmts, stmt.catchStmts);
- };
- TryCatchStmt.prototype.visitStatement = function (visitor, context) {
- return visitor.visitTryCatchStmt(this, context);
- };
- return TryCatchStmt;
- }(Statement));
- var ThrowStmt = /** @class */ (function (_super) {
- __extends(ThrowStmt, _super);
- function ThrowStmt(error, sourceSpan) {
- var _this = _super.call(this, null, sourceSpan) || this;
- _this.error = error;
- return _this;
- }
- ThrowStmt.prototype.isEquivalent = function (stmt) {
- return stmt instanceof TryCatchStmt && this.error.isEquivalent(stmt.error);
- };
- ThrowStmt.prototype.visitStatement = function (visitor, context) {
- return visitor.visitThrowStmt(this, context);
- };
- return ThrowStmt;
- }(Statement));
- var AstTransformer = /** @class */ (function () {
- function AstTransformer() {
- }
- AstTransformer.prototype.transformExpr = function (expr, context) { return expr; };
- AstTransformer.prototype.transformStmt = function (stmt, context) { return stmt; };
- AstTransformer.prototype.visitReadVarExpr = function (ast, context) { return this.transformExpr(ast, context); };
- AstTransformer.prototype.visitWrappedNodeExpr = function (ast, context) {
- return this.transformExpr(ast, context);
- };
- AstTransformer.prototype.visitTypeofExpr = function (expr, context) {
- return this.transformExpr(new TypeofExpr(expr.expr.visitExpression(this, context), expr.type, expr.sourceSpan), context);
- };
- AstTransformer.prototype.visitWriteVarExpr = function (expr, context) {
- return this.transformExpr(new WriteVarExpr(expr.name, expr.value.visitExpression(this, context), expr.type, expr.sourceSpan), context);
- };
- AstTransformer.prototype.visitWriteKeyExpr = function (expr, context) {
- return this.transformExpr(new WriteKeyExpr(expr.receiver.visitExpression(this, context), expr.index.visitExpression(this, context), expr.value.visitExpression(this, context), expr.type, expr.sourceSpan), context);
- };
- AstTransformer.prototype.visitWritePropExpr = function (expr, context) {
- return this.transformExpr(new WritePropExpr(expr.receiver.visitExpression(this, context), expr.name, expr.value.visitExpression(this, context), expr.type, expr.sourceSpan), context);
- };
- AstTransformer.prototype.visitInvokeMethodExpr = function (ast, context) {
- var method = ast.builtin || ast.name;
- return this.transformExpr(new InvokeMethodExpr(ast.receiver.visitExpression(this, context), method, this.visitAllExpressions(ast.args, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitInvokeFunctionExpr = function (ast, context) {
- return this.transformExpr(new InvokeFunctionExpr(ast.fn.visitExpression(this, context), this.visitAllExpressions(ast.args, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitInstantiateExpr = function (ast, context) {
- return this.transformExpr(new InstantiateExpr(ast.classExpr.visitExpression(this, context), this.visitAllExpressions(ast.args, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitLiteralExpr = function (ast, context) { return this.transformExpr(ast, context); };
- AstTransformer.prototype.visitExternalExpr = function (ast, context) {
- return this.transformExpr(ast, context);
- };
- AstTransformer.prototype.visitConditionalExpr = function (ast, context) {
- return this.transformExpr(new ConditionalExpr(ast.condition.visitExpression(this, context), ast.trueCase.visitExpression(this, context), ast.falseCase.visitExpression(this, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitNotExpr = function (ast, context) {
- return this.transformExpr(new NotExpr(ast.condition.visitExpression(this, context), ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitAssertNotNullExpr = function (ast, context) {
- return this.transformExpr(new AssertNotNull(ast.condition.visitExpression(this, context), ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitCastExpr = function (ast, context) {
- return this.transformExpr(new CastExpr(ast.value.visitExpression(this, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitFunctionExpr = function (ast, context) {
- return this.transformExpr(new FunctionExpr(ast.params, this.visitAllStatements(ast.statements, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitBinaryOperatorExpr = function (ast, context) {
- return this.transformExpr(new BinaryOperatorExpr(ast.operator, ast.lhs.visitExpression(this, context), ast.rhs.visitExpression(this, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitReadPropExpr = function (ast, context) {
- return this.transformExpr(new ReadPropExpr(ast.receiver.visitExpression(this, context), ast.name, ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitReadKeyExpr = function (ast, context) {
- return this.transformExpr(new ReadKeyExpr(ast.receiver.visitExpression(this, context), ast.index.visitExpression(this, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitLiteralArrayExpr = function (ast, context) {
- return this.transformExpr(new LiteralArrayExpr(this.visitAllExpressions(ast.entries, context), ast.type, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitLiteralMapExpr = function (ast, context) {
- var _this = this;
- var entries = ast.entries.map(function (entry) { return new LiteralMapEntry(entry.key, entry.value.visitExpression(_this, context), entry.quoted); });
- var mapType = new MapType(ast.valueType, null);
- return this.transformExpr(new LiteralMapExpr(entries, mapType, ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitCommaExpr = function (ast, context) {
- return this.transformExpr(new CommaExpr(this.visitAllExpressions(ast.parts, context), ast.sourceSpan), context);
- };
- AstTransformer.prototype.visitAllExpressions = function (exprs, context) {
- var _this = this;
- return exprs.map(function (expr) { return expr.visitExpression(_this, context); });
- };
- AstTransformer.prototype.visitDeclareVarStmt = function (stmt, context) {
- var value = stmt.value && stmt.value.visitExpression(this, context);
- return this.transformStmt(new DeclareVarStmt(stmt.name, value, stmt.type, stmt.modifiers, stmt.sourceSpan), context);
- };
- AstTransformer.prototype.visitDeclareFunctionStmt = function (stmt, context) {
- return this.transformStmt(new DeclareFunctionStmt(stmt.name, stmt.params, this.visitAllStatements(stmt.statements, context), stmt.type, stmt.modifiers, stmt.sourceSpan), context);
- };
- AstTransformer.prototype.visitExpressionStmt = function (stmt, context) {
- return this.transformStmt(new ExpressionStatement(stmt.expr.visitExpression(this, context), stmt.sourceSpan), context);
- };
- AstTransformer.prototype.visitReturnStmt = function (stmt, context) {
- return this.transformStmt(new ReturnStatement(stmt.value.visitExpression(this, context), stmt.sourceSpan), context);
- };
- AstTransformer.prototype.visitDeclareClassStmt = function (stmt, context) {
- var _this = this;
- var parent = stmt.parent.visitExpression(this, context);
- var getters = stmt.getters.map(function (getter) { return new ClassGetter(getter.name, _this.visitAllStatements(getter.body, context), getter.type, getter.modifiers); });
- var ctorMethod = stmt.constructorMethod &&
- new ClassMethod(stmt.constructorMethod.name, stmt.constructorMethod.params, this.visitAllStatements(stmt.constructorMethod.body, context), stmt.constructorMethod.type, stmt.constructorMethod.modifiers);
- var methods = stmt.methods.map(function (method) { return new ClassMethod(method.name, method.params, _this.visitAllStatements(method.body, context), method.type, method.modifiers); });
- return this.transformStmt(new ClassStmt(stmt.name, parent, stmt.fields, getters, ctorMethod, methods, stmt.modifiers, stmt.sourceSpan), context);
- };
- AstTransformer.prototype.visitIfStmt = function (stmt, context) {
- return this.transformStmt(new IfStmt(stmt.condition.visitExpression(this, context), this.visitAllStatements(stmt.trueCase, context), this.visitAllStatements(stmt.falseCase, context), stmt.sourceSpan), context);
- };
- AstTransformer.prototype.visitTryCatchStmt = function (stmt, context) {
- return this.transformStmt(new TryCatchStmt(this.visitAllStatements(stmt.bodyStmts, context), this.visitAllStatements(stmt.catchStmts, context), stmt.sourceSpan), context);
- };
- AstTransformer.prototype.visitThrowStmt = function (stmt, context) {
- return this.transformStmt(new ThrowStmt(stmt.error.visitExpression(this, context), stmt.sourceSpan), context);
- };
- AstTransformer.prototype.visitCommentStmt = function (stmt, context) {
- return this.transformStmt(stmt, context);
- };
- AstTransformer.prototype.visitJSDocCommentStmt = function (stmt, context) {
- return this.transformStmt(stmt, context);
- };
- AstTransformer.prototype.visitAllStatements = function (stmts, context) {
- var _this = this;
- return stmts.map(function (stmt) { return stmt.visitStatement(_this, context); });
- };
- return AstTransformer;
- }());
- var RecursiveAstVisitor = /** @class */ (function () {
- function RecursiveAstVisitor() {
- }
- RecursiveAstVisitor.prototype.visitType = function (ast, context) { return ast; };
- RecursiveAstVisitor.prototype.visitExpression = function (ast, context) {
- if (ast.type) {
- ast.type.visitType(this, context);
- }
- return ast;
- };
- RecursiveAstVisitor.prototype.visitBuiltinType = function (type, context) { return this.visitType(type, context); };
- RecursiveAstVisitor.prototype.visitExpressionType = function (type, context) {
- var _this = this;
- type.value.visitExpression(this, context);
- if (type.typeParams !== null) {
- type.typeParams.forEach(function (param) { return _this.visitType(param, context); });
- }
- return this.visitType(type, context);
- };
- RecursiveAstVisitor.prototype.visitArrayType = function (type, context) { return this.visitType(type, context); };
- RecursiveAstVisitor.prototype.visitMapType = function (type, context) { return this.visitType(type, context); };
- RecursiveAstVisitor.prototype.visitWrappedNodeExpr = function (ast, context) { return ast; };
- RecursiveAstVisitor.prototype.visitTypeofExpr = function (ast, context) { return this.visitExpression(ast, context); };
- RecursiveAstVisitor.prototype.visitReadVarExpr = function (ast, context) {
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitWriteVarExpr = function (ast, context) {
- ast.value.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitWriteKeyExpr = function (ast, context) {
- ast.receiver.visitExpression(this, context);
- ast.index.visitExpression(this, context);
- ast.value.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitWritePropExpr = function (ast, context) {
- ast.receiver.visitExpression(this, context);
- ast.value.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitInvokeMethodExpr = function (ast, context) {
- ast.receiver.visitExpression(this, context);
- this.visitAllExpressions(ast.args, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitInvokeFunctionExpr = function (ast, context) {
- ast.fn.visitExpression(this, context);
- this.visitAllExpressions(ast.args, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitInstantiateExpr = function (ast, context) {
- ast.classExpr.visitExpression(this, context);
- this.visitAllExpressions(ast.args, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitLiteralExpr = function (ast, context) {
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitExternalExpr = function (ast, context) {
- var _this = this;
- if (ast.typeParams) {
- ast.typeParams.forEach(function (type) { return type.visitType(_this, context); });
- }
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitConditionalExpr = function (ast, context) {
- ast.condition.visitExpression(this, context);
- ast.trueCase.visitExpression(this, context);
- ast.falseCase.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitNotExpr = function (ast, context) {
- ast.condition.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitAssertNotNullExpr = function (ast, context) {
- ast.condition.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitCastExpr = function (ast, context) {
- ast.value.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitFunctionExpr = function (ast, context) {
- this.visitAllStatements(ast.statements, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitBinaryOperatorExpr = function (ast, context) {
- ast.lhs.visitExpression(this, context);
- ast.rhs.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitReadPropExpr = function (ast, context) {
- ast.receiver.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitReadKeyExpr = function (ast, context) {
- ast.receiver.visitExpression(this, context);
- ast.index.visitExpression(this, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitLiteralArrayExpr = function (ast, context) {
- this.visitAllExpressions(ast.entries, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitLiteralMapExpr = function (ast, context) {
- var _this = this;
- ast.entries.forEach(function (entry) { return entry.value.visitExpression(_this, context); });
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitCommaExpr = function (ast, context) {
- this.visitAllExpressions(ast.parts, context);
- return this.visitExpression(ast, context);
- };
- RecursiveAstVisitor.prototype.visitAllExpressions = function (exprs, context) {
- var _this = this;
- exprs.forEach(function (expr) { return expr.visitExpression(_this, context); });
- };
- RecursiveAstVisitor.prototype.visitDeclareVarStmt = function (stmt, context) {
- if (stmt.value) {
- stmt.value.visitExpression(this, context);
- }
- if (stmt.type) {
- stmt.type.visitType(this, context);
- }
- return stmt;
- };
- RecursiveAstVisitor.prototype.visitDeclareFunctionStmt = function (stmt, context) {
- this.visitAllStatements(stmt.statements, context);
- if (stmt.type) {
- stmt.type.visitType(this, context);
- }
- return stmt;
- };
- RecursiveAstVisitor.prototype.visitExpressionStmt = function (stmt, context) {
- stmt.expr.visitExpression(this, context);
- return stmt;
- };
- RecursiveAstVisitor.prototype.visitReturnStmt = function (stmt, context) {
- stmt.value.visitExpression(this, context);
- return stmt;
- };
- RecursiveAstVisitor.prototype.visitDeclareClassStmt = function (stmt, context) {
- var _this = this;
- stmt.parent.visitExpression(this, context);
- stmt.getters.forEach(function (getter) { return _this.visitAllStatements(getter.body, context); });
- if (stmt.constructorMethod) {
- this.visitAllStatements(stmt.constructorMethod.body, context);
- }
- stmt.methods.forEach(function (method) { return _this.visitAllStatements(method.body, context); });
- return stmt;
- };
- RecursiveAstVisitor.prototype.visitIfStmt = function (stmt, context) {
- stmt.condition.visitExpression(this, context);
- this.visitAllStatements(stmt.trueCase, context);
- this.visitAllStatements(stmt.falseCase, context);
- return stmt;
- };
- RecursiveAstVisitor.prototype.visitTryCatchStmt = function (stmt, context) {
- this.visitAllStatements(stmt.bodyStmts, context);
- this.visitAllStatements(stmt.catchStmts, context);
- return stmt;
- };
- RecursiveAstVisitor.prototype.visitThrowStmt = function (stmt, context) {
- stmt.error.visitExpression(this, context);
- return stmt;
- };
- RecursiveAstVisitor.prototype.visitCommentStmt = function (stmt, context) { return stmt; };
- RecursiveAstVisitor.prototype.visitJSDocCommentStmt = function (stmt, context) { return stmt; };
- RecursiveAstVisitor.prototype.visitAllStatements = function (stmts, context) {
- var _this = this;
- stmts.forEach(function (stmt) { return stmt.visitStatement(_this, context); });
- };
- return RecursiveAstVisitor;
- }());
- var _ReadVarVisitor = /** @class */ (function (_super) {
- __extends(_ReadVarVisitor, _super);
- function _ReadVarVisitor() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.varNames = new Set();
- return _this;
- }
- _ReadVarVisitor.prototype.visitDeclareFunctionStmt = function (stmt, context) {
- // Don't descend into nested functions
- return stmt;
- };
- _ReadVarVisitor.prototype.visitDeclareClassStmt = function (stmt, context) {
- // Don't descend into nested classes
- return stmt;
- };
- _ReadVarVisitor.prototype.visitReadVarExpr = function (ast, context) {
- if (ast.name) {
- this.varNames.add(ast.name);
- }
- return null;
- };
- return _ReadVarVisitor;
- }(RecursiveAstVisitor));
- var _FindExternalReferencesVisitor = /** @class */ (function (_super) {
- __extends(_FindExternalReferencesVisitor, _super);
- function _FindExternalReferencesVisitor() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.externalReferences = [];
- return _this;
- }
- _FindExternalReferencesVisitor.prototype.visitExternalExpr = function (e, context) {
- this.externalReferences.push(e.value);
- return _super.prototype.visitExternalExpr.call(this, e, context);
- };
- return _FindExternalReferencesVisitor;
- }(RecursiveAstVisitor));
- var _ApplySourceSpanTransformer = /** @class */ (function (_super) {
- __extends(_ApplySourceSpanTransformer, _super);
- function _ApplySourceSpanTransformer(sourceSpan) {
- var _this = _super.call(this) || this;
- _this.sourceSpan = sourceSpan;
- return _this;
- }
- _ApplySourceSpanTransformer.prototype._clone = function (obj) {
- var e_1, _a;
- var clone = Object.create(obj.constructor.prototype);
- try {
- for (var _b = __values(Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {
- var prop = _c.value;
- clone[prop] = obj[prop];
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return clone;
- };
- _ApplySourceSpanTransformer.prototype.transformExpr = function (expr, context) {
- if (!expr.sourceSpan) {
- expr = this._clone(expr);
- expr.sourceSpan = this.sourceSpan;
- }
- return expr;
- };
- _ApplySourceSpanTransformer.prototype.transformStmt = function (stmt, context) {
- if (!stmt.sourceSpan) {
- stmt = this._clone(stmt);
- stmt.sourceSpan = this.sourceSpan;
- }
- return stmt;
- };
- return _ApplySourceSpanTransformer;
- }(AstTransformer));
- function variable(name, type, sourceSpan) {
- return new ReadVarExpr(name, type, sourceSpan);
- }
- function importExpr(id, typeParams, sourceSpan) {
- if (typeParams === void 0) { typeParams = null; }
- return new ExternalExpr(id, null, typeParams, sourceSpan);
- }
- function expressionType(expr, typeModifiers, typeParams) {
- if (typeModifiers === void 0) { typeModifiers = null; }
- if (typeParams === void 0) { typeParams = null; }
- return new ExpressionType(expr, typeModifiers, typeParams);
- }
- function typeofExpr(expr) {
- return new TypeofExpr(expr);
- }
- function literalArr(values, type, sourceSpan) {
- return new LiteralArrayExpr(values, type, sourceSpan);
- }
- function literalMap(values, type) {
- if (type === void 0) { type = null; }
- return new LiteralMapExpr(values.map(function (e) { return new LiteralMapEntry(e.key, e.value, e.quoted); }), type, null);
- }
- function not(expr, sourceSpan) {
- return new NotExpr(expr, sourceSpan);
- }
- function assertNotNull(expr, sourceSpan) {
- return new AssertNotNull(expr, sourceSpan);
- }
- function fn(params, body, type, sourceSpan, name) {
- return new FunctionExpr(params, body, type, sourceSpan, name);
- }
- function ifStmt(condition, thenClause, elseClause) {
- return new IfStmt(condition, thenClause, elseClause);
- }
- function literal(value, type, sourceSpan) {
- return new LiteralExpr(value, type, sourceSpan);
- }
- function isNull(exp) {
- return exp instanceof LiteralExpr && exp.value === null;
- }
- /*
- * Serializes a `Tag` into a string.
- * Returns a string like " @foo {bar} baz" (note the leading whitespace before `@foo`).
- */
- function tagToString(tag) {
- var out = '';
- if (tag.tagName) {
- out += " @" + tag.tagName;
- }
- if (tag.text) {
- if (tag.text.match(/\/\*|\*\//)) {
- throw new Error('JSDoc text cannot contain "/*" and "*/"');
- }
- out += ' ' + tag.text.replace(/@/g, '\\@');
- }
- return out;
- }
- function serializeTags(tags) {
- var e_2, _a;
- if (tags.length === 0)
- return '';
- var out = '*\n';
- try {
- for (var tags_1 = __values(tags), tags_1_1 = tags_1.next(); !tags_1_1.done; tags_1_1 = tags_1.next()) {
- var tag = tags_1_1.value;
- out += ' *';
- // If the tagToString is multi-line, insert " * " prefixes on subsequent lines.
- out += tagToString(tag).replace(/\n/g, '\n * ');
- out += '\n';
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (tags_1_1 && !tags_1_1.done && (_a = tags_1.return)) _a.call(tags_1);
- }
- finally { if (e_2) throw e_2.error; }
- }
- out += ' ';
- return out;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var DASH_CASE_REGEXP = /-+([a-z0-9])/g;
- function dashCaseToCamelCase(input) {
- return input.replace(DASH_CASE_REGEXP, function () {
- var m = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- m[_i] = arguments[_i];
- }
- return m[1].toUpperCase();
- });
- }
- function splitAtColon(input, defaultValues) {
- return _splitAt(input, ':', defaultValues);
- }
- function splitAtPeriod(input, defaultValues) {
- return _splitAt(input, '.', defaultValues);
- }
- function _splitAt(input, character, defaultValues) {
- var characterIndex = input.indexOf(character);
- if (characterIndex == -1)
- return defaultValues;
- return [input.slice(0, characterIndex).trim(), input.slice(characterIndex + 1).trim()];
- }
- function visitValue(value, visitor, context) {
- if (Array.isArray(value)) {
- return visitor.visitArray(value, context);
- }
- if (isStrictStringMap(value)) {
- return visitor.visitStringMap(value, context);
- }
- if (value == null || typeof value == 'string' || typeof value == 'number' ||
- typeof value == 'boolean') {
- return visitor.visitPrimitive(value, context);
- }
- return visitor.visitOther(value, context);
- }
- function isDefined(val) {
- return val !== null && val !== undefined;
- }
- function noUndefined(val) {
- return val === undefined ? null : val;
- }
- var ValueTransformer = /** @class */ (function () {
- function ValueTransformer() {
- }
- ValueTransformer.prototype.visitArray = function (arr, context) {
- var _this = this;
- return arr.map(function (value) { return visitValue(value, _this, context); });
- };
- ValueTransformer.prototype.visitStringMap = function (map, context) {
- var _this = this;
- var result = {};
- Object.keys(map).forEach(function (key) { result[key] = visitValue(map[key], _this, context); });
- return result;
- };
- ValueTransformer.prototype.visitPrimitive = function (value, context) { return value; };
- ValueTransformer.prototype.visitOther = function (value, context) { return value; };
- return ValueTransformer;
- }());
- var SyncAsync = {
- assertSync: function (value) {
- if (isPromise(value)) {
- throw new Error("Illegal state: value cannot be a promise");
- }
- return value;
- },
- then: function (value, cb) { return isPromise(value) ? value.then(cb) : cb(value); },
- all: function (syncAsyncValues) {
- return syncAsyncValues.some(isPromise) ? Promise.all(syncAsyncValues) : syncAsyncValues;
- }
- };
- function error(msg) {
- throw new Error("Internal Error: " + msg);
- }
- function syntaxError(msg, parseErrors) {
- var error = Error(msg);
- error[ERROR_SYNTAX_ERROR] = true;
- if (parseErrors)
- error[ERROR_PARSE_ERRORS] = parseErrors;
- return error;
- }
- var ERROR_SYNTAX_ERROR = 'ngSyntaxError';
- var ERROR_PARSE_ERRORS = 'ngParseErrors';
- // Escape characters that have a special meaning in Regular Expressions
- function escapeRegExp(s) {
- return s.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
- }
- var STRING_MAP_PROTO = Object.getPrototypeOf({});
- function isStrictStringMap(obj) {
- return typeof obj === 'object' && obj !== null && Object.getPrototypeOf(obj) === STRING_MAP_PROTO;
- }
- function utf8Encode(str) {
- var encoded = '';
- for (var index = 0; index < str.length; index++) {
- var codePoint = str.charCodeAt(index);
- // decode surrogate
- // see https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
- if (codePoint >= 0xd800 && codePoint <= 0xdbff && str.length > (index + 1)) {
- var low = str.charCodeAt(index + 1);
- if (low >= 0xdc00 && low <= 0xdfff) {
- index++;
- codePoint = ((codePoint - 0xd800) << 10) + low - 0xdc00 + 0x10000;
- }
- }
- if (codePoint <= 0x7f) {
- encoded += String.fromCharCode(codePoint);
- }
- else if (codePoint <= 0x7ff) {
- encoded += String.fromCharCode(((codePoint >> 6) & 0x1F) | 0xc0, (codePoint & 0x3f) | 0x80);
- }
- else if (codePoint <= 0xffff) {
- encoded += String.fromCharCode((codePoint >> 12) | 0xe0, ((codePoint >> 6) & 0x3f) | 0x80, (codePoint & 0x3f) | 0x80);
- }
- else if (codePoint <= 0x1fffff) {
- encoded += String.fromCharCode(((codePoint >> 18) & 0x07) | 0xf0, ((codePoint >> 12) & 0x3f) | 0x80, ((codePoint >> 6) & 0x3f) | 0x80, (codePoint & 0x3f) | 0x80);
- }
- }
- return encoded;
- }
- function stringify(token) {
- if (typeof token === 'string') {
- return token;
- }
- if (token instanceof Array) {
- return '[' + token.map(stringify).join(', ') + ']';
- }
- if (token == null) {
- return '' + token;
- }
- if (token.overriddenName) {
- return "" + token.overriddenName;
- }
- if (token.name) {
- return "" + token.name;
- }
- if (!token.toString) {
- return 'object';
- }
- // WARNING: do not try to `JSON.stringify(token)` here
- // see https://github.com/angular/angular/issues/23440
- var res = token.toString();
- if (res == null) {
- return '' + res;
- }
- var newLineIndex = res.indexOf('\n');
- return newLineIndex === -1 ? res : res.substring(0, newLineIndex);
- }
- /**
- * Lazily retrieves the reference value from a forwardRef.
- */
- function resolveForwardRef(type) {
- if (typeof type === 'function' && type.hasOwnProperty('__forward_ref__')) {
- return type();
- }
- else {
- return type;
- }
- }
- /**
- * Determine if the argument is shaped like a Promise
- */
- function isPromise(obj) {
- // allow any Promise/A+ compliant thenable.
- // It's up to the caller to ensure that obj.then conforms to the spec
- return !!obj && typeof obj.then === 'function';
- }
- var Version = /** @class */ (function () {
- function Version(full) {
- this.full = full;
- var splits = full.split('.');
- this.major = splits[0];
- this.minor = splits[1];
- this.patch = splits.slice(2).join('.');
- }
- return Version;
- }());
- var __window = typeof window !== 'undefined' && window;
- var __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
- self instanceof WorkerGlobalScope && self;
- var __global = typeof global !== 'undefined' && global;
- // Check __global first, because in Node tests both __global and __window may be defined and _global
- // should be __global in that case.
- var _global = __global || __window || __self;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var CONSTANT_PREFIX = '_c';
- /**
- * Context to use when producing a key.
- *
- * This ensures we see the constant not the reference variable when producing
- * a key.
- */
- var KEY_CONTEXT = {};
- /**
- * A node that is a place-holder that allows the node to be replaced when the actual
- * node is known.
- *
- * This allows the constant pool to change an expression from a direct reference to
- * a constant to a shared constant. It returns a fix-up node that is later allowed to
- * change the referenced expression.
- */
- var FixupExpression = /** @class */ (function (_super) {
- __extends(FixupExpression, _super);
- function FixupExpression(resolved) {
- var _this = _super.call(this, resolved.type) || this;
- _this.resolved = resolved;
- _this.original = resolved;
- return _this;
- }
- FixupExpression.prototype.visitExpression = function (visitor, context) {
- if (context === KEY_CONTEXT) {
- // When producing a key we want to traverse the constant not the
- // variable used to refer to it.
- return this.original.visitExpression(visitor, context);
- }
- else {
- return this.resolved.visitExpression(visitor, context);
- }
- };
- FixupExpression.prototype.isEquivalent = function (e) {
- return e instanceof FixupExpression && this.resolved.isEquivalent(e.resolved);
- };
- FixupExpression.prototype.isConstant = function () { return true; };
- FixupExpression.prototype.fixup = function (expression) {
- this.resolved = expression;
- this.shared = true;
- };
- return FixupExpression;
- }(Expression));
- /**
- * A constant pool allows a code emitter to share constant in an output context.
- *
- * The constant pool also supports sharing access to ivy definitions references.
- */
- var ConstantPool = /** @class */ (function () {
- function ConstantPool() {
- this.statements = [];
- this.literals = new Map();
- this.literalFactories = new Map();
- this.injectorDefinitions = new Map();
- this.directiveDefinitions = new Map();
- this.componentDefinitions = new Map();
- this.pipeDefinitions = new Map();
- this.nextNameIndex = 0;
- }
- ConstantPool.prototype.getConstLiteral = function (literal, forceShared) {
- if (literal instanceof LiteralExpr || literal instanceof FixupExpression) {
- // Do no put simple literals into the constant pool or try to produce a constant for a
- // reference to a constant.
- return literal;
- }
- var key = this.keyOf(literal);
- var fixup = this.literals.get(key);
- var newValue = false;
- if (!fixup) {
- fixup = new FixupExpression(literal);
- this.literals.set(key, fixup);
- newValue = true;
- }
- if ((!newValue && !fixup.shared) || (newValue && forceShared)) {
- // Replace the expression with a variable
- var name_1 = this.freshName();
- this.statements.push(variable(name_1).set(literal).toDeclStmt(INFERRED_TYPE, [StmtModifier.Final]));
- fixup.fixup(variable(name_1));
- }
- return fixup;
- };
- ConstantPool.prototype.getDefinition = function (type, kind, ctx, forceShared) {
- if (forceShared === void 0) { forceShared = false; }
- var definitions = this.definitionsOf(kind);
- var fixup = definitions.get(type);
- var newValue = false;
- if (!fixup) {
- var property = this.propertyNameOf(kind);
- fixup = new FixupExpression(ctx.importExpr(type).prop(property));
- definitions.set(type, fixup);
- newValue = true;
- }
- if ((!newValue && !fixup.shared) || (newValue && forceShared)) {
- var name_2 = this.freshName();
- this.statements.push(variable(name_2).set(fixup.resolved).toDeclStmt(INFERRED_TYPE, [StmtModifier.Final]));
- fixup.fixup(variable(name_2));
- }
- return fixup;
- };
- ConstantPool.prototype.getLiteralFactory = function (literal$1) {
- // Create a pure function that builds an array of a mix of constant and variable expressions
- if (literal$1 instanceof LiteralArrayExpr) {
- var argumentsForKey = literal$1.entries.map(function (e) { return e.isConstant() ? e : literal(null); });
- var key = this.keyOf(literalArr(argumentsForKey));
- return this._getLiteralFactory(key, literal$1.entries, function (entries) { return literalArr(entries); });
- }
- else {
- var expressionForKey = literalMap(literal$1.entries.map(function (e) { return ({
- key: e.key,
- value: e.value.isConstant() ? e.value : literal(null),
- quoted: e.quoted
- }); }));
- var key = this.keyOf(expressionForKey);
- return this._getLiteralFactory(key, literal$1.entries.map(function (e) { return e.value; }), function (entries) { return literalMap(entries.map(function (value, index) { return ({
- key: literal$1.entries[index].key,
- value: value,
- quoted: literal$1.entries[index].quoted
- }); })); });
- }
- };
- ConstantPool.prototype._getLiteralFactory = function (key, values, resultMap) {
- var _this = this;
- var literalFactory = this.literalFactories.get(key);
- var literalFactoryArguments = values.filter((function (e) { return !e.isConstant(); }));
- if (!literalFactory) {
- var resultExpressions = values.map(function (e, index) { return e.isConstant() ? _this.getConstLiteral(e, true) : variable("a" + index); });
- var parameters = resultExpressions.filter(isVariable).map(function (e) { return new FnParam(e.name, DYNAMIC_TYPE); });
- var pureFunctionDeclaration = fn(parameters, [new ReturnStatement(resultMap(resultExpressions))], INFERRED_TYPE);
- var name_3 = this.freshName();
- this.statements.push(variable(name_3).set(pureFunctionDeclaration).toDeclStmt(INFERRED_TYPE, [
- StmtModifier.Final
- ]));
- literalFactory = variable(name_3);
- this.literalFactories.set(key, literalFactory);
- }
- return { literalFactory: literalFactory, literalFactoryArguments: literalFactoryArguments };
- };
- /**
- * Produce a unique name.
- *
- * The name might be unique among different prefixes if any of the prefixes end in
- * a digit so the prefix should be a constant string (not based on user input) and
- * must not end in a digit.
- */
- ConstantPool.prototype.uniqueName = function (prefix) { return "" + prefix + this.nextNameIndex++; };
- ConstantPool.prototype.definitionsOf = function (kind) {
- switch (kind) {
- case 2 /* Component */:
- return this.componentDefinitions;
- case 1 /* Directive */:
- return this.directiveDefinitions;
- case 0 /* Injector */:
- return this.injectorDefinitions;
- case 3 /* Pipe */:
- return this.pipeDefinitions;
- }
- error("Unknown definition kind " + kind);
- return this.componentDefinitions;
- };
- ConstantPool.prototype.propertyNameOf = function (kind) {
- switch (kind) {
- case 2 /* Component */:
- return 'ngComponentDef';
- case 1 /* Directive */:
- return 'ngDirectiveDef';
- case 0 /* Injector */:
- return 'ngInjectorDef';
- case 3 /* Pipe */:
- return 'ngPipeDef';
- }
- error("Unknown definition kind " + kind);
- return '<unknown>';
- };
- ConstantPool.prototype.freshName = function () { return this.uniqueName(CONSTANT_PREFIX); };
- ConstantPool.prototype.keyOf = function (expression) {
- return expression.visitExpression(new KeyVisitor(), KEY_CONTEXT);
- };
- return ConstantPool;
- }());
- /**
- * Visitor used to determine if 2 expressions are equivalent and can be shared in the
- * `ConstantPool`.
- *
- * When the id (string) generated by the visitor is equal, expressions are considered equivalent.
- */
- var KeyVisitor = /** @class */ (function () {
- function KeyVisitor() {
- this.visitWrappedNodeExpr = invalid;
- this.visitWriteVarExpr = invalid;
- this.visitWriteKeyExpr = invalid;
- this.visitWritePropExpr = invalid;
- this.visitInvokeMethodExpr = invalid;
- this.visitInvokeFunctionExpr = invalid;
- this.visitInstantiateExpr = invalid;
- this.visitConditionalExpr = invalid;
- this.visitNotExpr = invalid;
- this.visitAssertNotNullExpr = invalid;
- this.visitCastExpr = invalid;
- this.visitFunctionExpr = invalid;
- this.visitBinaryOperatorExpr = invalid;
- this.visitReadPropExpr = invalid;
- this.visitReadKeyExpr = invalid;
- this.visitCommaExpr = invalid;
- }
- KeyVisitor.prototype.visitLiteralExpr = function (ast) {
- return "" + (typeof ast.value === 'string' ? '"' + ast.value + '"' : ast.value);
- };
- KeyVisitor.prototype.visitLiteralArrayExpr = function (ast, context) {
- var _this = this;
- return "[" + ast.entries.map(function (entry) { return entry.visitExpression(_this, context); }).join(',') + "]";
- };
- KeyVisitor.prototype.visitLiteralMapExpr = function (ast, context) {
- var _this = this;
- var mapKey = function (entry) {
- var quote = entry.quoted ? '"' : '';
- return "" + quote + entry.key + quote;
- };
- var mapEntry = function (entry) {
- return mapKey(entry) + ":" + entry.value.visitExpression(_this, context);
- };
- return "{" + ast.entries.map(mapEntry).join(',');
- };
- KeyVisitor.prototype.visitExternalExpr = function (ast) {
- return ast.value.moduleName ? "EX:" + ast.value.moduleName + ":" + ast.value.name :
- "EX:" + ast.value.runtime.name;
- };
- KeyVisitor.prototype.visitReadVarExpr = function (node) { return "VAR:" + node.name; };
- KeyVisitor.prototype.visitTypeofExpr = function (node, context) {
- return "TYPEOF:" + node.expr.visitExpression(this, context);
- };
- return KeyVisitor;
- }());
- function invalid(arg) {
- throw new Error("Invalid state: Visitor " + this.constructor.name + " doesn't handle " + arg.constructor.name);
- }
- function isVariable(e) {
- return e instanceof ReadVarExpr;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var CORE = '@angular/core';
- var Identifiers = /** @class */ (function () {
- function Identifiers() {
- }
- Identifiers.ANALYZE_FOR_ENTRY_COMPONENTS = {
- name: 'ANALYZE_FOR_ENTRY_COMPONENTS',
- moduleName: CORE,
- };
- Identifiers.ElementRef = { name: 'ElementRef', moduleName: CORE };
- Identifiers.NgModuleRef = { name: 'NgModuleRef', moduleName: CORE };
- Identifiers.ViewContainerRef = { name: 'ViewContainerRef', moduleName: CORE };
- Identifiers.ChangeDetectorRef = {
- name: 'ChangeDetectorRef',
- moduleName: CORE,
- };
- Identifiers.QueryList = { name: 'QueryList', moduleName: CORE };
- Identifiers.TemplateRef = { name: 'TemplateRef', moduleName: CORE };
- Identifiers.Renderer2 = { name: 'Renderer2', moduleName: CORE };
- Identifiers.CodegenComponentFactoryResolver = {
- name: 'ɵCodegenComponentFactoryResolver',
- moduleName: CORE,
- };
- Identifiers.ComponentFactoryResolver = {
- name: 'ComponentFactoryResolver',
- moduleName: CORE,
- };
- Identifiers.ComponentFactory = { name: 'ComponentFactory', moduleName: CORE };
- Identifiers.ComponentRef = { name: 'ComponentRef', moduleName: CORE };
- Identifiers.NgModuleFactory = { name: 'NgModuleFactory', moduleName: CORE };
- Identifiers.createModuleFactory = {
- name: 'ɵcmf',
- moduleName: CORE,
- };
- Identifiers.moduleDef = {
- name: 'ɵmod',
- moduleName: CORE,
- };
- Identifiers.moduleProviderDef = {
- name: 'ɵmpd',
- moduleName: CORE,
- };
- Identifiers.RegisterModuleFactoryFn = {
- name: 'ɵregisterModuleFactory',
- moduleName: CORE,
- };
- Identifiers.inject = { name: 'ɵɵinject', moduleName: CORE };
- Identifiers.INJECTOR = { name: 'INJECTOR', moduleName: CORE };
- Identifiers.Injector = { name: 'Injector', moduleName: CORE };
- Identifiers.ɵɵdefineInjectable = { name: 'ɵɵdefineInjectable', moduleName: CORE };
- Identifiers.InjectableDef = { name: 'ɵɵInjectableDef', moduleName: CORE };
- Identifiers.ViewEncapsulation = {
- name: 'ViewEncapsulation',
- moduleName: CORE,
- };
- Identifiers.ChangeDetectionStrategy = {
- name: 'ChangeDetectionStrategy',
- moduleName: CORE,
- };
- Identifiers.SecurityContext = {
- name: 'SecurityContext',
- moduleName: CORE,
- };
- Identifiers.LOCALE_ID = { name: 'LOCALE_ID', moduleName: CORE };
- Identifiers.TRANSLATIONS_FORMAT = {
- name: 'TRANSLATIONS_FORMAT',
- moduleName: CORE,
- };
- Identifiers.inlineInterpolate = {
- name: 'ɵinlineInterpolate',
- moduleName: CORE,
- };
- Identifiers.interpolate = { name: 'ɵinterpolate', moduleName: CORE };
- Identifiers.EMPTY_ARRAY = { name: 'ɵEMPTY_ARRAY', moduleName: CORE };
- Identifiers.EMPTY_MAP = { name: 'ɵEMPTY_MAP', moduleName: CORE };
- Identifiers.Renderer = { name: 'Renderer', moduleName: CORE };
- Identifiers.viewDef = { name: 'ɵvid', moduleName: CORE };
- Identifiers.elementDef = { name: 'ɵeld', moduleName: CORE };
- Identifiers.anchorDef = { name: 'ɵand', moduleName: CORE };
- Identifiers.textDef = { name: 'ɵted', moduleName: CORE };
- Identifiers.directiveDef = { name: 'ɵdid', moduleName: CORE };
- Identifiers.providerDef = { name: 'ɵprd', moduleName: CORE };
- Identifiers.queryDef = { name: 'ɵqud', moduleName: CORE };
- Identifiers.pureArrayDef = { name: 'ɵpad', moduleName: CORE };
- Identifiers.pureObjectDef = { name: 'ɵpod', moduleName: CORE };
- Identifiers.purePipeDef = { name: 'ɵppd', moduleName: CORE };
- Identifiers.pipeDef = { name: 'ɵpid', moduleName: CORE };
- Identifiers.nodeValue = { name: 'ɵnov', moduleName: CORE };
- Identifiers.ngContentDef = { name: 'ɵncd', moduleName: CORE };
- Identifiers.unwrapValue = { name: 'ɵunv', moduleName: CORE };
- Identifiers.createRendererType2 = { name: 'ɵcrt', moduleName: CORE };
- // type only
- Identifiers.RendererType2 = {
- name: 'RendererType2',
- moduleName: CORE,
- };
- // type only
- Identifiers.ViewDefinition = {
- name: 'ɵViewDefinition',
- moduleName: CORE,
- };
- Identifiers.createComponentFactory = { name: 'ɵccf', moduleName: CORE };
- Identifiers.setClassMetadata = { name: 'ɵsetClassMetadata', moduleName: CORE };
- return Identifiers;
- }());
- function createTokenForReference(reference) {
- return { identifier: { reference: reference } };
- }
- function createTokenForExternalReference(reflector, reference) {
- return createTokenForReference(reflector.resolveExternalReference(reference));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A token representing the a reference to a static type.
- *
- * This token is unique for a filePath and name and can be used as a hash table key.
- */
- var StaticSymbol = /** @class */ (function () {
- function StaticSymbol(filePath, name, members) {
- this.filePath = filePath;
- this.name = name;
- this.members = members;
- }
- StaticSymbol.prototype.assertNoMembers = function () {
- if (this.members.length) {
- throw new Error("Illegal state: symbol without members expected, but got " + JSON.stringify(this) + ".");
- }
- };
- return StaticSymbol;
- }());
- /**
- * A cache of static symbol used by the StaticReflector to return the same symbol for the
- * same symbol values.
- */
- var StaticSymbolCache = /** @class */ (function () {
- function StaticSymbolCache() {
- this.cache = new Map();
- }
- StaticSymbolCache.prototype.get = function (declarationFile, name, members) {
- members = members || [];
- var memberSuffix = members.length ? "." + members.join('.') : '';
- var key = "\"" + declarationFile + "\"." + name + memberSuffix;
- var result = this.cache.get(key);
- if (!result) {
- result = new StaticSymbol(declarationFile, name, members);
- this.cache.set(key, result);
- }
- return result;
- };
- return StaticSymbolCache;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // group 0: "[prop] or (event) or @trigger"
- // group 1: "prop" from "[prop]"
- // group 2: "event" from "(event)"
- // group 3: "@trigger" from "@trigger"
- var HOST_REG_EXP = /^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))|(\@[-\w]+)$/;
- function sanitizeIdentifier(name) {
- return name.replace(/\W/g, '_');
- }
- var _anonymousTypeIndex = 0;
- function identifierName(compileIdentifier) {
- if (!compileIdentifier || !compileIdentifier.reference) {
- return null;
- }
- var ref = compileIdentifier.reference;
- if (ref instanceof StaticSymbol) {
- return ref.name;
- }
- if (ref['__anonymousType']) {
- return ref['__anonymousType'];
- }
- var identifier = stringify(ref);
- if (identifier.indexOf('(') >= 0) {
- // case: anonymous functions!
- identifier = "anonymous_" + _anonymousTypeIndex++;
- ref['__anonymousType'] = identifier;
- }
- else {
- identifier = sanitizeIdentifier(identifier);
- }
- return identifier;
- }
- function viewClassName(compType, embeddedTemplateIndex) {
- return "View_" + identifierName({ reference: compType }) + "_" + embeddedTemplateIndex;
- }
- function rendererTypeName(compType) {
- return "RenderType_" + identifierName({ reference: compType });
- }
- function hostViewClassName(compType) {
- return "HostView_" + identifierName({ reference: compType });
- }
- function componentFactoryName(compType) {
- return identifierName({ reference: compType }) + "NgFactory";
- }
- var CompileSummaryKind;
- (function (CompileSummaryKind) {
- CompileSummaryKind[CompileSummaryKind["Pipe"] = 0] = "Pipe";
- CompileSummaryKind[CompileSummaryKind["Directive"] = 1] = "Directive";
- CompileSummaryKind[CompileSummaryKind["NgModule"] = 2] = "NgModule";
- CompileSummaryKind[CompileSummaryKind["Injectable"] = 3] = "Injectable";
- })(CompileSummaryKind || (CompileSummaryKind = {}));
- function tokenName(token) {
- return token.value != null ? sanitizeIdentifier(token.value) : identifierName(token.identifier);
- }
- function tokenReference(token) {
- if (token.identifier != null) {
- return token.identifier.reference;
- }
- else {
- return token.value;
- }
- }
- /**
- * Metadata about a stylesheet
- */
- var CompileStylesheetMetadata = /** @class */ (function () {
- function CompileStylesheetMetadata(_a) {
- var _b = _a === void 0 ? {} : _a, moduleUrl = _b.moduleUrl, styles = _b.styles, styleUrls = _b.styleUrls;
- this.moduleUrl = moduleUrl || null;
- this.styles = _normalizeArray(styles);
- this.styleUrls = _normalizeArray(styleUrls);
- }
- return CompileStylesheetMetadata;
- }());
- /**
- * Metadata regarding compilation of a template.
- */
- var CompileTemplateMetadata = /** @class */ (function () {
- function CompileTemplateMetadata(_a) {
- var encapsulation = _a.encapsulation, template = _a.template, templateUrl = _a.templateUrl, htmlAst = _a.htmlAst, styles = _a.styles, styleUrls = _a.styleUrls, externalStylesheets = _a.externalStylesheets, animations = _a.animations, ngContentSelectors = _a.ngContentSelectors, interpolation = _a.interpolation, isInline = _a.isInline, preserveWhitespaces = _a.preserveWhitespaces;
- this.encapsulation = encapsulation;
- this.template = template;
- this.templateUrl = templateUrl;
- this.htmlAst = htmlAst;
- this.styles = _normalizeArray(styles);
- this.styleUrls = _normalizeArray(styleUrls);
- this.externalStylesheets = _normalizeArray(externalStylesheets);
- this.animations = animations ? flatten(animations) : [];
- this.ngContentSelectors = ngContentSelectors || [];
- if (interpolation && interpolation.length != 2) {
- throw new Error("'interpolation' should have a start and an end symbol.");
- }
- this.interpolation = interpolation;
- this.isInline = isInline;
- this.preserveWhitespaces = preserveWhitespaces;
- }
- CompileTemplateMetadata.prototype.toSummary = function () {
- return {
- ngContentSelectors: this.ngContentSelectors,
- encapsulation: this.encapsulation,
- styles: this.styles,
- animations: this.animations
- };
- };
- return CompileTemplateMetadata;
- }());
- /**
- * Metadata regarding compilation of a directive.
- */
- var CompileDirectiveMetadata = /** @class */ (function () {
- function CompileDirectiveMetadata(_a) {
- var isHost = _a.isHost, type = _a.type, isComponent = _a.isComponent, selector = _a.selector, exportAs = _a.exportAs, changeDetection = _a.changeDetection, inputs = _a.inputs, outputs = _a.outputs, hostListeners = _a.hostListeners, hostProperties = _a.hostProperties, hostAttributes = _a.hostAttributes, providers = _a.providers, viewProviders = _a.viewProviders, queries = _a.queries, guards = _a.guards, viewQueries = _a.viewQueries, entryComponents = _a.entryComponents, template = _a.template, componentViewType = _a.componentViewType, rendererType = _a.rendererType, componentFactory = _a.componentFactory;
- this.isHost = !!isHost;
- this.type = type;
- this.isComponent = isComponent;
- this.selector = selector;
- this.exportAs = exportAs;
- this.changeDetection = changeDetection;
- this.inputs = inputs;
- this.outputs = outputs;
- this.hostListeners = hostListeners;
- this.hostProperties = hostProperties;
- this.hostAttributes = hostAttributes;
- this.providers = _normalizeArray(providers);
- this.viewProviders = _normalizeArray(viewProviders);
- this.queries = _normalizeArray(queries);
- this.guards = guards;
- this.viewQueries = _normalizeArray(viewQueries);
- this.entryComponents = _normalizeArray(entryComponents);
- this.template = template;
- this.componentViewType = componentViewType;
- this.rendererType = rendererType;
- this.componentFactory = componentFactory;
- }
- CompileDirectiveMetadata.create = function (_a) {
- var isHost = _a.isHost, type = _a.type, isComponent = _a.isComponent, selector = _a.selector, exportAs = _a.exportAs, changeDetection = _a.changeDetection, inputs = _a.inputs, outputs = _a.outputs, host = _a.host, providers = _a.providers, viewProviders = _a.viewProviders, queries = _a.queries, guards = _a.guards, viewQueries = _a.viewQueries, entryComponents = _a.entryComponents, template = _a.template, componentViewType = _a.componentViewType, rendererType = _a.rendererType, componentFactory = _a.componentFactory;
- var hostListeners = {};
- var hostProperties = {};
- var hostAttributes = {};
- if (host != null) {
- Object.keys(host).forEach(function (key) {
- var value = host[key];
- var matches = key.match(HOST_REG_EXP);
- if (matches === null) {
- hostAttributes[key] = value;
- }
- else if (matches[1] != null) {
- hostProperties[matches[1]] = value;
- }
- else if (matches[2] != null) {
- hostListeners[matches[2]] = value;
- }
- });
- }
- var inputsMap = {};
- if (inputs != null) {
- inputs.forEach(function (bindConfig) {
- // canonical syntax: `dirProp: elProp`
- // if there is no `:`, use dirProp = elProp
- var parts = splitAtColon(bindConfig, [bindConfig, bindConfig]);
- inputsMap[parts[0]] = parts[1];
- });
- }
- var outputsMap = {};
- if (outputs != null) {
- outputs.forEach(function (bindConfig) {
- // canonical syntax: `dirProp: elProp`
- // if there is no `:`, use dirProp = elProp
- var parts = splitAtColon(bindConfig, [bindConfig, bindConfig]);
- outputsMap[parts[0]] = parts[1];
- });
- }
- return new CompileDirectiveMetadata({
- isHost: isHost,
- type: type,
- isComponent: !!isComponent, selector: selector, exportAs: exportAs, changeDetection: changeDetection,
- inputs: inputsMap,
- outputs: outputsMap,
- hostListeners: hostListeners,
- hostProperties: hostProperties,
- hostAttributes: hostAttributes,
- providers: providers,
- viewProviders: viewProviders,
- queries: queries,
- guards: guards,
- viewQueries: viewQueries,
- entryComponents: entryComponents,
- template: template,
- componentViewType: componentViewType,
- rendererType: rendererType,
- componentFactory: componentFactory,
- });
- };
- CompileDirectiveMetadata.prototype.toSummary = function () {
- return {
- summaryKind: CompileSummaryKind.Directive,
- type: this.type,
- isComponent: this.isComponent,
- selector: this.selector,
- exportAs: this.exportAs,
- inputs: this.inputs,
- outputs: this.outputs,
- hostListeners: this.hostListeners,
- hostProperties: this.hostProperties,
- hostAttributes: this.hostAttributes,
- providers: this.providers,
- viewProviders: this.viewProviders,
- queries: this.queries,
- guards: this.guards,
- viewQueries: this.viewQueries,
- entryComponents: this.entryComponents,
- changeDetection: this.changeDetection,
- template: this.template && this.template.toSummary(),
- componentViewType: this.componentViewType,
- rendererType: this.rendererType,
- componentFactory: this.componentFactory
- };
- };
- return CompileDirectiveMetadata;
- }());
- var CompilePipeMetadata = /** @class */ (function () {
- function CompilePipeMetadata(_a) {
- var type = _a.type, name = _a.name, pure = _a.pure;
- this.type = type;
- this.name = name;
- this.pure = !!pure;
- }
- CompilePipeMetadata.prototype.toSummary = function () {
- return {
- summaryKind: CompileSummaryKind.Pipe,
- type: this.type,
- name: this.name,
- pure: this.pure
- };
- };
- return CompilePipeMetadata;
- }());
- /**
- * Metadata regarding compilation of a module.
- */
- var CompileNgModuleMetadata = /** @class */ (function () {
- function CompileNgModuleMetadata(_a) {
- var type = _a.type, providers = _a.providers, declaredDirectives = _a.declaredDirectives, exportedDirectives = _a.exportedDirectives, declaredPipes = _a.declaredPipes, exportedPipes = _a.exportedPipes, entryComponents = _a.entryComponents, bootstrapComponents = _a.bootstrapComponents, importedModules = _a.importedModules, exportedModules = _a.exportedModules, schemas = _a.schemas, transitiveModule = _a.transitiveModule, id = _a.id;
- this.type = type || null;
- this.declaredDirectives = _normalizeArray(declaredDirectives);
- this.exportedDirectives = _normalizeArray(exportedDirectives);
- this.declaredPipes = _normalizeArray(declaredPipes);
- this.exportedPipes = _normalizeArray(exportedPipes);
- this.providers = _normalizeArray(providers);
- this.entryComponents = _normalizeArray(entryComponents);
- this.bootstrapComponents = _normalizeArray(bootstrapComponents);
- this.importedModules = _normalizeArray(importedModules);
- this.exportedModules = _normalizeArray(exportedModules);
- this.schemas = _normalizeArray(schemas);
- this.id = id || null;
- this.transitiveModule = transitiveModule || null;
- }
- CompileNgModuleMetadata.prototype.toSummary = function () {
- var module = this.transitiveModule;
- return {
- summaryKind: CompileSummaryKind.NgModule,
- type: this.type,
- entryComponents: module.entryComponents,
- providers: module.providers,
- modules: module.modules,
- exportedDirectives: module.exportedDirectives,
- exportedPipes: module.exportedPipes
- };
- };
- return CompileNgModuleMetadata;
- }());
- var TransitiveCompileNgModuleMetadata = /** @class */ (function () {
- function TransitiveCompileNgModuleMetadata() {
- this.directivesSet = new Set();
- this.directives = [];
- this.exportedDirectivesSet = new Set();
- this.exportedDirectives = [];
- this.pipesSet = new Set();
- this.pipes = [];
- this.exportedPipesSet = new Set();
- this.exportedPipes = [];
- this.modulesSet = new Set();
- this.modules = [];
- this.entryComponentsSet = new Set();
- this.entryComponents = [];
- this.providers = [];
- }
- TransitiveCompileNgModuleMetadata.prototype.addProvider = function (provider, module) {
- this.providers.push({ provider: provider, module: module });
- };
- TransitiveCompileNgModuleMetadata.prototype.addDirective = function (id) {
- if (!this.directivesSet.has(id.reference)) {
- this.directivesSet.add(id.reference);
- this.directives.push(id);
- }
- };
- TransitiveCompileNgModuleMetadata.prototype.addExportedDirective = function (id) {
- if (!this.exportedDirectivesSet.has(id.reference)) {
- this.exportedDirectivesSet.add(id.reference);
- this.exportedDirectives.push(id);
- }
- };
- TransitiveCompileNgModuleMetadata.prototype.addPipe = function (id) {
- if (!this.pipesSet.has(id.reference)) {
- this.pipesSet.add(id.reference);
- this.pipes.push(id);
- }
- };
- TransitiveCompileNgModuleMetadata.prototype.addExportedPipe = function (id) {
- if (!this.exportedPipesSet.has(id.reference)) {
- this.exportedPipesSet.add(id.reference);
- this.exportedPipes.push(id);
- }
- };
- TransitiveCompileNgModuleMetadata.prototype.addModule = function (id) {
- if (!this.modulesSet.has(id.reference)) {
- this.modulesSet.add(id.reference);
- this.modules.push(id);
- }
- };
- TransitiveCompileNgModuleMetadata.prototype.addEntryComponent = function (ec) {
- if (!this.entryComponentsSet.has(ec.componentType)) {
- this.entryComponentsSet.add(ec.componentType);
- this.entryComponents.push(ec);
- }
- };
- return TransitiveCompileNgModuleMetadata;
- }());
- function _normalizeArray(obj) {
- return obj || [];
- }
- var ProviderMeta = /** @class */ (function () {
- function ProviderMeta(token, _a) {
- var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;
- this.token = token;
- this.useClass = useClass || null;
- this.useValue = useValue;
- this.useExisting = useExisting;
- this.useFactory = useFactory || null;
- this.dependencies = deps || null;
- this.multi = !!multi;
- }
- return ProviderMeta;
- }());
- function flatten(list) {
- return list.reduce(function (flat, item) {
- var flatItem = Array.isArray(item) ? flatten(item) : item;
- return flat.concat(flatItem);
- }, []);
- }
- function jitSourceUrl(url) {
- // Note: We need 3 "/" so that ng shows up as a separate domain
- // in the chrome dev tools.
- return url.replace(/(\w+:\/\/[\w:-]+)?(\/+)?/, 'ng:///');
- }
- function templateSourceUrl(ngModuleType, compMeta, templateMeta) {
- var url;
- if (templateMeta.isInline) {
- if (compMeta.type.reference instanceof StaticSymbol) {
- // Note: a .ts file might contain multiple components with inline templates,
- // so we need to give them unique urls, as these will be used for sourcemaps.
- url = compMeta.type.reference.filePath + "." + compMeta.type.reference.name + ".html";
- }
- else {
- url = identifierName(ngModuleType) + "/" + identifierName(compMeta.type) + ".html";
- }
- }
- else {
- url = templateMeta.templateUrl;
- }
- return compMeta.type.reference instanceof StaticSymbol ? url : jitSourceUrl(url);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var CORE$1 = '@angular/core';
- var Identifiers$1 = /** @class */ (function () {
- function Identifiers() {
- }
- /* Methods */
- Identifiers.NEW_METHOD = 'factory';
- Identifiers.TRANSFORM_METHOD = 'transform';
- Identifiers.PATCH_DEPS = 'patchedDeps';
- /* Instructions */
- Identifiers.namespaceHTML = { name: 'ɵɵnamespaceHTML', moduleName: CORE$1 };
- Identifiers.namespaceMathML = { name: 'ɵɵnamespaceMathML', moduleName: CORE$1 };
- Identifiers.namespaceSVG = { name: 'ɵɵnamespaceSVG', moduleName: CORE$1 };
- Identifiers.element = { name: 'ɵɵelement', moduleName: CORE$1 };
- Identifiers.elementStart = { name: 'ɵɵelementStart', moduleName: CORE$1 };
- Identifiers.elementEnd = { name: 'ɵɵelementEnd', moduleName: CORE$1 };
- Identifiers.select = { name: 'ɵɵselect', moduleName: CORE$1 };
- Identifiers.updateSyntheticHostBinding = { name: 'ɵɵupdateSyntheticHostBinding', moduleName: CORE$1 };
- Identifiers.componentHostSyntheticListener = { name: 'ɵɵcomponentHostSyntheticListener', moduleName: CORE$1 };
- Identifiers.attribute = { name: 'ɵɵattribute', moduleName: CORE$1 };
- Identifiers.attributeInterpolate1 = { name: 'ɵɵattributeInterpolate1', moduleName: CORE$1 };
- Identifiers.attributeInterpolate2 = { name: 'ɵɵattributeInterpolate2', moduleName: CORE$1 };
- Identifiers.attributeInterpolate3 = { name: 'ɵɵattributeInterpolate3', moduleName: CORE$1 };
- Identifiers.attributeInterpolate4 = { name: 'ɵɵattributeInterpolate4', moduleName: CORE$1 };
- Identifiers.attributeInterpolate5 = { name: 'ɵɵattributeInterpolate5', moduleName: CORE$1 };
- Identifiers.attributeInterpolate6 = { name: 'ɵɵattributeInterpolate6', moduleName: CORE$1 };
- Identifiers.attributeInterpolate7 = { name: 'ɵɵattributeInterpolate7', moduleName: CORE$1 };
- Identifiers.attributeInterpolate8 = { name: 'ɵɵattributeInterpolate8', moduleName: CORE$1 };
- Identifiers.attributeInterpolateV = { name: 'ɵɵattributeInterpolateV', moduleName: CORE$1 };
- Identifiers.classProp = { name: 'ɵɵclassProp', moduleName: CORE$1 };
- Identifiers.elementContainerStart = { name: 'ɵɵelementContainerStart', moduleName: CORE$1 };
- Identifiers.elementContainerEnd = { name: 'ɵɵelementContainerEnd', moduleName: CORE$1 };
- Identifiers.styling = { name: 'ɵɵstyling', moduleName: CORE$1 };
- Identifiers.styleMap = { name: 'ɵɵstyleMap', moduleName: CORE$1 };
- Identifiers.classMap = { name: 'ɵɵclassMap', moduleName: CORE$1 };
- Identifiers.styleProp = { name: 'ɵɵstyleProp', moduleName: CORE$1 };
- Identifiers.stylingApply = { name: 'ɵɵstylingApply', moduleName: CORE$1 };
- Identifiers.styleSanitizer = { name: 'ɵɵstyleSanitizer', moduleName: CORE$1 };
- Identifiers.elementHostAttrs = { name: 'ɵɵelementHostAttrs', moduleName: CORE$1 };
- Identifiers.containerCreate = { name: 'ɵɵcontainer', moduleName: CORE$1 };
- Identifiers.nextContext = { name: 'ɵɵnextContext', moduleName: CORE$1 };
- Identifiers.templateCreate = { name: 'ɵɵtemplate', moduleName: CORE$1 };
- Identifiers.text = { name: 'ɵɵtext', moduleName: CORE$1 };
- Identifiers.textBinding = { name: 'ɵɵtextBinding', moduleName: CORE$1 };
- Identifiers.enableBindings = { name: 'ɵɵenableBindings', moduleName: CORE$1 };
- Identifiers.disableBindings = { name: 'ɵɵdisableBindings', moduleName: CORE$1 };
- Identifiers.allocHostVars = { name: 'ɵɵallocHostVars', moduleName: CORE$1 };
- Identifiers.getCurrentView = { name: 'ɵɵgetCurrentView', moduleName: CORE$1 };
- Identifiers.textInterpolate = { name: 'ɵɵtextInterpolate', moduleName: CORE$1 };
- Identifiers.textInterpolate1 = { name: 'ɵɵtextInterpolate1', moduleName: CORE$1 };
- Identifiers.textInterpolate2 = { name: 'ɵɵtextInterpolate2', moduleName: CORE$1 };
- Identifiers.textInterpolate3 = { name: 'ɵɵtextInterpolate3', moduleName: CORE$1 };
- Identifiers.textInterpolate4 = { name: 'ɵɵtextInterpolate4', moduleName: CORE$1 };
- Identifiers.textInterpolate5 = { name: 'ɵɵtextInterpolate5', moduleName: CORE$1 };
- Identifiers.textInterpolate6 = { name: 'ɵɵtextInterpolate6', moduleName: CORE$1 };
- Identifiers.textInterpolate7 = { name: 'ɵɵtextInterpolate7', moduleName: CORE$1 };
- Identifiers.textInterpolate8 = { name: 'ɵɵtextInterpolate8', moduleName: CORE$1 };
- Identifiers.textInterpolateV = { name: 'ɵɵtextInterpolateV', moduleName: CORE$1 };
- Identifiers.restoreView = { name: 'ɵɵrestoreView', moduleName: CORE$1 };
- Identifiers.interpolation1 = { name: 'ɵɵinterpolation1', moduleName: CORE$1 };
- Identifiers.interpolation2 = { name: 'ɵɵinterpolation2', moduleName: CORE$1 };
- Identifiers.interpolation3 = { name: 'ɵɵinterpolation3', moduleName: CORE$1 };
- Identifiers.interpolation4 = { name: 'ɵɵinterpolation4', moduleName: CORE$1 };
- Identifiers.interpolation5 = { name: 'ɵɵinterpolation5', moduleName: CORE$1 };
- Identifiers.interpolation6 = { name: 'ɵɵinterpolation6', moduleName: CORE$1 };
- Identifiers.interpolation7 = { name: 'ɵɵinterpolation7', moduleName: CORE$1 };
- Identifiers.interpolation8 = { name: 'ɵɵinterpolation8', moduleName: CORE$1 };
- Identifiers.interpolationV = { name: 'ɵɵinterpolationV', moduleName: CORE$1 };
- Identifiers.pureFunction0 = { name: 'ɵɵpureFunction0', moduleName: CORE$1 };
- Identifiers.pureFunction1 = { name: 'ɵɵpureFunction1', moduleName: CORE$1 };
- Identifiers.pureFunction2 = { name: 'ɵɵpureFunction2', moduleName: CORE$1 };
- Identifiers.pureFunction3 = { name: 'ɵɵpureFunction3', moduleName: CORE$1 };
- Identifiers.pureFunction4 = { name: 'ɵɵpureFunction4', moduleName: CORE$1 };
- Identifiers.pureFunction5 = { name: 'ɵɵpureFunction5', moduleName: CORE$1 };
- Identifiers.pureFunction6 = { name: 'ɵɵpureFunction6', moduleName: CORE$1 };
- Identifiers.pureFunction7 = { name: 'ɵɵpureFunction7', moduleName: CORE$1 };
- Identifiers.pureFunction8 = { name: 'ɵɵpureFunction8', moduleName: CORE$1 };
- Identifiers.pureFunctionV = { name: 'ɵɵpureFunctionV', moduleName: CORE$1 };
- Identifiers.pipeBind1 = { name: 'ɵɵpipeBind1', moduleName: CORE$1 };
- Identifiers.pipeBind2 = { name: 'ɵɵpipeBind2', moduleName: CORE$1 };
- Identifiers.pipeBind3 = { name: 'ɵɵpipeBind3', moduleName: CORE$1 };
- Identifiers.pipeBind4 = { name: 'ɵɵpipeBind4', moduleName: CORE$1 };
- Identifiers.pipeBindV = { name: 'ɵɵpipeBindV', moduleName: CORE$1 };
- Identifiers.property = { name: 'ɵɵproperty', moduleName: CORE$1 };
- Identifiers.propertyInterpolate = { name: 'ɵɵpropertyInterpolate', moduleName: CORE$1 };
- Identifiers.propertyInterpolate1 = { name: 'ɵɵpropertyInterpolate1', moduleName: CORE$1 };
- Identifiers.propertyInterpolate2 = { name: 'ɵɵpropertyInterpolate2', moduleName: CORE$1 };
- Identifiers.propertyInterpolate3 = { name: 'ɵɵpropertyInterpolate3', moduleName: CORE$1 };
- Identifiers.propertyInterpolate4 = { name: 'ɵɵpropertyInterpolate4', moduleName: CORE$1 };
- Identifiers.propertyInterpolate5 = { name: 'ɵɵpropertyInterpolate5', moduleName: CORE$1 };
- Identifiers.propertyInterpolate6 = { name: 'ɵɵpropertyInterpolate6', moduleName: CORE$1 };
- Identifiers.propertyInterpolate7 = { name: 'ɵɵpropertyInterpolate7', moduleName: CORE$1 };
- Identifiers.propertyInterpolate8 = { name: 'ɵɵpropertyInterpolate8', moduleName: CORE$1 };
- Identifiers.propertyInterpolateV = { name: 'ɵɵpropertyInterpolateV', moduleName: CORE$1 };
- Identifiers.i18n = { name: 'ɵɵi18n', moduleName: CORE$1 };
- Identifiers.i18nAttributes = { name: 'ɵɵi18nAttributes', moduleName: CORE$1 };
- Identifiers.i18nExp = { name: 'ɵɵi18nExp', moduleName: CORE$1 };
- Identifiers.i18nStart = { name: 'ɵɵi18nStart', moduleName: CORE$1 };
- Identifiers.i18nEnd = { name: 'ɵɵi18nEnd', moduleName: CORE$1 };
- Identifiers.i18nApply = { name: 'ɵɵi18nApply', moduleName: CORE$1 };
- Identifiers.i18nPostprocess = { name: 'ɵɵi18nPostprocess', moduleName: CORE$1 };
- Identifiers.i18nLocalize = { name: 'ɵɵi18nLocalize', moduleName: CORE$1 };
- Identifiers.load = { name: 'ɵɵload', moduleName: CORE$1 };
- Identifiers.pipe = { name: 'ɵɵpipe', moduleName: CORE$1 };
- Identifiers.projection = { name: 'ɵɵprojection', moduleName: CORE$1 };
- Identifiers.projectionDef = { name: 'ɵɵprojectionDef', moduleName: CORE$1 };
- Identifiers.reference = { name: 'ɵɵreference', moduleName: CORE$1 };
- Identifiers.inject = { name: 'ɵɵinject', moduleName: CORE$1 };
- Identifiers.injectAttribute = { name: 'ɵɵinjectAttribute', moduleName: CORE$1 };
- Identifiers.directiveInject = { name: 'ɵɵdirectiveInject', moduleName: CORE$1 };
- Identifiers.templateRefExtractor = { name: 'ɵɵtemplateRefExtractor', moduleName: CORE$1 };
- Identifiers.resolveWindow = { name: 'ɵɵresolveWindow', moduleName: CORE$1 };
- Identifiers.resolveDocument = { name: 'ɵɵresolveDocument', moduleName: CORE$1 };
- Identifiers.resolveBody = { name: 'ɵɵresolveBody', moduleName: CORE$1 };
- Identifiers.defineBase = { name: 'ɵɵdefineBase', moduleName: CORE$1 };
- Identifiers.BaseDef = {
- name: 'ɵɵBaseDef',
- moduleName: CORE$1,
- };
- Identifiers.defineComponent = { name: 'ɵɵdefineComponent', moduleName: CORE$1 };
- Identifiers.setComponentScope = { name: 'ɵɵsetComponentScope', moduleName: CORE$1 };
- Identifiers.ComponentDefWithMeta = {
- name: 'ɵɵComponentDefWithMeta',
- moduleName: CORE$1,
- };
- Identifiers.defineDirective = {
- name: 'ɵɵdefineDirective',
- moduleName: CORE$1,
- };
- Identifiers.DirectiveDefWithMeta = {
- name: 'ɵɵDirectiveDefWithMeta',
- moduleName: CORE$1,
- };
- Identifiers.InjectorDef = {
- name: 'ɵɵInjectorDef',
- moduleName: CORE$1,
- };
- Identifiers.defineInjector = {
- name: 'ɵɵdefineInjector',
- moduleName: CORE$1,
- };
- Identifiers.NgModuleDefWithMeta = {
- name: 'ɵɵNgModuleDefWithMeta',
- moduleName: CORE$1,
- };
- Identifiers.defineNgModule = { name: 'ɵɵdefineNgModule', moduleName: CORE$1 };
- Identifiers.setNgModuleScope = { name: 'ɵɵsetNgModuleScope', moduleName: CORE$1 };
- Identifiers.PipeDefWithMeta = { name: 'ɵɵPipeDefWithMeta', moduleName: CORE$1 };
- Identifiers.definePipe = { name: 'ɵɵdefinePipe', moduleName: CORE$1 };
- Identifiers.queryRefresh = { name: 'ɵɵqueryRefresh', moduleName: CORE$1 };
- Identifiers.viewQuery = { name: 'ɵɵviewQuery', moduleName: CORE$1 };
- Identifiers.staticViewQuery = { name: 'ɵɵstaticViewQuery', moduleName: CORE$1 };
- Identifiers.staticContentQuery = { name: 'ɵɵstaticContentQuery', moduleName: CORE$1 };
- Identifiers.loadViewQuery = { name: 'ɵɵloadViewQuery', moduleName: CORE$1 };
- Identifiers.contentQuery = { name: 'ɵɵcontentQuery', moduleName: CORE$1 };
- Identifiers.loadContentQuery = { name: 'ɵɵloadContentQuery', moduleName: CORE$1 };
- Identifiers.NgOnChangesFeature = { name: 'ɵɵNgOnChangesFeature', moduleName: CORE$1 };
- Identifiers.InheritDefinitionFeature = { name: 'ɵɵInheritDefinitionFeature', moduleName: CORE$1 };
- Identifiers.ProvidersFeature = { name: 'ɵɵProvidersFeature', moduleName: CORE$1 };
- Identifiers.listener = { name: 'ɵɵlistener', moduleName: CORE$1 };
- Identifiers.getFactoryOf = {
- name: 'ɵɵgetFactoryOf',
- moduleName: CORE$1,
- };
- Identifiers.getInheritedFactory = {
- name: 'ɵɵgetInheritedFactory',
- moduleName: CORE$1,
- };
- // sanitization-related functions
- Identifiers.sanitizeHtml = { name: 'ɵɵsanitizeHtml', moduleName: CORE$1 };
- Identifiers.sanitizeStyle = { name: 'ɵɵsanitizeStyle', moduleName: CORE$1 };
- Identifiers.defaultStyleSanitizer = { name: 'ɵɵdefaultStyleSanitizer', moduleName: CORE$1 };
- Identifiers.sanitizeResourceUrl = { name: 'ɵɵsanitizeResourceUrl', moduleName: CORE$1 };
- Identifiers.sanitizeScript = { name: 'ɵɵsanitizeScript', moduleName: CORE$1 };
- Identifiers.sanitizeUrl = { name: 'ɵɵsanitizeUrl', moduleName: CORE$1 };
- Identifiers.sanitizeUrlOrResourceUrl = { name: 'ɵɵsanitizeUrlOrResourceUrl', moduleName: CORE$1 };
- return Identifiers;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var $EOF = 0;
- var $BSPACE = 8;
- var $TAB = 9;
- var $LF = 10;
- var $VTAB = 11;
- var $FF = 12;
- var $CR = 13;
- var $SPACE = 32;
- var $BANG = 33;
- var $DQ = 34;
- var $HASH = 35;
- var $$ = 36;
- var $PERCENT = 37;
- var $AMPERSAND = 38;
- var $SQ = 39;
- var $LPAREN = 40;
- var $RPAREN = 41;
- var $STAR = 42;
- var $PLUS = 43;
- var $COMMA = 44;
- var $MINUS = 45;
- var $PERIOD = 46;
- var $SLASH = 47;
- var $COLON = 58;
- var $SEMICOLON = 59;
- var $LT = 60;
- var $EQ = 61;
- var $GT = 62;
- var $QUESTION = 63;
- var $0 = 48;
- var $7 = 55;
- var $9 = 57;
- var $A = 65;
- var $E = 69;
- var $F = 70;
- var $X = 88;
- var $Z = 90;
- var $LBRACKET = 91;
- var $BACKSLASH = 92;
- var $RBRACKET = 93;
- var $CARET = 94;
- var $_ = 95;
- var $a = 97;
- var $b = 98;
- var $e = 101;
- var $f = 102;
- var $n = 110;
- var $r = 114;
- var $t = 116;
- var $u = 117;
- var $v = 118;
- var $x = 120;
- var $z = 122;
- var $LBRACE = 123;
- var $BAR = 124;
- var $RBRACE = 125;
- var $NBSP = 160;
- var $BT = 96;
- function isWhitespace(code) {
- return (code >= $TAB && code <= $SPACE) || (code == $NBSP);
- }
- function isDigit(code) {
- return $0 <= code && code <= $9;
- }
- function isAsciiLetter(code) {
- return code >= $a && code <= $z || code >= $A && code <= $Z;
- }
- function isAsciiHexDigit(code) {
- return code >= $a && code <= $f || code >= $A && code <= $F || isDigit(code);
- }
- function isNewLine(code) {
- return code === $LF || code === $CR;
- }
- function isOctalDigit(code) {
- return $0 <= code && code <= $7;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ParseLocation = /** @class */ (function () {
- function ParseLocation(file, offset, line, col) {
- this.file = file;
- this.offset = offset;
- this.line = line;
- this.col = col;
- }
- ParseLocation.prototype.toString = function () {
- return this.offset != null ? this.file.url + "@" + this.line + ":" + this.col : this.file.url;
- };
- ParseLocation.prototype.moveBy = function (delta) {
- var source = this.file.content;
- var len = source.length;
- var offset = this.offset;
- var line = this.line;
- var col = this.col;
- while (offset > 0 && delta < 0) {
- offset--;
- delta++;
- var ch = source.charCodeAt(offset);
- if (ch == $LF) {
- line--;
- var priorLine = source.substr(0, offset - 1).lastIndexOf(String.fromCharCode($LF));
- col = priorLine > 0 ? offset - priorLine : offset;
- }
- else {
- col--;
- }
- }
- while (offset < len && delta > 0) {
- var ch = source.charCodeAt(offset);
- offset++;
- delta--;
- if (ch == $LF) {
- line++;
- col = 0;
- }
- else {
- col++;
- }
- }
- return new ParseLocation(this.file, offset, line, col);
- };
- // Return the source around the location
- // Up to `maxChars` or `maxLines` on each side of the location
- ParseLocation.prototype.getContext = function (maxChars, maxLines) {
- var content = this.file.content;
- var startOffset = this.offset;
- if (startOffset != null) {
- if (startOffset > content.length - 1) {
- startOffset = content.length - 1;
- }
- var endOffset = startOffset;
- var ctxChars = 0;
- var ctxLines = 0;
- while (ctxChars < maxChars && startOffset > 0) {
- startOffset--;
- ctxChars++;
- if (content[startOffset] == '\n') {
- if (++ctxLines == maxLines) {
- break;
- }
- }
- }
- ctxChars = 0;
- ctxLines = 0;
- while (ctxChars < maxChars && endOffset < content.length - 1) {
- endOffset++;
- ctxChars++;
- if (content[endOffset] == '\n') {
- if (++ctxLines == maxLines) {
- break;
- }
- }
- }
- return {
- before: content.substring(startOffset, this.offset),
- after: content.substring(this.offset, endOffset + 1),
- };
- }
- return null;
- };
- return ParseLocation;
- }());
- var ParseSourceFile = /** @class */ (function () {
- function ParseSourceFile(content, url) {
- this.content = content;
- this.url = url;
- }
- return ParseSourceFile;
- }());
- var ParseSourceSpan = /** @class */ (function () {
- function ParseSourceSpan(start, end, details) {
- if (details === void 0) { details = null; }
- this.start = start;
- this.end = end;
- this.details = details;
- }
- ParseSourceSpan.prototype.toString = function () {
- return this.start.file.content.substring(this.start.offset, this.end.offset);
- };
- return ParseSourceSpan;
- }());
- var ParseErrorLevel;
- (function (ParseErrorLevel) {
- ParseErrorLevel[ParseErrorLevel["WARNING"] = 0] = "WARNING";
- ParseErrorLevel[ParseErrorLevel["ERROR"] = 1] = "ERROR";
- })(ParseErrorLevel || (ParseErrorLevel = {}));
- var ParseError = /** @class */ (function () {
- function ParseError(span, msg, level) {
- if (level === void 0) { level = ParseErrorLevel.ERROR; }
- this.span = span;
- this.msg = msg;
- this.level = level;
- }
- ParseError.prototype.contextualMessage = function () {
- var ctx = this.span.start.getContext(100, 3);
- return ctx ? this.msg + " (\"" + ctx.before + "[" + ParseErrorLevel[this.level] + " ->]" + ctx.after + "\")" :
- this.msg;
- };
- ParseError.prototype.toString = function () {
- var details = this.span.details ? ", " + this.span.details : '';
- return this.contextualMessage() + ": " + this.span.start + details;
- };
- return ParseError;
- }());
- /**
- * Generates Source Span object for a given R3 Type for JIT mode.
- *
- * @param kind Component or Directive.
- * @param typeName name of the Component or Directive.
- * @param sourceUrl reference to Component or Directive source.
- * @returns instance of ParseSourceSpan that represent a given Component or Directive.
- */
- function r3JitTypeSourceSpan(kind, typeName, sourceUrl) {
- var sourceFileName = "in " + kind + " " + typeName + " in " + sourceUrl;
- var sourceFile = new ParseSourceFile('', sourceFileName);
- return new ParseSourceSpan(new ParseLocation(sourceFile, -1, -1, -1), new ParseLocation(sourceFile, -1, -1, -1));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var Text = /** @class */ (function () {
- function Text(value, sourceSpan) {
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- Text.prototype.visit = function (visitor) { return visitor.visitText(this); };
- return Text;
- }());
- var BoundText = /** @class */ (function () {
- function BoundText(value, sourceSpan, i18n) {
- this.value = value;
- this.sourceSpan = sourceSpan;
- this.i18n = i18n;
- }
- BoundText.prototype.visit = function (visitor) { return visitor.visitBoundText(this); };
- return BoundText;
- }());
- var TextAttribute = /** @class */ (function () {
- function TextAttribute(name, value, sourceSpan, valueSpan, i18n) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- this.valueSpan = valueSpan;
- this.i18n = i18n;
- }
- TextAttribute.prototype.visit = function (visitor) { return visitor.visitTextAttribute(this); };
- return TextAttribute;
- }());
- var BoundAttribute = /** @class */ (function () {
- function BoundAttribute(name, type, securityContext, value, unit, sourceSpan, i18n) {
- this.name = name;
- this.type = type;
- this.securityContext = securityContext;
- this.value = value;
- this.unit = unit;
- this.sourceSpan = sourceSpan;
- this.i18n = i18n;
- }
- BoundAttribute.fromBoundElementProperty = function (prop, i18n) {
- return new BoundAttribute(prop.name, prop.type, prop.securityContext, prop.value, prop.unit, prop.sourceSpan, i18n);
- };
- BoundAttribute.prototype.visit = function (visitor) { return visitor.visitBoundAttribute(this); };
- return BoundAttribute;
- }());
- var BoundEvent = /** @class */ (function () {
- function BoundEvent(name, type, handler, target, phase, sourceSpan, handlerSpan) {
- this.name = name;
- this.type = type;
- this.handler = handler;
- this.target = target;
- this.phase = phase;
- this.sourceSpan = sourceSpan;
- this.handlerSpan = handlerSpan;
- }
- BoundEvent.fromParsedEvent = function (event) {
- var target = event.type === 0 /* Regular */ ? event.targetOrPhase : null;
- var phase = event.type === 1 /* Animation */ ? event.targetOrPhase : null;
- return new BoundEvent(event.name, event.type, event.handler, target, phase, event.sourceSpan, event.handlerSpan);
- };
- BoundEvent.prototype.visit = function (visitor) { return visitor.visitBoundEvent(this); };
- return BoundEvent;
- }());
- var Element = /** @class */ (function () {
- function Element(name, attributes, inputs, outputs, children, references, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
- this.name = name;
- this.attributes = attributes;
- this.inputs = inputs;
- this.outputs = outputs;
- this.children = children;
- this.references = references;
- this.sourceSpan = sourceSpan;
- this.startSourceSpan = startSourceSpan;
- this.endSourceSpan = endSourceSpan;
- this.i18n = i18n;
- // If the element is empty then the source span should include any closing tag
- if (children.length === 0 && startSourceSpan && endSourceSpan) {
- this.sourceSpan = new ParseSourceSpan(sourceSpan.start, endSourceSpan.end);
- }
- }
- Element.prototype.visit = function (visitor) { return visitor.visitElement(this); };
- return Element;
- }());
- var Template = /** @class */ (function () {
- function Template(tagName, attributes, inputs, outputs, templateAttrs, children, references, variables, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
- this.tagName = tagName;
- this.attributes = attributes;
- this.inputs = inputs;
- this.outputs = outputs;
- this.templateAttrs = templateAttrs;
- this.children = children;
- this.references = references;
- this.variables = variables;
- this.sourceSpan = sourceSpan;
- this.startSourceSpan = startSourceSpan;
- this.endSourceSpan = endSourceSpan;
- this.i18n = i18n;
- }
- Template.prototype.visit = function (visitor) { return visitor.visitTemplate(this); };
- return Template;
- }());
- var Content = /** @class */ (function () {
- function Content(selector, attributes, sourceSpan, i18n) {
- this.selector = selector;
- this.attributes = attributes;
- this.sourceSpan = sourceSpan;
- this.i18n = i18n;
- }
- Content.prototype.visit = function (visitor) { return visitor.visitContent(this); };
- return Content;
- }());
- var Variable = /** @class */ (function () {
- function Variable(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- Variable.prototype.visit = function (visitor) { return visitor.visitVariable(this); };
- return Variable;
- }());
- var Reference = /** @class */ (function () {
- function Reference(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- Reference.prototype.visit = function (visitor) { return visitor.visitReference(this); };
- return Reference;
- }());
- var Icu = /** @class */ (function () {
- function Icu(vars, placeholders, sourceSpan, i18n) {
- this.vars = vars;
- this.placeholders = placeholders;
- this.sourceSpan = sourceSpan;
- this.i18n = i18n;
- }
- Icu.prototype.visit = function (visitor) { return visitor.visitIcu(this); };
- return Icu;
- }());
- function visitAll(visitor, nodes) {
- var e_1, _a, e_2, _b;
- var result = [];
- if (visitor.visit) {
- try {
- for (var nodes_1 = __values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
- var node = nodes_1_1.value;
- var newNode = visitor.visit(node) || node.visit(visitor);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- else {
- try {
- for (var nodes_2 = __values(nodes), nodes_2_1 = nodes_2.next(); !nodes_2_1.done; nodes_2_1 = nodes_2.next()) {
- var node = nodes_2_1.value;
- var newNode = node.visit(visitor);
- if (newNode) {
- result.push(newNode);
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (nodes_2_1 && !nodes_2_1.done && (_b = nodes_2.return)) _b.call(nodes_2);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- return result;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var Message = /** @class */ (function () {
- /**
- * @param nodes message AST
- * @param placeholders maps placeholder names to static content
- * @param placeholderToMessage maps placeholder names to messages (used for nested ICU messages)
- * @param meaning
- * @param description
- * @param id
- */
- function Message(nodes, placeholders, placeholderToMessage, meaning, description, id) {
- this.nodes = nodes;
- this.placeholders = placeholders;
- this.placeholderToMessage = placeholderToMessage;
- this.meaning = meaning;
- this.description = description;
- this.id = id;
- if (nodes.length) {
- this.sources = [{
- filePath: nodes[0].sourceSpan.start.file.url,
- startLine: nodes[0].sourceSpan.start.line + 1,
- startCol: nodes[0].sourceSpan.start.col + 1,
- endLine: nodes[nodes.length - 1].sourceSpan.end.line + 1,
- endCol: nodes[0].sourceSpan.start.col + 1
- }];
- }
- else {
- this.sources = [];
- }
- }
- return Message;
- }());
- var Text$1 = /** @class */ (function () {
- function Text(value, sourceSpan) {
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- Text.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
- return Text;
- }());
- // TODO(vicb): do we really need this node (vs an array) ?
- var Container = /** @class */ (function () {
- function Container(children, sourceSpan) {
- this.children = children;
- this.sourceSpan = sourceSpan;
- }
- Container.prototype.visit = function (visitor, context) { return visitor.visitContainer(this, context); };
- return Container;
- }());
- var Icu$1 = /** @class */ (function () {
- function Icu(expression, type, cases, sourceSpan) {
- this.expression = expression;
- this.type = type;
- this.cases = cases;
- this.sourceSpan = sourceSpan;
- }
- Icu.prototype.visit = function (visitor, context) { return visitor.visitIcu(this, context); };
- return Icu;
- }());
- var TagPlaceholder = /** @class */ (function () {
- function TagPlaceholder(tag, attrs, startName, closeName, children, isVoid, sourceSpan) {
- this.tag = tag;
- this.attrs = attrs;
- this.startName = startName;
- this.closeName = closeName;
- this.children = children;
- this.isVoid = isVoid;
- this.sourceSpan = sourceSpan;
- }
- TagPlaceholder.prototype.visit = function (visitor, context) { return visitor.visitTagPlaceholder(this, context); };
- return TagPlaceholder;
- }());
- var Placeholder = /** @class */ (function () {
- function Placeholder(value, name, sourceSpan) {
- this.value = value;
- this.name = name;
- this.sourceSpan = sourceSpan;
- }
- Placeholder.prototype.visit = function (visitor, context) { return visitor.visitPlaceholder(this, context); };
- return Placeholder;
- }());
- var IcuPlaceholder = /** @class */ (function () {
- function IcuPlaceholder(value, name, sourceSpan) {
- this.value = value;
- this.name = name;
- this.sourceSpan = sourceSpan;
- }
- IcuPlaceholder.prototype.visit = function (visitor, context) { return visitor.visitIcuPlaceholder(this, context); };
- return IcuPlaceholder;
- }());
- // Clone the AST
- var CloneVisitor = /** @class */ (function () {
- function CloneVisitor() {
- }
- CloneVisitor.prototype.visitText = function (text, context) { return new Text$1(text.value, text.sourceSpan); };
- CloneVisitor.prototype.visitContainer = function (container, context) {
- var _this = this;
- var children = container.children.map(function (n) { return n.visit(_this, context); });
- return new Container(children, container.sourceSpan);
- };
- CloneVisitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- var cases = {};
- Object.keys(icu.cases).forEach(function (key) { return cases[key] = icu.cases[key].visit(_this, context); });
- var msg = new Icu$1(icu.expression, icu.type, cases, icu.sourceSpan);
- msg.expressionPlaceholder = icu.expressionPlaceholder;
- return msg;
- };
- CloneVisitor.prototype.visitTagPlaceholder = function (ph, context) {
- var _this = this;
- var children = ph.children.map(function (n) { return n.visit(_this, context); });
- return new TagPlaceholder(ph.tag, ph.attrs, ph.startName, ph.closeName, children, ph.isVoid, ph.sourceSpan);
- };
- CloneVisitor.prototype.visitPlaceholder = function (ph, context) {
- return new Placeholder(ph.value, ph.name, ph.sourceSpan);
- };
- CloneVisitor.prototype.visitIcuPlaceholder = function (ph, context) {
- return new IcuPlaceholder(ph.value, ph.name, ph.sourceSpan);
- };
- return CloneVisitor;
- }());
- // Visit all the nodes recursively
- var RecurseVisitor = /** @class */ (function () {
- function RecurseVisitor() {
- }
- RecurseVisitor.prototype.visitText = function (text, context) { };
- RecurseVisitor.prototype.visitContainer = function (container, context) {
- var _this = this;
- container.children.forEach(function (child) { return child.visit(_this); });
- };
- RecurseVisitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- Object.keys(icu.cases).forEach(function (k) { icu.cases[k].visit(_this); });
- };
- RecurseVisitor.prototype.visitTagPlaceholder = function (ph, context) {
- var _this = this;
- ph.children.forEach(function (child) { return child.visit(_this); });
- };
- RecurseVisitor.prototype.visitPlaceholder = function (ph, context) { };
- RecurseVisitor.prototype.visitIcuPlaceholder = function (ph, context) { };
- return RecurseVisitor;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function digest(message) {
- return message.id || sha1(serializeNodes(message.nodes).join('') + ("[" + message.meaning + "]"));
- }
- function decimalDigest(message) {
- if (message.id) {
- return message.id;
- }
- var visitor = new _SerializerIgnoreIcuExpVisitor();
- var parts = message.nodes.map(function (a) { return a.visit(visitor, null); });
- return computeMsgId(parts.join(''), message.meaning);
- }
- /**
- * Serialize the i18n ast to something xml-like in order to generate an UID.
- *
- * The visitor is also used in the i18n parser tests
- *
- * @internal
- */
- var _SerializerVisitor = /** @class */ (function () {
- function _SerializerVisitor() {
- }
- _SerializerVisitor.prototype.visitText = function (text, context) { return text.value; };
- _SerializerVisitor.prototype.visitContainer = function (container, context) {
- var _this = this;
- return "[" + container.children.map(function (child) { return child.visit(_this); }).join(', ') + "]";
- };
- _SerializerVisitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- var strCases = Object.keys(icu.cases).map(function (k) { return k + " {" + icu.cases[k].visit(_this) + "}"; });
- return "{" + icu.expression + ", " + icu.type + ", " + strCases.join(', ') + "}";
- };
- _SerializerVisitor.prototype.visitTagPlaceholder = function (ph, context) {
- var _this = this;
- return ph.isVoid ?
- "<ph tag name=\"" + ph.startName + "\"/>" :
- "<ph tag name=\"" + ph.startName + "\">" + ph.children.map(function (child) { return child.visit(_this); }).join(', ') + "</ph name=\"" + ph.closeName + "\">";
- };
- _SerializerVisitor.prototype.visitPlaceholder = function (ph, context) {
- return ph.value ? "<ph name=\"" + ph.name + "\">" + ph.value + "</ph>" : "<ph name=\"" + ph.name + "\"/>";
- };
- _SerializerVisitor.prototype.visitIcuPlaceholder = function (ph, context) {
- return "<ph icu name=\"" + ph.name + "\">" + ph.value.visit(this) + "</ph>";
- };
- return _SerializerVisitor;
- }());
- var serializerVisitor = new _SerializerVisitor();
- function serializeNodes(nodes) {
- return nodes.map(function (a) { return a.visit(serializerVisitor, null); });
- }
- /**
- * Serialize the i18n ast to something xml-like in order to generate an UID.
- *
- * Ignore the ICU expressions so that message IDs stays identical if only the expression changes.
- *
- * @internal
- */
- var _SerializerIgnoreIcuExpVisitor = /** @class */ (function (_super) {
- __extends(_SerializerIgnoreIcuExpVisitor, _super);
- function _SerializerIgnoreIcuExpVisitor() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- _SerializerIgnoreIcuExpVisitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- var strCases = Object.keys(icu.cases).map(function (k) { return k + " {" + icu.cases[k].visit(_this) + "}"; });
- // Do not take the expression into account
- return "{" + icu.type + ", " + strCases.join(', ') + "}";
- };
- return _SerializerIgnoreIcuExpVisitor;
- }(_SerializerVisitor));
- /**
- * Compute the SHA1 of the given string
- *
- * see http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
- *
- * WARNING: this function has not been designed not tested with security in mind.
- * DO NOT USE IT IN A SECURITY SENSITIVE CONTEXT.
- */
- function sha1(str) {
- var _a, _b;
- var utf8 = utf8Encode(str);
- var words32 = stringToWords32(utf8, Endian.Big);
- var len = utf8.length * 8;
- var w = new Array(80);
- var _c = __read([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0], 5), a = _c[0], b = _c[1], c = _c[2], d = _c[3], e = _c[4];
- words32[len >> 5] |= 0x80 << (24 - len % 32);
- words32[((len + 64 >> 9) << 4) + 15] = len;
- for (var i = 0; i < words32.length; i += 16) {
- var _d = __read([a, b, c, d, e], 5), h0 = _d[0], h1 = _d[1], h2 = _d[2], h3 = _d[3], h4 = _d[4];
- for (var j = 0; j < 80; j++) {
- if (j < 16) {
- w[j] = words32[i + j];
- }
- else {
- w[j] = rol32(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
- }
- var _e = __read(fk(j, b, c, d), 2), f = _e[0], k = _e[1];
- var temp = [rol32(a, 5), f, e, k, w[j]].reduce(add32);
- _a = __read([d, c, rol32(b, 30), a, temp], 5), e = _a[0], d = _a[1], c = _a[2], b = _a[3], a = _a[4];
- }
- _b = __read([add32(a, h0), add32(b, h1), add32(c, h2), add32(d, h3), add32(e, h4)], 5), a = _b[0], b = _b[1], c = _b[2], d = _b[3], e = _b[4];
- }
- return byteStringToHexString(words32ToByteString([a, b, c, d, e]));
- }
- function fk(index, b, c, d) {
- if (index < 20) {
- return [(b & c) | (~b & d), 0x5a827999];
- }
- if (index < 40) {
- return [b ^ c ^ d, 0x6ed9eba1];
- }
- if (index < 60) {
- return [(b & c) | (b & d) | (c & d), 0x8f1bbcdc];
- }
- return [b ^ c ^ d, 0xca62c1d6];
- }
- /**
- * Compute the fingerprint of the given string
- *
- * The output is 64 bit number encoded as a decimal string
- *
- * based on:
- * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/GoogleJsMessageIdGenerator.java
- */
- function fingerprint(str) {
- var utf8 = utf8Encode(str);
- var _a = __read([hash32(utf8, 0), hash32(utf8, 102072)], 2), hi = _a[0], lo = _a[1];
- if (hi == 0 && (lo == 0 || lo == 1)) {
- hi = hi ^ 0x130f9bef;
- lo = lo ^ -0x6b5f56d8;
- }
- return [hi, lo];
- }
- function computeMsgId(msg, meaning) {
- var _a;
- var _b = __read(fingerprint(msg), 2), hi = _b[0], lo = _b[1];
- if (meaning) {
- var _c = __read(fingerprint(meaning), 2), him = _c[0], lom = _c[1];
- _a = __read(add64(rol64([hi, lo], 1), [him, lom]), 2), hi = _a[0], lo = _a[1];
- }
- return byteStringToDecString(words32ToByteString([hi & 0x7fffffff, lo]));
- }
- function hash32(str, c) {
- var _a;
- var _b = __read([0x9e3779b9, 0x9e3779b9], 2), a = _b[0], b = _b[1];
- var i;
- var len = str.length;
- for (i = 0; i + 12 <= len; i += 12) {
- a = add32(a, wordAt(str, i, Endian.Little));
- b = add32(b, wordAt(str, i + 4, Endian.Little));
- c = add32(c, wordAt(str, i + 8, Endian.Little));
- _a = __read(mix([a, b, c]), 3), a = _a[0], b = _a[1], c = _a[2];
- }
- a = add32(a, wordAt(str, i, Endian.Little));
- b = add32(b, wordAt(str, i + 4, Endian.Little));
- // the first byte of c is reserved for the length
- c = add32(c, len);
- c = add32(c, wordAt(str, i + 8, Endian.Little) << 8);
- return mix([a, b, c])[2];
- }
- // clang-format off
- function mix(_a) {
- var _b = __read(_a, 3), a = _b[0], b = _b[1], c = _b[2];
- a = sub32(a, b);
- a = sub32(a, c);
- a ^= c >>> 13;
- b = sub32(b, c);
- b = sub32(b, a);
- b ^= a << 8;
- c = sub32(c, a);
- c = sub32(c, b);
- c ^= b >>> 13;
- a = sub32(a, b);
- a = sub32(a, c);
- a ^= c >>> 12;
- b = sub32(b, c);
- b = sub32(b, a);
- b ^= a << 16;
- c = sub32(c, a);
- c = sub32(c, b);
- c ^= b >>> 5;
- a = sub32(a, b);
- a = sub32(a, c);
- a ^= c >>> 3;
- b = sub32(b, c);
- b = sub32(b, a);
- b ^= a << 10;
- c = sub32(c, a);
- c = sub32(c, b);
- c ^= b >>> 15;
- return [a, b, c];
- }
- // clang-format on
- // Utils
- var Endian;
- (function (Endian) {
- Endian[Endian["Little"] = 0] = "Little";
- Endian[Endian["Big"] = 1] = "Big";
- })(Endian || (Endian = {}));
- function add32(a, b) {
- return add32to64(a, b)[1];
- }
- function add32to64(a, b) {
- var low = (a & 0xffff) + (b & 0xffff);
- var high = (a >>> 16) + (b >>> 16) + (low >>> 16);
- return [high >>> 16, (high << 16) | (low & 0xffff)];
- }
- function add64(_a, _b) {
- var _c = __read(_a, 2), ah = _c[0], al = _c[1];
- var _d = __read(_b, 2), bh = _d[0], bl = _d[1];
- var _e = __read(add32to64(al, bl), 2), carry = _e[0], l = _e[1];
- var h = add32(add32(ah, bh), carry);
- return [h, l];
- }
- function sub32(a, b) {
- var low = (a & 0xffff) - (b & 0xffff);
- var high = (a >> 16) - (b >> 16) + (low >> 16);
- return (high << 16) | (low & 0xffff);
- }
- // Rotate a 32b number left `count` position
- function rol32(a, count) {
- return (a << count) | (a >>> (32 - count));
- }
- // Rotate a 64b number left `count` position
- function rol64(_a, count) {
- var _b = __read(_a, 2), hi = _b[0], lo = _b[1];
- var h = (hi << count) | (lo >>> (32 - count));
- var l = (lo << count) | (hi >>> (32 - count));
- return [h, l];
- }
- function stringToWords32(str, endian) {
- var words32 = Array((str.length + 3) >>> 2);
- for (var i = 0; i < words32.length; i++) {
- words32[i] = wordAt(str, i * 4, endian);
- }
- return words32;
- }
- function byteAt(str, index) {
- return index >= str.length ? 0 : str.charCodeAt(index) & 0xff;
- }
- function wordAt(str, index, endian) {
- var word = 0;
- if (endian === Endian.Big) {
- for (var i = 0; i < 4; i++) {
- word += byteAt(str, index + i) << (24 - 8 * i);
- }
- }
- else {
- for (var i = 0; i < 4; i++) {
- word += byteAt(str, index + i) << 8 * i;
- }
- }
- return word;
- }
- function words32ToByteString(words32) {
- return words32.reduce(function (str, word) { return str + word32ToByteString(word); }, '');
- }
- function word32ToByteString(word) {
- var str = '';
- for (var i = 0; i < 4; i++) {
- str += String.fromCharCode((word >>> 8 * (3 - i)) & 0xff);
- }
- return str;
- }
- function byteStringToHexString(str) {
- var hex = '';
- for (var i = 0; i < str.length; i++) {
- var b = byteAt(str, i);
- hex += (b >>> 4).toString(16) + (b & 0x0f).toString(16);
- }
- return hex.toLowerCase();
- }
- // based on http://www.danvk.org/hex2dec.html (JS can not handle more than 56b)
- function byteStringToDecString(str) {
- var decimal = '';
- var toThePower = '1';
- for (var i = str.length - 1; i >= 0; i--) {
- decimal = addBigInt(decimal, numberTimesBigInt(byteAt(str, i), toThePower));
- toThePower = numberTimesBigInt(256, toThePower);
- }
- return decimal.split('').reverse().join('');
- }
- // x and y decimal, lowest significant digit first
- function addBigInt(x, y) {
- var sum = '';
- var len = Math.max(x.length, y.length);
- for (var i = 0, carry = 0; i < len || carry; i++) {
- var tmpSum = carry + +(x[i] || 0) + +(y[i] || 0);
- if (tmpSum >= 10) {
- carry = 1;
- sum += tmpSum - 10;
- }
- else {
- carry = 0;
- sum += tmpSum;
- }
- }
- return sum;
- }
- function numberTimesBigInt(num, b) {
- var product = '';
- var bToThePower = b;
- for (; num !== 0; num = num >>> 1) {
- if (num & 1)
- product = addBigInt(product, bToThePower);
- bToThePower = addBigInt(bToThePower, bToThePower);
- }
- return product;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var Serializer = /** @class */ (function () {
- function Serializer() {
- }
- // Creates a name mapper, see `PlaceholderMapper`
- // Returning `null` means that no name mapping is used.
- Serializer.prototype.createNameMapper = function (message) { return null; };
- return Serializer;
- }());
- /**
- * A simple mapper that take a function to transform an internal name to a public name
- */
- var SimplePlaceholderMapper = /** @class */ (function (_super) {
- __extends(SimplePlaceholderMapper, _super);
- // create a mapping from the message
- function SimplePlaceholderMapper(message, mapName) {
- var _this = _super.call(this) || this;
- _this.mapName = mapName;
- _this.internalToPublic = {};
- _this.publicToNextId = {};
- _this.publicToInternal = {};
- message.nodes.forEach(function (node) { return node.visit(_this); });
- return _this;
- }
- SimplePlaceholderMapper.prototype.toPublicName = function (internalName) {
- return this.internalToPublic.hasOwnProperty(internalName) ?
- this.internalToPublic[internalName] :
- null;
- };
- SimplePlaceholderMapper.prototype.toInternalName = function (publicName) {
- return this.publicToInternal.hasOwnProperty(publicName) ? this.publicToInternal[publicName] :
- null;
- };
- SimplePlaceholderMapper.prototype.visitText = function (text, context) { return null; };
- SimplePlaceholderMapper.prototype.visitTagPlaceholder = function (ph, context) {
- this.visitPlaceholderName(ph.startName);
- _super.prototype.visitTagPlaceholder.call(this, ph, context);
- this.visitPlaceholderName(ph.closeName);
- };
- SimplePlaceholderMapper.prototype.visitPlaceholder = function (ph, context) { this.visitPlaceholderName(ph.name); };
- SimplePlaceholderMapper.prototype.visitIcuPlaceholder = function (ph, context) {
- this.visitPlaceholderName(ph.name);
- };
- // XMB placeholders could only contains A-Z, 0-9 and _
- SimplePlaceholderMapper.prototype.visitPlaceholderName = function (internalName) {
- if (!internalName || this.internalToPublic.hasOwnProperty(internalName)) {
- return;
- }
- var publicName = this.mapName(internalName);
- if (this.publicToInternal.hasOwnProperty(publicName)) {
- // Create a new XMB when it has already been used
- var nextId = this.publicToNextId[publicName];
- this.publicToNextId[publicName] = nextId + 1;
- publicName = publicName + "_" + nextId;
- }
- else {
- this.publicToNextId[publicName] = 1;
- }
- this.internalToPublic[internalName] = publicName;
- this.publicToInternal[publicName] = internalName;
- };
- return SimplePlaceholderMapper;
- }(RecurseVisitor));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _Visitor = /** @class */ (function () {
- function _Visitor() {
- }
- _Visitor.prototype.visitTag = function (tag) {
- var _this = this;
- var strAttrs = this._serializeAttributes(tag.attrs);
- if (tag.children.length == 0) {
- return "<" + tag.name + strAttrs + "/>";
- }
- var strChildren = tag.children.map(function (node) { return node.visit(_this); });
- return "<" + tag.name + strAttrs + ">" + strChildren.join('') + "</" + tag.name + ">";
- };
- _Visitor.prototype.visitText = function (text) { return text.value; };
- _Visitor.prototype.visitDeclaration = function (decl) {
- return "<?xml" + this._serializeAttributes(decl.attrs) + " ?>";
- };
- _Visitor.prototype._serializeAttributes = function (attrs) {
- var strAttrs = Object.keys(attrs).map(function (name) { return name + "=\"" + attrs[name] + "\""; }).join(' ');
- return strAttrs.length > 0 ? ' ' + strAttrs : '';
- };
- _Visitor.prototype.visitDoctype = function (doctype) {
- return "<!DOCTYPE " + doctype.rootTag + " [\n" + doctype.dtd + "\n]>";
- };
- return _Visitor;
- }());
- var _visitor = new _Visitor();
- function serialize(nodes) {
- return nodes.map(function (node) { return node.visit(_visitor); }).join('');
- }
- var Declaration = /** @class */ (function () {
- function Declaration(unescapedAttrs) {
- var _this = this;
- this.attrs = {};
- Object.keys(unescapedAttrs).forEach(function (k) {
- _this.attrs[k] = escapeXml(unescapedAttrs[k]);
- });
- }
- Declaration.prototype.visit = function (visitor) { return visitor.visitDeclaration(this); };
- return Declaration;
- }());
- var Doctype = /** @class */ (function () {
- function Doctype(rootTag, dtd) {
- this.rootTag = rootTag;
- this.dtd = dtd;
- }
- Doctype.prototype.visit = function (visitor) { return visitor.visitDoctype(this); };
- return Doctype;
- }());
- var Tag = /** @class */ (function () {
- function Tag(name, unescapedAttrs, children) {
- var _this = this;
- if (unescapedAttrs === void 0) { unescapedAttrs = {}; }
- if (children === void 0) { children = []; }
- this.name = name;
- this.children = children;
- this.attrs = {};
- Object.keys(unescapedAttrs).forEach(function (k) {
- _this.attrs[k] = escapeXml(unescapedAttrs[k]);
- });
- }
- Tag.prototype.visit = function (visitor) { return visitor.visitTag(this); };
- return Tag;
- }());
- var Text$2 = /** @class */ (function () {
- function Text(unescapedValue) {
- this.value = escapeXml(unescapedValue);
- }
- Text.prototype.visit = function (visitor) { return visitor.visitText(this); };
- return Text;
- }());
- var CR = /** @class */ (function (_super) {
- __extends(CR, _super);
- function CR(ws) {
- if (ws === void 0) { ws = 0; }
- return _super.call(this, "\n" + new Array(ws + 1).join(' ')) || this;
- }
- return CR;
- }(Text$2));
- var _ESCAPED_CHARS = [
- [/&/g, '&'],
- [/"/g, '"'],
- [/'/g, '''],
- [/</g, '<'],
- [/>/g, '>'],
- ];
- // Escape `_ESCAPED_CHARS` characters in the given text with encoded entities
- function escapeXml(text) {
- return _ESCAPED_CHARS.reduce(function (text, entry) { return text.replace(entry[0], entry[1]); }, text);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _MESSAGES_TAG = 'messagebundle';
- var _MESSAGE_TAG = 'msg';
- var _PLACEHOLDER_TAG = 'ph';
- var _EXAMPLE_TAG = 'ex';
- var _SOURCE_TAG = 'source';
- var _DOCTYPE = "<!ELEMENT messagebundle (msg)*>\n<!ATTLIST messagebundle class CDATA #IMPLIED>\n\n<!ELEMENT msg (#PCDATA|ph|source)*>\n<!ATTLIST msg id CDATA #IMPLIED>\n<!ATTLIST msg seq CDATA #IMPLIED>\n<!ATTLIST msg name CDATA #IMPLIED>\n<!ATTLIST msg desc CDATA #IMPLIED>\n<!ATTLIST msg meaning CDATA #IMPLIED>\n<!ATTLIST msg obsolete (obsolete) #IMPLIED>\n<!ATTLIST msg xml:space (default|preserve) \"default\">\n<!ATTLIST msg is_hidden CDATA #IMPLIED>\n\n<!ELEMENT source (#PCDATA)>\n\n<!ELEMENT ph (#PCDATA|ex)*>\n<!ATTLIST ph name CDATA #REQUIRED>\n\n<!ELEMENT ex (#PCDATA)>";
- var Xmb = /** @class */ (function (_super) {
- __extends(Xmb, _super);
- function Xmb() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- Xmb.prototype.write = function (messages, locale) {
- var exampleVisitor = new ExampleVisitor();
- var visitor = new _Visitor$1();
- var rootNode = new Tag(_MESSAGES_TAG);
- messages.forEach(function (message) {
- var attrs = { id: message.id };
- if (message.description) {
- attrs['desc'] = message.description;
- }
- if (message.meaning) {
- attrs['meaning'] = message.meaning;
- }
- var sourceTags = [];
- message.sources.forEach(function (source) {
- sourceTags.push(new Tag(_SOURCE_TAG, {}, [
- new Text$2(source.filePath + ":" + source.startLine + (source.endLine !== source.startLine ? ',' + source.endLine : ''))
- ]));
- });
- rootNode.children.push(new CR(2), new Tag(_MESSAGE_TAG, attrs, __spread(sourceTags, visitor.serialize(message.nodes))));
- });
- rootNode.children.push(new CR());
- return serialize([
- new Declaration({ version: '1.0', encoding: 'UTF-8' }),
- new CR(),
- new Doctype(_MESSAGES_TAG, _DOCTYPE),
- new CR(),
- exampleVisitor.addDefaultExamples(rootNode),
- new CR(),
- ]);
- };
- Xmb.prototype.load = function (content, url) {
- throw new Error('Unsupported');
- };
- Xmb.prototype.digest = function (message) { return digest$1(message); };
- Xmb.prototype.createNameMapper = function (message) {
- return new SimplePlaceholderMapper(message, toPublicName);
- };
- return Xmb;
- }(Serializer));
- var _Visitor$1 = /** @class */ (function () {
- function _Visitor() {
- }
- _Visitor.prototype.visitText = function (text, context) { return [new Text$2(text.value)]; };
- _Visitor.prototype.visitContainer = function (container, context) {
- var _this = this;
- var nodes = [];
- container.children.forEach(function (node) { return nodes.push.apply(nodes, __spread(node.visit(_this))); });
- return nodes;
- };
- _Visitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- var nodes = [new Text$2("{" + icu.expressionPlaceholder + ", " + icu.type + ", ")];
- Object.keys(icu.cases).forEach(function (c) {
- nodes.push.apply(nodes, __spread([new Text$2(c + " {")], icu.cases[c].visit(_this), [new Text$2("} ")]));
- });
- nodes.push(new Text$2("}"));
- return nodes;
- };
- _Visitor.prototype.visitTagPlaceholder = function (ph, context) {
- var startTagAsText = new Text$2("<" + ph.tag + ">");
- var startEx = new Tag(_EXAMPLE_TAG, {}, [startTagAsText]);
- // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
- var startTagPh = new Tag(_PLACEHOLDER_TAG, { name: ph.startName }, [startEx, startTagAsText]);
- if (ph.isVoid) {
- // void tags have no children nor closing tags
- return [startTagPh];
- }
- var closeTagAsText = new Text$2("</" + ph.tag + ">");
- var closeEx = new Tag(_EXAMPLE_TAG, {}, [closeTagAsText]);
- // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
- var closeTagPh = new Tag(_PLACEHOLDER_TAG, { name: ph.closeName }, [closeEx, closeTagAsText]);
- return __spread([startTagPh], this.serialize(ph.children), [closeTagPh]);
- };
- _Visitor.prototype.visitPlaceholder = function (ph, context) {
- var interpolationAsText = new Text$2("{{" + ph.value + "}}");
- // Example tag needs to be not-empty for TC.
- var exTag = new Tag(_EXAMPLE_TAG, {}, [interpolationAsText]);
- return [
- // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
- new Tag(_PLACEHOLDER_TAG, { name: ph.name }, [exTag, interpolationAsText])
- ];
- };
- _Visitor.prototype.visitIcuPlaceholder = function (ph, context) {
- var icuExpression = ph.value.expression;
- var icuType = ph.value.type;
- var icuCases = Object.keys(ph.value.cases).map(function (value) { return value + ' {...}'; }).join(' ');
- var icuAsText = new Text$2("{" + icuExpression + ", " + icuType + ", " + icuCases + "}");
- var exTag = new Tag(_EXAMPLE_TAG, {}, [icuAsText]);
- return [
- // TC requires PH to have a non empty EX, and uses the text node to show the "original" value.
- new Tag(_PLACEHOLDER_TAG, { name: ph.name }, [exTag, icuAsText])
- ];
- };
- _Visitor.prototype.serialize = function (nodes) {
- var _this = this;
- return [].concat.apply([], __spread(nodes.map(function (node) { return node.visit(_this); })));
- };
- return _Visitor;
- }());
- function digest$1(message) {
- return decimalDigest(message);
- }
- // TC requires at least one non-empty example on placeholders
- var ExampleVisitor = /** @class */ (function () {
- function ExampleVisitor() {
- }
- ExampleVisitor.prototype.addDefaultExamples = function (node) {
- node.visit(this);
- return node;
- };
- ExampleVisitor.prototype.visitTag = function (tag) {
- var _this = this;
- if (tag.name === _PLACEHOLDER_TAG) {
- if (!tag.children || tag.children.length == 0) {
- var exText = new Text$2(tag.attrs['name'] || '...');
- tag.children = [new Tag(_EXAMPLE_TAG, {}, [exText])];
- }
- }
- else if (tag.children) {
- tag.children.forEach(function (node) { return node.visit(_this); });
- }
- };
- ExampleVisitor.prototype.visitText = function (text) { };
- ExampleVisitor.prototype.visitDeclaration = function (decl) { };
- ExampleVisitor.prototype.visitDoctype = function (doctype) { };
- return ExampleVisitor;
- }());
- // XMB/XTB placeholders can only contain A-Z, 0-9 and _
- function toPublicName(internalName) {
- return internalName.toUpperCase().replace(/[^A-Z0-9_]/g, '_');
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function mapLiteral(obj, quoted) {
- if (quoted === void 0) { quoted = false; }
- return literalMap(Object.keys(obj).map(function (key) { return ({
- key: key,
- quoted: quoted,
- value: obj[key],
- }); }));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /* Closure variables holding messages must be named `MSG_[A-Z0-9]+` */
- var CLOSURE_TRANSLATION_PREFIX = 'MSG_';
- /* Prefix for non-`goog.getMsg` i18n-related vars */
- var TRANSLATION_PREFIX = 'I18N_';
- /** Closure uses `goog.getMsg(message)` to lookup translations */
- var GOOG_GET_MSG = 'goog.getMsg';
- /** Name of the global variable that is used to determine if we use Closure translations or not */
- var NG_I18N_CLOSURE_MODE = 'ngI18nClosureMode';
- /** I18n separators for metadata **/
- var I18N_MEANING_SEPARATOR = '|';
- var I18N_ID_SEPARATOR = '@@';
- /** Name of the i18n attributes **/
- var I18N_ATTR = 'i18n';
- var I18N_ATTR_PREFIX = 'i18n-';
- /** Prefix of var expressions used in ICUs */
- var I18N_ICU_VAR_PREFIX = 'VAR_';
- /** Prefix of ICU expressions for post processing */
- var I18N_ICU_MAPPING_PREFIX = 'I18N_EXP_';
- /** Placeholder wrapper for i18n expressions **/
- var I18N_PLACEHOLDER_SYMBOL = '�';
- function i18nTranslationToDeclStmt(variable$1, closureVar, message, meta, params) {
- var statements = [];
- // var I18N_X;
- statements.push(new DeclareVarStmt(variable$1.name, undefined, INFERRED_TYPE, null, variable$1.sourceSpan));
- var args = [literal(message)];
- if (params && Object.keys(params).length) {
- args.push(mapLiteral(params, true));
- }
- // Closure JSDoc comments
- var docStatements = i18nMetaToDocStmt(meta);
- var thenStatements = docStatements ? [docStatements] : [];
- var googFnCall = variable(GOOG_GET_MSG).callFn(args);
- // const MSG_... = goog.getMsg(..);
- thenStatements.push(closureVar.set(googFnCall).toConstDecl());
- // I18N_X = MSG_...;
- thenStatements.push(new ExpressionStatement(variable$1.set(closureVar)));
- var localizeFnCall = importExpr(Identifiers$1.i18nLocalize).callFn(args);
- // I18N_X = i18nLocalize(...);
- var elseStatements = [new ExpressionStatement(variable$1.set(localizeFnCall))];
- // if(ngI18nClosureMode) { ... } else { ... }
- statements.push(ifStmt(variable(NG_I18N_CLOSURE_MODE), thenStatements, elseStatements));
- return statements;
- }
- // Converts i18n meta information for a message (id, description, meaning)
- // to a JsDoc statement formatted as expected by the Closure compiler.
- function i18nMetaToDocStmt(meta) {
- var tags = [];
- if (meta.description) {
- tags.push({ tagName: "desc" /* Desc */, text: meta.description });
- }
- if (meta.meaning) {
- tags.push({ tagName: "meaning" /* Meaning */, text: meta.meaning });
- }
- return tags.length == 0 ? null : new JSDocCommentStmt(tags);
- }
- function isI18nAttribute(name) {
- return name === I18N_ATTR || name.startsWith(I18N_ATTR_PREFIX);
- }
- function isI18nRootNode(meta) {
- return meta instanceof Message;
- }
- function isSingleI18nIcu(meta) {
- return isI18nRootNode(meta) && meta.nodes.length === 1 && meta.nodes[0] instanceof Icu$1;
- }
- function hasI18nAttrs(element) {
- return element.attrs.some(function (attr) { return isI18nAttribute(attr.name); });
- }
- function metaFromI18nMessage(message, id) {
- if (id === void 0) { id = null; }
- return {
- id: typeof id === 'string' ? id : message.id || '',
- meaning: message.meaning || '',
- description: message.description || ''
- };
- }
- function icuFromI18nMessage(message) {
- return message.nodes[0];
- }
- function wrapI18nPlaceholder(content, contextId) {
- if (contextId === void 0) { contextId = 0; }
- var blockId = contextId > 0 ? ":" + contextId : '';
- return "" + I18N_PLACEHOLDER_SYMBOL + content + blockId + I18N_PLACEHOLDER_SYMBOL;
- }
- function assembleI18nBoundString(strings, bindingStartIndex, contextId) {
- if (bindingStartIndex === void 0) { bindingStartIndex = 0; }
- if (contextId === void 0) { contextId = 0; }
- if (!strings.length)
- return '';
- var acc = '';
- var lastIdx = strings.length - 1;
- for (var i = 0; i < lastIdx; i++) {
- acc += "" + strings[i] + wrapI18nPlaceholder(bindingStartIndex + i, contextId);
- }
- acc += strings[lastIdx];
- return acc;
- }
- function getSeqNumberGenerator(startsAt) {
- if (startsAt === void 0) { startsAt = 0; }
- var current = startsAt;
- return function () { return current++; };
- }
- function placeholdersToParams(placeholders) {
- var params = {};
- placeholders.forEach(function (values, key) {
- params[key] = literal(values.length > 1 ? "[" + values.join('|') + "]" : values[0]);
- });
- return params;
- }
- function updatePlaceholderMap(map, name) {
- var values = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- values[_i - 2] = arguments[_i];
- }
- var current = map.get(name) || [];
- current.push.apply(current, __spread(values));
- map.set(name, current);
- }
- function assembleBoundTextPlaceholders(meta, bindingStartIndex, contextId) {
- if (bindingStartIndex === void 0) { bindingStartIndex = 0; }
- if (contextId === void 0) { contextId = 0; }
- var startIdx = bindingStartIndex;
- var placeholders = new Map();
- var node = meta instanceof Message ? meta.nodes.find(function (node) { return node instanceof Container; }) : meta;
- if (node) {
- node
- .children.filter(function (child) { return child instanceof Placeholder; })
- .forEach(function (child, idx) {
- var content = wrapI18nPlaceholder(startIdx + idx, contextId);
- updatePlaceholderMap(placeholders, child.name, content);
- });
- }
- return placeholders;
- }
- function findIndex(items, callback) {
- for (var i = 0; i < items.length; i++) {
- if (callback(items[i])) {
- return i;
- }
- }
- return -1;
- }
- /**
- * Parses i18n metas like:
- * - "@@id",
- * - "description[@@id]",
- * - "meaning|description[@@id]"
- * and returns an object with parsed output.
- *
- * @param meta String that represents i18n meta
- * @returns Object with id, meaning and description fields
- */
- function parseI18nMeta(meta) {
- var _a, _b;
- var id;
- var meaning;
- var description;
- if (meta) {
- var idIndex = meta.indexOf(I18N_ID_SEPARATOR);
- var descIndex = meta.indexOf(I18N_MEANING_SEPARATOR);
- var meaningAndDesc = void 0;
- _a = __read((idIndex > -1) ? [meta.slice(0, idIndex), meta.slice(idIndex + 2)] : [meta, ''], 2), meaningAndDesc = _a[0], id = _a[1];
- _b = __read((descIndex > -1) ?
- [meaningAndDesc.slice(0, descIndex), meaningAndDesc.slice(descIndex + 1)] :
- ['', meaningAndDesc], 2), meaning = _b[0], description = _b[1];
- }
- return { id: id, meaning: meaning, description: description };
- }
- /**
- * Converts internal placeholder names to public-facing format
- * (for example to use in goog.getMsg call).
- * Example: `START_TAG_DIV_1` is converted to `startTagDiv_1`.
- *
- * @param name The placeholder name that should be formatted
- * @returns Formatted placeholder name
- */
- function formatI18nPlaceholderName(name) {
- var chunks = toPublicName(name).split('_');
- if (chunks.length === 1) {
- // if no "_" found - just lowercase the value
- return name.toLowerCase();
- }
- var postfix;
- // eject last element if it's a number
- if (/^\d+$/.test(chunks[chunks.length - 1])) {
- postfix = chunks.pop();
- }
- var raw = chunks.shift().toLowerCase();
- if (chunks.length) {
- raw += chunks.map(function (c) { return c.charAt(0).toUpperCase() + c.slice(1).toLowerCase(); }).join('');
- }
- return postfix ? raw + "_" + postfix : raw;
- }
- /**
- * Generates a prefix for translation const name.
- *
- * @param extra Additional local prefix that should be injected into translation var name
- * @returns Complete translation const prefix
- */
- function getTranslationConstPrefix(extra) {
- return ("" + CLOSURE_TRANSLATION_PREFIX + extra).toUpperCase();
- }
- /**
- * Generates translation declaration statements.
- *
- * @param variable Translation value reference
- * @param closureVar Variable for Closure `goog.getMsg` calls
- * @param message Text message to be translated
- * @param meta Object that contains meta information (id, meaning and description)
- * @param params Object with placeholders key-value pairs
- * @param transformFn Optional transformation (post processing) function reference
- * @returns Array of Statements that represent a given translation
- */
- function getTranslationDeclStmts(variable, closureVar, message, meta, params, transformFn) {
- if (params === void 0) { params = {}; }
- var statements = [];
- statements.push.apply(statements, __spread(i18nTranslationToDeclStmt(variable, closureVar, message, meta, params)));
- if (transformFn) {
- statements.push(new ExpressionStatement(variable.set(transformFn(variable))));
- }
- return statements;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Checks whether an object key contains potentially unsafe chars, thus the key should be wrapped in
- * quotes. Note: we do not wrap all keys into quotes, as it may have impact on minification and may
- * bot work in some cases when object keys are mangled by minifier.
- *
- * TODO(FW-1136): this is a temporary solution, we need to come up with a better way of working with
- * inputs that contain potentially unsafe chars.
- */
- var UNSAFE_OBJECT_KEY_NAME_REGEXP = /[-.]/;
- /** Name of the temporary to use during data binding */
- var TEMPORARY_NAME = '_t';
- /** Name of the context parameter passed into a template function */
- var CONTEXT_NAME = 'ctx';
- /** Name of the RenderFlag passed into a template function */
- var RENDER_FLAGS = 'rf';
- /** The prefix reference variables */
- var REFERENCE_PREFIX = '_r';
- /** The name of the implicit context reference */
- var IMPLICIT_REFERENCE = '$implicit';
- /** Non bindable attribute name **/
- var NON_BINDABLE_ATTR = 'ngNonBindable';
- /**
- * Creates an allocator for a temporary variable.
- *
- * A variable declaration is added to the statements the first time the allocator is invoked.
- */
- function temporaryAllocator(statements, name) {
- var temp = null;
- return function () {
- if (!temp) {
- statements.push(new DeclareVarStmt(TEMPORARY_NAME, undefined, DYNAMIC_TYPE));
- temp = variable(name);
- }
- return temp;
- };
- }
- function unsupported(feature) {
- if (this) {
- throw new Error("Builder " + this.constructor.name + " doesn't support " + feature + " yet");
- }
- throw new Error("Feature " + feature + " is not supported yet");
- }
- function invalid$1(arg) {
- throw new Error("Invalid state: Visitor " + this.constructor.name + " doesn't handle " + arg.constructor.name);
- }
- function asLiteral(value) {
- if (Array.isArray(value)) {
- return literalArr(value.map(asLiteral));
- }
- return literal(value, INFERRED_TYPE);
- }
- function conditionallyCreateMapObjectLiteral(keys, keepDeclared) {
- if (Object.getOwnPropertyNames(keys).length > 0) {
- return mapToExpression(keys, keepDeclared);
- }
- return null;
- }
- function mapToExpression(map, keepDeclared) {
- return literalMap(Object.getOwnPropertyNames(map).map(function (key) {
- var _a, _b;
- // canonical syntax: `dirProp: publicProp`
- // if there is no `:`, use dirProp = elProp
- var value = map[key];
- var declaredName;
- var publicName;
- var minifiedName;
- if (Array.isArray(value)) {
- _a = __read(value, 2), publicName = _a[0], declaredName = _a[1];
- }
- else {
- _b = __read(splitAtColon(key, [key, value]), 2), declaredName = _b[0], publicName = _b[1];
- }
- minifiedName = declaredName;
- return {
- key: minifiedName,
- // put quotes around keys that contain potentially unsafe characters
- quoted: UNSAFE_OBJECT_KEY_NAME_REGEXP.test(minifiedName),
- value: (keepDeclared && publicName !== declaredName) ?
- literalArr([asLiteral(publicName), asLiteral(declaredName)]) :
- asLiteral(publicName)
- };
- }));
- }
- /**
- * Remove trailing null nodes as they are implied.
- */
- function trimTrailingNulls(parameters) {
- while (isNull(parameters[parameters.length - 1])) {
- parameters.pop();
- }
- return parameters;
- }
- function getQueryPredicate(query, constantPool) {
- if (Array.isArray(query.predicate)) {
- var predicate_1 = [];
- query.predicate.forEach(function (selector) {
- // Each item in predicates array may contain strings with comma-separated refs
- // (for ex. 'ref, ref1, ..., refN'), thus we extract individual refs and store them
- // as separate array entities
- var selectors = selector.split(',').map(function (token) { return literal(token.trim()); });
- predicate_1.push.apply(predicate_1, __spread(selectors));
- });
- return constantPool.getConstLiteral(literalArr(predicate_1), true);
- }
- else {
- return query.predicate;
- }
- }
- var DefinitionMap = /** @class */ (function () {
- function DefinitionMap() {
- this.values = [];
- }
- DefinitionMap.prototype.set = function (key, value) {
- if (value) {
- this.values.push({ key: key, value: value, quoted: false });
- }
- };
- DefinitionMap.prototype.toLiteralMap = function () { return literalMap(this.values); };
- return DefinitionMap;
- }());
- /**
- * Extract a map of properties to values for a given element or template node, which can be used
- * by the directive matching machinery.
- *
- * @param elOrTpl the element or template in question
- * @return an object set up for directive matching. For attributes on the element/template, this
- * object maps a property name to its (static) value. For any bindings, this map simply maps the
- * property name to an empty string.
- */
- function getAttrsForDirectiveMatching(elOrTpl) {
- var attributesMap = {};
- if (elOrTpl instanceof Template && elOrTpl.tagName !== 'ng-template') {
- elOrTpl.templateAttrs.forEach(function (a) { return attributesMap[a.name] = ''; });
- }
- else {
- elOrTpl.attributes.forEach(function (a) {
- if (!isI18nAttribute(a.name)) {
- attributesMap[a.name] = a.value;
- }
- });
- elOrTpl.inputs.forEach(function (i) { attributesMap[i.name] = ''; });
- elOrTpl.outputs.forEach(function (o) { attributesMap[o.name] = ''; });
- }
- return attributesMap;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var R3FactoryDelegateType;
- (function (R3FactoryDelegateType) {
- R3FactoryDelegateType[R3FactoryDelegateType["Class"] = 0] = "Class";
- R3FactoryDelegateType[R3FactoryDelegateType["Function"] = 1] = "Function";
- R3FactoryDelegateType[R3FactoryDelegateType["Factory"] = 2] = "Factory";
- })(R3FactoryDelegateType || (R3FactoryDelegateType = {}));
- /**
- * Resolved type of a dependency.
- *
- * Occasionally, dependencies will have special significance which is known statically. In that
- * case the `R3ResolvedDependencyType` informs the factory generator that a particular dependency
- * should be generated specially (usually by calling a special injection function instead of the
- * standard one).
- */
- var R3ResolvedDependencyType;
- (function (R3ResolvedDependencyType) {
- /**
- * A normal token dependency.
- */
- R3ResolvedDependencyType[R3ResolvedDependencyType["Token"] = 0] = "Token";
- /**
- * The dependency is for an attribute.
- *
- * The token expression is a string representing the attribute name.
- */
- R3ResolvedDependencyType[R3ResolvedDependencyType["Attribute"] = 1] = "Attribute";
- })(R3ResolvedDependencyType || (R3ResolvedDependencyType = {}));
- /**
- * Construct a factory function expression for the given `R3FactoryMetadata`.
- */
- function compileFactoryFunction(meta) {
- var t = variable('t');
- var statements = [];
- // The type to instantiate via constructor invocation. If there is no delegated factory, meaning
- // this type is always created by constructor invocation, then this is the type-to-create
- // parameter provided by the user (t) if specified, or the current type if not. If there is a
- // delegated factory (which is used to create the current type) then this is only the type-to-
- // create parameter (t).
- var typeForCtor = !isDelegatedMetadata(meta) ? new BinaryOperatorExpr(BinaryOperator.Or, t, meta.type) : t;
- var ctorExpr = null;
- if (meta.deps !== null) {
- // There is a constructor (either explicitly or implicitly defined).
- if (meta.deps !== 'invalid') {
- ctorExpr = new InstantiateExpr(typeForCtor, injectDependencies(meta.deps, meta.injectFn));
- }
- }
- else {
- var baseFactory = variable("\u0275" + meta.name + "_BaseFactory");
- var getInheritedFactory = importExpr(Identifiers$1.getInheritedFactory);
- var baseFactoryStmt = baseFactory.set(getInheritedFactory.callFn([meta.type])).toDeclStmt(INFERRED_TYPE, [
- StmtModifier.Exported, StmtModifier.Final
- ]);
- statements.push(baseFactoryStmt);
- // There is no constructor, use the base class' factory to construct typeForCtor.
- ctorExpr = baseFactory.callFn([typeForCtor]);
- }
- var ctorExprFinal = ctorExpr;
- var body = [];
- var retExpr = null;
- function makeConditionalFactory(nonCtorExpr) {
- var r = variable('r');
- body.push(r.set(NULL_EXPR).toDeclStmt());
- var ctorStmt = null;
- if (ctorExprFinal !== null) {
- ctorStmt = r.set(ctorExprFinal).toStmt();
- }
- else {
- ctorStmt = makeErrorStmt(meta.name);
- }
- body.push(ifStmt(t, [ctorStmt], [r.set(nonCtorExpr).toStmt()]));
- return r;
- }
- if (isDelegatedMetadata(meta) && meta.delegateType === R3FactoryDelegateType.Factory) {
- var delegateFactory = variable("\u0275" + meta.name + "_BaseFactory");
- var getFactoryOf = importExpr(Identifiers$1.getFactoryOf);
- if (meta.delegate.isEquivalent(meta.type)) {
- throw new Error("Illegal state: compiling factory that delegates to itself");
- }
- var delegateFactoryStmt = delegateFactory.set(getFactoryOf.callFn([meta.delegate])).toDeclStmt(INFERRED_TYPE, [
- StmtModifier.Exported, StmtModifier.Final
- ]);
- statements.push(delegateFactoryStmt);
- retExpr = makeConditionalFactory(delegateFactory.callFn([]));
- }
- else if (isDelegatedMetadata(meta)) {
- // This type is created with a delegated factory. If a type parameter is not specified, call
- // the factory instead.
- var delegateArgs = injectDependencies(meta.delegateDeps, meta.injectFn);
- // Either call `new delegate(...)` or `delegate(...)` depending on meta.useNewForDelegate.
- var factoryExpr = new (meta.delegateType === R3FactoryDelegateType.Class ?
- InstantiateExpr :
- InvokeFunctionExpr)(meta.delegate, delegateArgs);
- retExpr = makeConditionalFactory(factoryExpr);
- }
- else if (isExpressionFactoryMetadata(meta)) {
- // TODO(alxhub): decide whether to lower the value here or in the caller
- retExpr = makeConditionalFactory(meta.expression);
- }
- else {
- retExpr = ctorExpr;
- }
- if (retExpr !== null) {
- body.push(new ReturnStatement(retExpr));
- }
- else {
- body.push(makeErrorStmt(meta.name));
- }
- return {
- factory: fn([new FnParam('t', DYNAMIC_TYPE)], body, INFERRED_TYPE, undefined, meta.name + "_Factory"),
- statements: statements,
- };
- }
- function injectDependencies(deps, injectFn) {
- return deps.map(function (dep) { return compileInjectDependency(dep, injectFn); });
- }
- function compileInjectDependency(dep, injectFn) {
- // Interpret the dependency according to its resolved type.
- switch (dep.resolved) {
- case R3ResolvedDependencyType.Token: {
- // Build up the injection flags according to the metadata.
- var flags = 0 /* Default */ | (dep.self ? 2 /* Self */ : 0) |
- (dep.skipSelf ? 4 /* SkipSelf */ : 0) | (dep.host ? 1 /* Host */ : 0) |
- (dep.optional ? 8 /* Optional */ : 0);
- // Build up the arguments to the injectFn call.
- var injectArgs = [dep.token];
- // If this dependency is optional or otherwise has non-default flags, then additional
- // parameters describing how to inject the dependency must be passed to the inject function
- // that's being used.
- if (flags !== 0 /* Default */ || dep.optional) {
- injectArgs.push(literal(flags));
- }
- return importExpr(injectFn).callFn(injectArgs);
- }
- case R3ResolvedDependencyType.Attribute:
- // In the case of attributes, the attribute name in question is given as the token.
- return importExpr(Identifiers$1.injectAttribute).callFn([dep.token]);
- default:
- return unsupported("Unknown R3ResolvedDependencyType: " + R3ResolvedDependencyType[dep.resolved]);
- }
- }
- function makeErrorStmt(name) {
- return new ThrowStmt(new InstantiateExpr(new ReadVarExpr('Error'), [
- literal(name + " has a constructor which is not compatible with Dependency Injection. It should probably not be @Injectable().")
- ]));
- }
- function isDelegatedMetadata(meta) {
- return meta.delegateType !== undefined;
- }
- function isExpressionFactoryMetadata(meta) {
- return meta.expression !== undefined;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Convert an object map with `Expression` values into a `LiteralMapExpr`.
- */
- function mapToMapExpression(map) {
- var result = Object.keys(map).map(function (key) { return ({ key: key, value: map[key], quoted: false }); });
- return literalMap(result);
- }
- function typeWithParameters(type, numParams) {
- var params = null;
- if (numParams > 0) {
- params = [];
- for (var i = 0; i < numParams; i++) {
- params.push(DYNAMIC_TYPE);
- }
- }
- return expressionType(type, null, params);
- }
- var ANIMATE_SYMBOL_PREFIX = '@';
- function prepareSyntheticPropertyName(name) {
- return "" + ANIMATE_SYMBOL_PREFIX + name;
- }
- function prepareSyntheticListenerName(name, phase) {
- return "" + ANIMATE_SYMBOL_PREFIX + name + "." + phase;
- }
- function prepareSyntheticListenerFunctionName(name, phase) {
- return "animation_" + name + "_" + phase;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function compileInjectable(meta) {
- var result = null;
- var factoryMeta = {
- name: meta.name,
- type: meta.type,
- deps: meta.ctorDeps,
- injectFn: Identifiers.inject,
- };
- if (meta.useClass !== undefined) {
- // meta.useClass has two modes of operation. Either deps are specified, in which case `new` is
- // used to instantiate the class with dependencies injected, or deps are not specified and
- // the factory of the class is used to instantiate it.
- //
- // A special case exists for useClass: Type where Type is the injectable type itself and no
- // deps are specified, in which case 'useClass' is effectively ignored.
- var useClassOnSelf = meta.useClass.isEquivalent(meta.type);
- var deps = undefined;
- if (meta.userDeps !== undefined) {
- deps = meta.userDeps;
- }
- if (deps !== undefined) {
- // factory: () => new meta.useClass(...deps)
- result = compileFactoryFunction(__assign({}, factoryMeta, { delegate: meta.useClass, delegateDeps: deps, delegateType: R3FactoryDelegateType.Class }));
- }
- else if (useClassOnSelf) {
- result = compileFactoryFunction(factoryMeta);
- }
- else {
- result = compileFactoryFunction(__assign({}, factoryMeta, { delegate: meta.useClass, delegateType: R3FactoryDelegateType.Factory }));
- }
- }
- else if (meta.useFactory !== undefined) {
- result = compileFactoryFunction(__assign({}, factoryMeta, { delegate: meta.useFactory, delegateDeps: meta.userDeps || [], delegateType: R3FactoryDelegateType.Function }));
- }
- else if (meta.useValue !== undefined) {
- // Note: it's safe to use `meta.useValue` instead of the `USE_VALUE in meta` check used for
- // client code because meta.useValue is an Expression which will be defined even if the actual
- // value is undefined.
- result = compileFactoryFunction(__assign({}, factoryMeta, { expression: meta.useValue }));
- }
- else if (meta.useExisting !== undefined) {
- // useExisting is an `inject` call on the existing token.
- result = compileFactoryFunction(__assign({}, factoryMeta, { expression: importExpr(Identifiers.inject).callFn([meta.useExisting]) }));
- }
- else {
- result = compileFactoryFunction(factoryMeta);
- }
- var token = meta.type;
- var providedIn = meta.providedIn;
- var expression = importExpr(Identifiers.ɵɵdefineInjectable).callFn([mapToMapExpression({ token: token, factory: result.factory, providedIn: providedIn })]);
- var type = new ExpressionType(importExpr(Identifiers.InjectableDef, [typeWithParameters(meta.type, meta.typeArgumentCount)]));
- return {
- expression: expression,
- type: type,
- statements: result.statements,
- };
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function assertArrayOfStrings(identifier, value) {
- if (value == null) {
- return;
- }
- if (!Array.isArray(value)) {
- throw new Error("Expected '" + identifier + "' to be an array of strings.");
- }
- for (var i = 0; i < value.length; i += 1) {
- if (typeof value[i] !== 'string') {
- throw new Error("Expected '" + identifier + "' to be an array of strings.");
- }
- }
- }
- var UNUSABLE_INTERPOLATION_REGEXPS = [
- /^\s*$/,
- /[<>]/,
- /^[{}]$/,
- /&(#|[a-z])/i,
- /^\/\//,
- ];
- function assertInterpolationSymbols(identifier, value) {
- if (value != null && !(Array.isArray(value) && value.length == 2)) {
- throw new Error("Expected '" + identifier + "' to be an array, [start, end].");
- }
- else if (value != null) {
- var start_1 = value[0];
- var end_1 = value[1];
- // Check for unusable interpolation symbols
- UNUSABLE_INTERPOLATION_REGEXPS.forEach(function (regexp) {
- if (regexp.test(start_1) || regexp.test(end_1)) {
- throw new Error("['" + start_1 + "', '" + end_1 + "'] contains unusable interpolation symbol.");
- }
- });
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var InterpolationConfig = /** @class */ (function () {
- function InterpolationConfig(start, end) {
- this.start = start;
- this.end = end;
- }
- InterpolationConfig.fromArray = function (markers) {
- if (!markers) {
- return DEFAULT_INTERPOLATION_CONFIG;
- }
- assertInterpolationSymbols('interpolation', markers);
- return new InterpolationConfig(markers[0], markers[1]);
- };
- return InterpolationConfig;
- }());
- var DEFAULT_INTERPOLATION_CONFIG = new InterpolationConfig('{{', '}}');
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
- var VERSION = 3;
- var JS_B64_PREFIX = '# sourceMappingURL=data:application/json;base64,';
- var SourceMapGenerator = /** @class */ (function () {
- function SourceMapGenerator(file) {
- if (file === void 0) { file = null; }
- this.file = file;
- this.sourcesContent = new Map();
- this.lines = [];
- this.lastCol0 = 0;
- this.hasMappings = false;
- }
- // The content is `null` when the content is expected to be loaded using the URL
- SourceMapGenerator.prototype.addSource = function (url, content) {
- if (content === void 0) { content = null; }
- if (!this.sourcesContent.has(url)) {
- this.sourcesContent.set(url, content);
- }
- return this;
- };
- SourceMapGenerator.prototype.addLine = function () {
- this.lines.push([]);
- this.lastCol0 = 0;
- return this;
- };
- SourceMapGenerator.prototype.addMapping = function (col0, sourceUrl, sourceLine0, sourceCol0) {
- if (!this.currentLine) {
- throw new Error("A line must be added before mappings can be added");
- }
- if (sourceUrl != null && !this.sourcesContent.has(sourceUrl)) {
- throw new Error("Unknown source file \"" + sourceUrl + "\"");
- }
- if (col0 == null) {
- throw new Error("The column in the generated code must be provided");
- }
- if (col0 < this.lastCol0) {
- throw new Error("Mapping should be added in output order");
- }
- if (sourceUrl && (sourceLine0 == null || sourceCol0 == null)) {
- throw new Error("The source location must be provided when a source url is provided");
- }
- this.hasMappings = true;
- this.lastCol0 = col0;
- this.currentLine.push({ col0: col0, sourceUrl: sourceUrl, sourceLine0: sourceLine0, sourceCol0: sourceCol0 });
- return this;
- };
- Object.defineProperty(SourceMapGenerator.prototype, "currentLine", {
- get: function () { return this.lines.slice(-1)[0]; },
- enumerable: true,
- configurable: true
- });
- SourceMapGenerator.prototype.toJSON = function () {
- var _this = this;
- if (!this.hasMappings) {
- return null;
- }
- var sourcesIndex = new Map();
- var sources = [];
- var sourcesContent = [];
- Array.from(this.sourcesContent.keys()).forEach(function (url, i) {
- sourcesIndex.set(url, i);
- sources.push(url);
- sourcesContent.push(_this.sourcesContent.get(url) || null);
- });
- var mappings = '';
- var lastCol0 = 0;
- var lastSourceIndex = 0;
- var lastSourceLine0 = 0;
- var lastSourceCol0 = 0;
- this.lines.forEach(function (segments) {
- lastCol0 = 0;
- mappings += segments
- .map(function (segment) {
- // zero-based starting column of the line in the generated code
- var segAsStr = toBase64VLQ(segment.col0 - lastCol0);
- lastCol0 = segment.col0;
- if (segment.sourceUrl != null) {
- // zero-based index into the “sources” list
- segAsStr +=
- toBase64VLQ(sourcesIndex.get(segment.sourceUrl) - lastSourceIndex);
- lastSourceIndex = sourcesIndex.get(segment.sourceUrl);
- // the zero-based starting line in the original source
- segAsStr += toBase64VLQ(segment.sourceLine0 - lastSourceLine0);
- lastSourceLine0 = segment.sourceLine0;
- // the zero-based starting column in the original source
- segAsStr += toBase64VLQ(segment.sourceCol0 - lastSourceCol0);
- lastSourceCol0 = segment.sourceCol0;
- }
- return segAsStr;
- })
- .join(',');
- mappings += ';';
- });
- mappings = mappings.slice(0, -1);
- return {
- 'file': this.file || '',
- 'version': VERSION,
- 'sourceRoot': '',
- 'sources': sources,
- 'sourcesContent': sourcesContent,
- 'mappings': mappings,
- };
- };
- SourceMapGenerator.prototype.toJsComment = function () {
- return this.hasMappings ? '//' + JS_B64_PREFIX + toBase64String(JSON.stringify(this, null, 0)) :
- '';
- };
- return SourceMapGenerator;
- }());
- function toBase64String(value) {
- var b64 = '';
- value = utf8Encode(value);
- for (var i = 0; i < value.length;) {
- var i1 = value.charCodeAt(i++);
- var i2 = value.charCodeAt(i++);
- var i3 = value.charCodeAt(i++);
- b64 += toBase64Digit(i1 >> 2);
- b64 += toBase64Digit(((i1 & 3) << 4) | (isNaN(i2) ? 0 : i2 >> 4));
- b64 += isNaN(i2) ? '=' : toBase64Digit(((i2 & 15) << 2) | (i3 >> 6));
- b64 += isNaN(i2) || isNaN(i3) ? '=' : toBase64Digit(i3 & 63);
- }
- return b64;
- }
- function toBase64VLQ(value) {
- value = value < 0 ? ((-value) << 1) + 1 : value << 1;
- var out = '';
- do {
- var digit = value & 31;
- value = value >> 5;
- if (value > 0) {
- digit = digit | 32;
- }
- out += toBase64Digit(digit);
- } while (value > 0);
- return out;
- }
- var B64_DIGITS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
- function toBase64Digit(value) {
- if (value < 0 || value >= 64) {
- throw new Error("Can only encode value in the range [0, 63]");
- }
- return B64_DIGITS[value];
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _SINGLE_QUOTE_ESCAPE_STRING_RE = /'|\\|\n|\r|\$/g;
- var _LEGAL_IDENTIFIER_RE = /^[$A-Z_][0-9A-Z_$]*$/i;
- var _INDENT_WITH = ' ';
- var CATCH_ERROR_VAR$1 = variable('error', null, null);
- var CATCH_STACK_VAR$1 = variable('stack', null, null);
- var _EmittedLine = /** @class */ (function () {
- function _EmittedLine(indent) {
- this.indent = indent;
- this.partsLength = 0;
- this.parts = [];
- this.srcSpans = [];
- }
- return _EmittedLine;
- }());
- var EmitterVisitorContext = /** @class */ (function () {
- function EmitterVisitorContext(_indent) {
- this._indent = _indent;
- this._classes = [];
- this._preambleLineCount = 0;
- this._lines = [new _EmittedLine(_indent)];
- }
- EmitterVisitorContext.createRoot = function () { return new EmitterVisitorContext(0); };
- Object.defineProperty(EmitterVisitorContext.prototype, "_currentLine", {
- get: function () { return this._lines[this._lines.length - 1]; },
- enumerable: true,
- configurable: true
- });
- EmitterVisitorContext.prototype.println = function (from, lastPart) {
- if (lastPart === void 0) { lastPart = ''; }
- this.print(from || null, lastPart, true);
- };
- EmitterVisitorContext.prototype.lineIsEmpty = function () { return this._currentLine.parts.length === 0; };
- EmitterVisitorContext.prototype.lineLength = function () {
- return this._currentLine.indent * _INDENT_WITH.length + this._currentLine.partsLength;
- };
- EmitterVisitorContext.prototype.print = function (from, part, newLine) {
- if (newLine === void 0) { newLine = false; }
- if (part.length > 0) {
- this._currentLine.parts.push(part);
- this._currentLine.partsLength += part.length;
- this._currentLine.srcSpans.push(from && from.sourceSpan || null);
- }
- if (newLine) {
- this._lines.push(new _EmittedLine(this._indent));
- }
- };
- EmitterVisitorContext.prototype.removeEmptyLastLine = function () {
- if (this.lineIsEmpty()) {
- this._lines.pop();
- }
- };
- EmitterVisitorContext.prototype.incIndent = function () {
- this._indent++;
- if (this.lineIsEmpty()) {
- this._currentLine.indent = this._indent;
- }
- };
- EmitterVisitorContext.prototype.decIndent = function () {
- this._indent--;
- if (this.lineIsEmpty()) {
- this._currentLine.indent = this._indent;
- }
- };
- EmitterVisitorContext.prototype.pushClass = function (clazz) { this._classes.push(clazz); };
- EmitterVisitorContext.prototype.popClass = function () { return this._classes.pop(); };
- Object.defineProperty(EmitterVisitorContext.prototype, "currentClass", {
- get: function () {
- return this._classes.length > 0 ? this._classes[this._classes.length - 1] : null;
- },
- enumerable: true,
- configurable: true
- });
- EmitterVisitorContext.prototype.toSource = function () {
- return this.sourceLines
- .map(function (l) { return l.parts.length > 0 ? _createIndent(l.indent) + l.parts.join('') : ''; })
- .join('\n');
- };
- EmitterVisitorContext.prototype.toSourceMapGenerator = function (genFilePath, startsAtLine) {
- if (startsAtLine === void 0) { startsAtLine = 0; }
- var map = new SourceMapGenerator(genFilePath);
- var firstOffsetMapped = false;
- var mapFirstOffsetIfNeeded = function () {
- if (!firstOffsetMapped) {
- // Add a single space so that tools won't try to load the file from disk.
- // Note: We are using virtual urls like `ng:///`, so we have to
- // provide a content here.
- map.addSource(genFilePath, ' ').addMapping(0, genFilePath, 0, 0);
- firstOffsetMapped = true;
- }
- };
- for (var i = 0; i < startsAtLine; i++) {
- map.addLine();
- mapFirstOffsetIfNeeded();
- }
- this.sourceLines.forEach(function (line, lineIdx) {
- map.addLine();
- var spans = line.srcSpans;
- var parts = line.parts;
- var col0 = line.indent * _INDENT_WITH.length;
- var spanIdx = 0;
- // skip leading parts without source spans
- while (spanIdx < spans.length && !spans[spanIdx]) {
- col0 += parts[spanIdx].length;
- spanIdx++;
- }
- if (spanIdx < spans.length && lineIdx === 0 && col0 === 0) {
- firstOffsetMapped = true;
- }
- else {
- mapFirstOffsetIfNeeded();
- }
- while (spanIdx < spans.length) {
- var span = spans[spanIdx];
- var source = span.start.file;
- var sourceLine = span.start.line;
- var sourceCol = span.start.col;
- map.addSource(source.url, source.content)
- .addMapping(col0, source.url, sourceLine, sourceCol);
- col0 += parts[spanIdx].length;
- spanIdx++;
- // assign parts without span or the same span to the previous segment
- while (spanIdx < spans.length && (span === spans[spanIdx] || !spans[spanIdx])) {
- col0 += parts[spanIdx].length;
- spanIdx++;
- }
- }
- });
- return map;
- };
- EmitterVisitorContext.prototype.setPreambleLineCount = function (count) { return this._preambleLineCount = count; };
- EmitterVisitorContext.prototype.spanOf = function (line, column) {
- var emittedLine = this._lines[line - this._preambleLineCount];
- if (emittedLine) {
- var columnsLeft = column - _createIndent(emittedLine.indent).length;
- for (var partIndex = 0; partIndex < emittedLine.parts.length; partIndex++) {
- var part = emittedLine.parts[partIndex];
- if (part.length > columnsLeft) {
- return emittedLine.srcSpans[partIndex];
- }
- columnsLeft -= part.length;
- }
- }
- return null;
- };
- Object.defineProperty(EmitterVisitorContext.prototype, "sourceLines", {
- get: function () {
- if (this._lines.length && this._lines[this._lines.length - 1].parts.length === 0) {
- return this._lines.slice(0, -1);
- }
- return this._lines;
- },
- enumerable: true,
- configurable: true
- });
- return EmitterVisitorContext;
- }());
- var AbstractEmitterVisitor = /** @class */ (function () {
- function AbstractEmitterVisitor(_escapeDollarInStrings) {
- this._escapeDollarInStrings = _escapeDollarInStrings;
- }
- AbstractEmitterVisitor.prototype.visitExpressionStmt = function (stmt, ctx) {
- stmt.expr.visitExpression(this, ctx);
- ctx.println(stmt, ';');
- return null;
- };
- AbstractEmitterVisitor.prototype.visitReturnStmt = function (stmt, ctx) {
- ctx.print(stmt, "return ");
- stmt.value.visitExpression(this, ctx);
- ctx.println(stmt, ';');
- return null;
- };
- AbstractEmitterVisitor.prototype.visitIfStmt = function (stmt, ctx) {
- ctx.print(stmt, "if (");
- stmt.condition.visitExpression(this, ctx);
- ctx.print(stmt, ") {");
- var hasElseCase = stmt.falseCase != null && stmt.falseCase.length > 0;
- if (stmt.trueCase.length <= 1 && !hasElseCase) {
- ctx.print(stmt, " ");
- this.visitAllStatements(stmt.trueCase, ctx);
- ctx.removeEmptyLastLine();
- ctx.print(stmt, " ");
- }
- else {
- ctx.println();
- ctx.incIndent();
- this.visitAllStatements(stmt.trueCase, ctx);
- ctx.decIndent();
- if (hasElseCase) {
- ctx.println(stmt, "} else {");
- ctx.incIndent();
- this.visitAllStatements(stmt.falseCase, ctx);
- ctx.decIndent();
- }
- }
- ctx.println(stmt, "}");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitThrowStmt = function (stmt, ctx) {
- ctx.print(stmt, "throw ");
- stmt.error.visitExpression(this, ctx);
- ctx.println(stmt, ";");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitCommentStmt = function (stmt, ctx) {
- if (stmt.multiline) {
- ctx.println(stmt, "/* " + stmt.comment + " */");
- }
- else {
- stmt.comment.split('\n').forEach(function (line) { ctx.println(stmt, "// " + line); });
- }
- return null;
- };
- AbstractEmitterVisitor.prototype.visitJSDocCommentStmt = function (stmt, ctx) {
- ctx.println(stmt, "/*" + stmt.toString() + "*/");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitWriteVarExpr = function (expr, ctx) {
- var lineWasEmpty = ctx.lineIsEmpty();
- if (!lineWasEmpty) {
- ctx.print(expr, '(');
- }
- ctx.print(expr, expr.name + " = ");
- expr.value.visitExpression(this, ctx);
- if (!lineWasEmpty) {
- ctx.print(expr, ')');
- }
- return null;
- };
- AbstractEmitterVisitor.prototype.visitWriteKeyExpr = function (expr, ctx) {
- var lineWasEmpty = ctx.lineIsEmpty();
- if (!lineWasEmpty) {
- ctx.print(expr, '(');
- }
- expr.receiver.visitExpression(this, ctx);
- ctx.print(expr, "[");
- expr.index.visitExpression(this, ctx);
- ctx.print(expr, "] = ");
- expr.value.visitExpression(this, ctx);
- if (!lineWasEmpty) {
- ctx.print(expr, ')');
- }
- return null;
- };
- AbstractEmitterVisitor.prototype.visitWritePropExpr = function (expr, ctx) {
- var lineWasEmpty = ctx.lineIsEmpty();
- if (!lineWasEmpty) {
- ctx.print(expr, '(');
- }
- expr.receiver.visitExpression(this, ctx);
- ctx.print(expr, "." + expr.name + " = ");
- expr.value.visitExpression(this, ctx);
- if (!lineWasEmpty) {
- ctx.print(expr, ')');
- }
- return null;
- };
- AbstractEmitterVisitor.prototype.visitInvokeMethodExpr = function (expr, ctx) {
- expr.receiver.visitExpression(this, ctx);
- var name = expr.name;
- if (expr.builtin != null) {
- name = this.getBuiltinMethodName(expr.builtin);
- if (name == null) {
- // some builtins just mean to skip the call.
- return null;
- }
- }
- ctx.print(expr, "." + name + "(");
- this.visitAllExpressions(expr.args, ctx, ",");
- ctx.print(expr, ")");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitInvokeFunctionExpr = function (expr, ctx) {
- expr.fn.visitExpression(this, ctx);
- ctx.print(expr, "(");
- this.visitAllExpressions(expr.args, ctx, ',');
- ctx.print(expr, ")");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitWrappedNodeExpr = function (ast, ctx) {
- throw new Error('Abstract emitter cannot visit WrappedNodeExpr.');
- };
- AbstractEmitterVisitor.prototype.visitTypeofExpr = function (expr, ctx) {
- ctx.print(expr, 'typeof ');
- expr.expr.visitExpression(this, ctx);
- };
- AbstractEmitterVisitor.prototype.visitReadVarExpr = function (ast, ctx) {
- var varName = ast.name;
- if (ast.builtin != null) {
- switch (ast.builtin) {
- case BuiltinVar.Super:
- varName = 'super';
- break;
- case BuiltinVar.This:
- varName = 'this';
- break;
- case BuiltinVar.CatchError:
- varName = CATCH_ERROR_VAR$1.name;
- break;
- case BuiltinVar.CatchStack:
- varName = CATCH_STACK_VAR$1.name;
- break;
- default:
- throw new Error("Unknown builtin variable " + ast.builtin);
- }
- }
- ctx.print(ast, varName);
- return null;
- };
- AbstractEmitterVisitor.prototype.visitInstantiateExpr = function (ast, ctx) {
- ctx.print(ast, "new ");
- ast.classExpr.visitExpression(this, ctx);
- ctx.print(ast, "(");
- this.visitAllExpressions(ast.args, ctx, ',');
- ctx.print(ast, ")");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitLiteralExpr = function (ast, ctx) {
- var value = ast.value;
- if (typeof value === 'string') {
- ctx.print(ast, escapeIdentifier(value, this._escapeDollarInStrings));
- }
- else {
- ctx.print(ast, "" + value);
- }
- return null;
- };
- AbstractEmitterVisitor.prototype.visitConditionalExpr = function (ast, ctx) {
- ctx.print(ast, "(");
- ast.condition.visitExpression(this, ctx);
- ctx.print(ast, '? ');
- ast.trueCase.visitExpression(this, ctx);
- ctx.print(ast, ': ');
- ast.falseCase.visitExpression(this, ctx);
- ctx.print(ast, ")");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitNotExpr = function (ast, ctx) {
- ctx.print(ast, '!');
- ast.condition.visitExpression(this, ctx);
- return null;
- };
- AbstractEmitterVisitor.prototype.visitAssertNotNullExpr = function (ast, ctx) {
- ast.condition.visitExpression(this, ctx);
- return null;
- };
- AbstractEmitterVisitor.prototype.visitBinaryOperatorExpr = function (ast, ctx) {
- var opStr;
- switch (ast.operator) {
- case BinaryOperator.Equals:
- opStr = '==';
- break;
- case BinaryOperator.Identical:
- opStr = '===';
- break;
- case BinaryOperator.NotEquals:
- opStr = '!=';
- break;
- case BinaryOperator.NotIdentical:
- opStr = '!==';
- break;
- case BinaryOperator.And:
- opStr = '&&';
- break;
- case BinaryOperator.BitwiseAnd:
- opStr = '&';
- break;
- case BinaryOperator.Or:
- opStr = '||';
- break;
- case BinaryOperator.Plus:
- opStr = '+';
- break;
- case BinaryOperator.Minus:
- opStr = '-';
- break;
- case BinaryOperator.Divide:
- opStr = '/';
- break;
- case BinaryOperator.Multiply:
- opStr = '*';
- break;
- case BinaryOperator.Modulo:
- opStr = '%';
- break;
- case BinaryOperator.Lower:
- opStr = '<';
- break;
- case BinaryOperator.LowerEquals:
- opStr = '<=';
- break;
- case BinaryOperator.Bigger:
- opStr = '>';
- break;
- case BinaryOperator.BiggerEquals:
- opStr = '>=';
- break;
- default:
- throw new Error("Unknown operator " + ast.operator);
- }
- if (ast.parens)
- ctx.print(ast, "(");
- ast.lhs.visitExpression(this, ctx);
- ctx.print(ast, " " + opStr + " ");
- ast.rhs.visitExpression(this, ctx);
- if (ast.parens)
- ctx.print(ast, ")");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitReadPropExpr = function (ast, ctx) {
- ast.receiver.visitExpression(this, ctx);
- ctx.print(ast, ".");
- ctx.print(ast, ast.name);
- return null;
- };
- AbstractEmitterVisitor.prototype.visitReadKeyExpr = function (ast, ctx) {
- ast.receiver.visitExpression(this, ctx);
- ctx.print(ast, "[");
- ast.index.visitExpression(this, ctx);
- ctx.print(ast, "]");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitLiteralArrayExpr = function (ast, ctx) {
- ctx.print(ast, "[");
- this.visitAllExpressions(ast.entries, ctx, ',');
- ctx.print(ast, "]");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitLiteralMapExpr = function (ast, ctx) {
- var _this = this;
- ctx.print(ast, "{");
- this.visitAllObjects(function (entry) {
- ctx.print(ast, escapeIdentifier(entry.key, _this._escapeDollarInStrings, entry.quoted) + ":");
- entry.value.visitExpression(_this, ctx);
- }, ast.entries, ctx, ',');
- ctx.print(ast, "}");
- return null;
- };
- AbstractEmitterVisitor.prototype.visitCommaExpr = function (ast, ctx) {
- ctx.print(ast, '(');
- this.visitAllExpressions(ast.parts, ctx, ',');
- ctx.print(ast, ')');
- return null;
- };
- AbstractEmitterVisitor.prototype.visitAllExpressions = function (expressions, ctx, separator) {
- var _this = this;
- this.visitAllObjects(function (expr) { return expr.visitExpression(_this, ctx); }, expressions, ctx, separator);
- };
- AbstractEmitterVisitor.prototype.visitAllObjects = function (handler, expressions, ctx, separator) {
- var incrementedIndent = false;
- for (var i = 0; i < expressions.length; i++) {
- if (i > 0) {
- if (ctx.lineLength() > 80) {
- ctx.print(null, separator, true);
- if (!incrementedIndent) {
- // continuation are marked with double indent.
- ctx.incIndent();
- ctx.incIndent();
- incrementedIndent = true;
- }
- }
- else {
- ctx.print(null, separator, false);
- }
- }
- handler(expressions[i]);
- }
- if (incrementedIndent) {
- // continuation are marked with double indent.
- ctx.decIndent();
- ctx.decIndent();
- }
- };
- AbstractEmitterVisitor.prototype.visitAllStatements = function (statements, ctx) {
- var _this = this;
- statements.forEach(function (stmt) { return stmt.visitStatement(_this, ctx); });
- };
- return AbstractEmitterVisitor;
- }());
- function escapeIdentifier(input, escapeDollar, alwaysQuote) {
- if (alwaysQuote === void 0) { alwaysQuote = true; }
- if (input == null) {
- return null;
- }
- var body = input.replace(_SINGLE_QUOTE_ESCAPE_STRING_RE, function () {
- var match = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- match[_i] = arguments[_i];
- }
- if (match[0] == '$') {
- return escapeDollar ? '\\$' : '$';
- }
- else if (match[0] == '\n') {
- return '\\n';
- }
- else if (match[0] == '\r') {
- return '\\r';
- }
- else {
- return "\\" + match[0];
- }
- });
- var requiresQuotes = alwaysQuote || !_LEGAL_IDENTIFIER_RE.test(body);
- return requiresQuotes ? "'" + body + "'" : body;
- }
- function _createIndent(count) {
- var res = '';
- for (var i = 0; i < count; i++) {
- res += _INDENT_WITH;
- }
- return res;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var AbstractJsEmitterVisitor = /** @class */ (function (_super) {
- __extends(AbstractJsEmitterVisitor, _super);
- function AbstractJsEmitterVisitor() {
- return _super.call(this, false) || this;
- }
- AbstractJsEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) {
- var _this = this;
- ctx.pushClass(stmt);
- this._visitClassConstructor(stmt, ctx);
- if (stmt.parent != null) {
- ctx.print(stmt, stmt.name + ".prototype = Object.create(");
- stmt.parent.visitExpression(this, ctx);
- ctx.println(stmt, ".prototype);");
- }
- stmt.getters.forEach(function (getter) { return _this._visitClassGetter(stmt, getter, ctx); });
- stmt.methods.forEach(function (method) { return _this._visitClassMethod(stmt, method, ctx); });
- ctx.popClass();
- return null;
- };
- AbstractJsEmitterVisitor.prototype._visitClassConstructor = function (stmt, ctx) {
- ctx.print(stmt, "function " + stmt.name + "(");
- if (stmt.constructorMethod != null) {
- this._visitParams(stmt.constructorMethod.params, ctx);
- }
- ctx.println(stmt, ") {");
- ctx.incIndent();
- if (stmt.constructorMethod != null) {
- if (stmt.constructorMethod.body.length > 0) {
- ctx.println(stmt, "var self = this;");
- this.visitAllStatements(stmt.constructorMethod.body, ctx);
- }
- }
- ctx.decIndent();
- ctx.println(stmt, "}");
- };
- AbstractJsEmitterVisitor.prototype._visitClassGetter = function (stmt, getter, ctx) {
- ctx.println(stmt, "Object.defineProperty(" + stmt.name + ".prototype, '" + getter.name + "', { get: function() {");
- ctx.incIndent();
- if (getter.body.length > 0) {
- ctx.println(stmt, "var self = this;");
- this.visitAllStatements(getter.body, ctx);
- }
- ctx.decIndent();
- ctx.println(stmt, "}});");
- };
- AbstractJsEmitterVisitor.prototype._visitClassMethod = function (stmt, method, ctx) {
- ctx.print(stmt, stmt.name + ".prototype." + method.name + " = function(");
- this._visitParams(method.params, ctx);
- ctx.println(stmt, ") {");
- ctx.incIndent();
- if (method.body.length > 0) {
- ctx.println(stmt, "var self = this;");
- this.visitAllStatements(method.body, ctx);
- }
- ctx.decIndent();
- ctx.println(stmt, "};");
- };
- AbstractJsEmitterVisitor.prototype.visitWrappedNodeExpr = function (ast, ctx) {
- throw new Error('Cannot emit a WrappedNodeExpr in Javascript.');
- };
- AbstractJsEmitterVisitor.prototype.visitReadVarExpr = function (ast, ctx) {
- if (ast.builtin === BuiltinVar.This) {
- ctx.print(ast, 'self');
- }
- else if (ast.builtin === BuiltinVar.Super) {
- throw new Error("'super' needs to be handled at a parent ast node, not at the variable level!");
- }
- else {
- _super.prototype.visitReadVarExpr.call(this, ast, ctx);
- }
- return null;
- };
- AbstractJsEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) {
- ctx.print(stmt, "var " + stmt.name);
- if (stmt.value) {
- ctx.print(stmt, ' = ');
- stmt.value.visitExpression(this, ctx);
- }
- ctx.println(stmt, ";");
- return null;
- };
- AbstractJsEmitterVisitor.prototype.visitCastExpr = function (ast, ctx) {
- ast.value.visitExpression(this, ctx);
- return null;
- };
- AbstractJsEmitterVisitor.prototype.visitInvokeFunctionExpr = function (expr, ctx) {
- var fnExpr = expr.fn;
- if (fnExpr instanceof ReadVarExpr && fnExpr.builtin === BuiltinVar.Super) {
- ctx.currentClass.parent.visitExpression(this, ctx);
- ctx.print(expr, ".call(this");
- if (expr.args.length > 0) {
- ctx.print(expr, ", ");
- this.visitAllExpressions(expr.args, ctx, ',');
- }
- ctx.print(expr, ")");
- }
- else {
- _super.prototype.visitInvokeFunctionExpr.call(this, expr, ctx);
- }
- return null;
- };
- AbstractJsEmitterVisitor.prototype.visitFunctionExpr = function (ast, ctx) {
- ctx.print(ast, "function" + (ast.name ? ' ' + ast.name : '') + "(");
- this._visitParams(ast.params, ctx);
- ctx.println(ast, ") {");
- ctx.incIndent();
- this.visitAllStatements(ast.statements, ctx);
- ctx.decIndent();
- ctx.print(ast, "}");
- return null;
- };
- AbstractJsEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {
- ctx.print(stmt, "function " + stmt.name + "(");
- this._visitParams(stmt.params, ctx);
- ctx.println(stmt, ") {");
- ctx.incIndent();
- this.visitAllStatements(stmt.statements, ctx);
- ctx.decIndent();
- ctx.println(stmt, "}");
- return null;
- };
- AbstractJsEmitterVisitor.prototype.visitTryCatchStmt = function (stmt, ctx) {
- ctx.println(stmt, "try {");
- ctx.incIndent();
- this.visitAllStatements(stmt.bodyStmts, ctx);
- ctx.decIndent();
- ctx.println(stmt, "} catch (" + CATCH_ERROR_VAR$1.name + ") {");
- ctx.incIndent();
- var catchStmts = [CATCH_STACK_VAR$1.set(CATCH_ERROR_VAR$1.prop('stack')).toDeclStmt(null, [
- StmtModifier.Final
- ])].concat(stmt.catchStmts);
- this.visitAllStatements(catchStmts, ctx);
- ctx.decIndent();
- ctx.println(stmt, "}");
- return null;
- };
- AbstractJsEmitterVisitor.prototype._visitParams = function (params, ctx) {
- this.visitAllObjects(function (param) { return ctx.print(null, param.name); }, params, ctx, ',');
- };
- AbstractJsEmitterVisitor.prototype.getBuiltinMethodName = function (method) {
- var name;
- switch (method) {
- case BuiltinMethod.ConcatArray:
- name = 'concat';
- break;
- case BuiltinMethod.SubscribeObservable:
- name = 'subscribe';
- break;
- case BuiltinMethod.Bind:
- name = 'bind';
- break;
- default:
- throw new Error("Unknown builtin method: " + method);
- }
- return name;
- };
- return AbstractJsEmitterVisitor;
- }(AbstractEmitterVisitor));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A helper class to manage the evaluation of JIT generated code.
- */
- var JitEvaluator = /** @class */ (function () {
- function JitEvaluator() {
- }
- /**
- *
- * @param sourceUrl The URL of the generated code.
- * @param statements An array of Angular statement AST nodes to be evaluated.
- * @param reflector A helper used when converting the statements to executable code.
- * @param createSourceMaps If true then create a source-map for the generated code and include it
- * inline as a source-map comment.
- * @returns A map of all the variables in the generated code.
- */
- JitEvaluator.prototype.evaluateStatements = function (sourceUrl, statements, reflector, createSourceMaps) {
- var converter = new JitEmitterVisitor(reflector);
- var ctx = EmitterVisitorContext.createRoot();
- // Ensure generated code is in strict mode
- if (statements.length > 0 && !isUseStrictStatement(statements[0])) {
- statements = __spread([
- literal('use strict').toStmt()
- ], statements);
- }
- converter.visitAllStatements(statements, ctx);
- converter.createReturnStmt(ctx);
- return this.evaluateCode(sourceUrl, ctx, converter.getArgs(), createSourceMaps);
- };
- /**
- * Evaluate a piece of JIT generated code.
- * @param sourceUrl The URL of this generated code.
- * @param ctx A context object that contains an AST of the code to be evaluated.
- * @param vars A map containing the names and values of variables that the evaluated code might
- * reference.
- * @param createSourceMap If true then create a source-map for the generated code and include it
- * inline as a source-map comment.
- * @returns The result of evaluating the code.
- */
- JitEvaluator.prototype.evaluateCode = function (sourceUrl, ctx, vars, createSourceMap) {
- var fnBody = "\"use strict\";" + ctx.toSource() + "\n//# sourceURL=" + sourceUrl;
- var fnArgNames = [];
- var fnArgValues = [];
- for (var argName in vars) {
- fnArgValues.push(vars[argName]);
- fnArgNames.push(argName);
- }
- if (createSourceMap) {
- // using `new Function(...)` generates a header, 1 line of no arguments, 2 lines otherwise
- // E.g. ```
- // function anonymous(a,b,c
- // /**/) { ... }```
- // We don't want to hard code this fact, so we auto detect it via an empty function first.
- var emptyFn = new (Function.bind.apply(Function, __spread([void 0], fnArgNames.concat('return null;'))))().toString();
- var headerLines = emptyFn.slice(0, emptyFn.indexOf('return null;')).split('\n').length - 1;
- fnBody += "\n" + ctx.toSourceMapGenerator(sourceUrl, headerLines).toJsComment();
- }
- var fn = new (Function.bind.apply(Function, __spread([void 0], fnArgNames.concat(fnBody))))();
- return this.executeFunction(fn, fnArgValues);
- };
- /**
- * Execute a JIT generated function by calling it.
- *
- * This method can be overridden in tests to capture the functions that are generated
- * by this `JitEvaluator` class.
- *
- * @param fn A function to execute.
- * @param args The arguments to pass to the function being executed.
- * @returns The return value of the executed function.
- */
- JitEvaluator.prototype.executeFunction = function (fn, args) { return fn.apply(void 0, __spread(args)); };
- return JitEvaluator;
- }());
- /**
- * An Angular AST visitor that converts AST nodes into executable JavaScript code.
- */
- var JitEmitterVisitor = /** @class */ (function (_super) {
- __extends(JitEmitterVisitor, _super);
- function JitEmitterVisitor(reflector) {
- var _this = _super.call(this) || this;
- _this.reflector = reflector;
- _this._evalArgNames = [];
- _this._evalArgValues = [];
- _this._evalExportedVars = [];
- return _this;
- }
- JitEmitterVisitor.prototype.createReturnStmt = function (ctx) {
- var stmt = new ReturnStatement(new LiteralMapExpr(this._evalExportedVars.map(function (resultVar) { return new LiteralMapEntry(resultVar, variable(resultVar), false); })));
- stmt.visitStatement(this, ctx);
- };
- JitEmitterVisitor.prototype.getArgs = function () {
- var result = {};
- for (var i = 0; i < this._evalArgNames.length; i++) {
- result[this._evalArgNames[i]] = this._evalArgValues[i];
- }
- return result;
- };
- JitEmitterVisitor.prototype.visitExternalExpr = function (ast, ctx) {
- this._emitReferenceToExternal(ast, this.reflector.resolveExternalReference(ast.value), ctx);
- return null;
- };
- JitEmitterVisitor.prototype.visitWrappedNodeExpr = function (ast, ctx) {
- this._emitReferenceToExternal(ast, ast.node, ctx);
- return null;
- };
- JitEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) {
- if (stmt.hasModifier(StmtModifier.Exported)) {
- this._evalExportedVars.push(stmt.name);
- }
- return _super.prototype.visitDeclareVarStmt.call(this, stmt, ctx);
- };
- JitEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {
- if (stmt.hasModifier(StmtModifier.Exported)) {
- this._evalExportedVars.push(stmt.name);
- }
- return _super.prototype.visitDeclareFunctionStmt.call(this, stmt, ctx);
- };
- JitEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) {
- if (stmt.hasModifier(StmtModifier.Exported)) {
- this._evalExportedVars.push(stmt.name);
- }
- return _super.prototype.visitDeclareClassStmt.call(this, stmt, ctx);
- };
- JitEmitterVisitor.prototype._emitReferenceToExternal = function (ast, value, ctx) {
- var id = this._evalArgValues.indexOf(value);
- if (id === -1) {
- id = this._evalArgValues.length;
- this._evalArgValues.push(value);
- var name_1 = identifierName({ reference: value }) || 'val';
- this._evalArgNames.push("jit_" + name_1 + "_" + id);
- }
- ctx.print(ast, this._evalArgNames[id]);
- };
- return JitEmitterVisitor;
- }(AbstractJsEmitterVisitor));
- function isUseStrictStatement(statement) {
- return statement.isEquivalent(literal('use strict').toStmt());
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Implementation of `CompileReflector` which resolves references to @angular/core
- * symbols at runtime, according to a consumer-provided mapping.
- *
- * Only supports `resolveExternalReference`, all other methods throw.
- */
- var R3JitReflector = /** @class */ (function () {
- function R3JitReflector(context) {
- this.context = context;
- }
- R3JitReflector.prototype.resolveExternalReference = function (ref) {
- // This reflector only handles @angular/core imports.
- if (ref.moduleName !== '@angular/core') {
- throw new Error("Cannot resolve external reference to " + ref.moduleName + ", only references to @angular/core are supported.");
- }
- if (!this.context.hasOwnProperty(ref.name)) {
- throw new Error("No value provided for @angular/core symbol '" + ref.name + "'.");
- }
- return this.context[ref.name];
- };
- R3JitReflector.prototype.parameters = function (typeOrFunc) { throw new Error('Not implemented.'); };
- R3JitReflector.prototype.annotations = function (typeOrFunc) { throw new Error('Not implemented.'); };
- R3JitReflector.prototype.shallowAnnotations = function (typeOrFunc) { throw new Error('Not implemented.'); };
- R3JitReflector.prototype.tryAnnotations = function (typeOrFunc) { throw new Error('Not implemented.'); };
- R3JitReflector.prototype.propMetadata = function (typeOrFunc) { throw new Error('Not implemented.'); };
- R3JitReflector.prototype.hasLifecycleHook = function (type, lcProperty) { throw new Error('Not implemented.'); };
- R3JitReflector.prototype.guards = function (typeOrFunc) { throw new Error('Not implemented.'); };
- R3JitReflector.prototype.componentModuleUrl = function (type, cmpMetadata) { throw new Error('Not implemented.'); };
- return R3JitReflector;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Construct an `R3NgModuleDef` for the given `R3NgModuleMetadata`.
- */
- function compileNgModule(meta) {
- var moduleType = meta.type, bootstrap = meta.bootstrap, declarations = meta.declarations, imports = meta.imports, exports = meta.exports, schemas = meta.schemas, containsForwardDecls = meta.containsForwardDecls, emitInline = meta.emitInline, id = meta.id;
- var additionalStatements = [];
- var definitionMap = {
- type: moduleType
- };
- // Only generate the keys in the metadata if the arrays have values.
- if (bootstrap.length) {
- definitionMap.bootstrap = refsToArray(bootstrap, containsForwardDecls);
- }
- // If requested to emit scope information inline, pass the declarations, imports and exports to
- // the `ɵɵdefineNgModule` call. The JIT compilation uses this.
- if (emitInline) {
- if (declarations.length) {
- definitionMap.declarations = refsToArray(declarations, containsForwardDecls);
- }
- if (imports.length) {
- definitionMap.imports = refsToArray(imports, containsForwardDecls);
- }
- if (exports.length) {
- definitionMap.exports = refsToArray(exports, containsForwardDecls);
- }
- }
- // If not emitting inline, the scope information is not passed into `ɵɵdefineNgModule` as it would
- // prevent tree-shaking of the declarations, imports and exports references.
- else {
- var setNgModuleScopeCall = generateSetNgModuleScopeCall(meta);
- if (setNgModuleScopeCall !== null) {
- additionalStatements.push(setNgModuleScopeCall);
- }
- }
- if (schemas && schemas.length) {
- definitionMap.schemas = literalArr(schemas.map(function (ref) { return ref.value; }));
- }
- if (id) {
- definitionMap.id = id;
- }
- var expression = importExpr(Identifiers$1.defineNgModule).callFn([mapToMapExpression(definitionMap)]);
- var type = new ExpressionType(importExpr(Identifiers$1.NgModuleDefWithMeta, [
- new ExpressionType(moduleType), tupleTypeOf(declarations), tupleTypeOf(imports),
- tupleTypeOf(exports)
- ]));
- return { expression: expression, type: type, additionalStatements: additionalStatements };
- }
- /**
- * Generates a function call to `ɵɵsetNgModuleScope` with all necessary information so that the
- * transitive module scope can be computed during runtime in JIT mode. This call is marked pure
- * such that the references to declarations, imports and exports may be elided causing these
- * symbols to become tree-shakeable.
- */
- function generateSetNgModuleScopeCall(meta) {
- var moduleType = meta.type, declarations = meta.declarations, imports = meta.imports, exports = meta.exports, containsForwardDecls = meta.containsForwardDecls;
- var scopeMap = {};
- if (declarations.length) {
- scopeMap.declarations = refsToArray(declarations, containsForwardDecls);
- }
- if (imports.length) {
- scopeMap.imports = refsToArray(imports, containsForwardDecls);
- }
- if (exports.length) {
- scopeMap.exports = refsToArray(exports, containsForwardDecls);
- }
- if (Object.keys(scopeMap).length === 0) {
- return null;
- }
- var fnCall = new InvokeFunctionExpr(
- /* fn */ importExpr(Identifiers$1.setNgModuleScope),
- /* args */ [moduleType, mapToMapExpression(scopeMap)],
- /* type */ undefined,
- /* sourceSpan */ undefined,
- /* pure */ true);
- return fnCall.toStmt();
- }
- function compileInjector(meta) {
- var result = compileFactoryFunction({
- name: meta.name,
- type: meta.type,
- deps: meta.deps,
- injectFn: Identifiers$1.inject,
- });
- var definitionMap = {
- factory: result.factory,
- };
- if (meta.providers !== null) {
- definitionMap.providers = meta.providers;
- }
- if (meta.imports.length > 0) {
- definitionMap.imports = literalArr(meta.imports);
- }
- var expression = importExpr(Identifiers$1.defineInjector).callFn([mapToMapExpression(definitionMap)]);
- var type = new ExpressionType(importExpr(Identifiers$1.InjectorDef, [new ExpressionType(meta.type)]));
- return { expression: expression, type: type, statements: result.statements };
- }
- function tupleTypeOf(exp) {
- var types = exp.map(function (ref) { return typeofExpr(ref.type); });
- return exp.length > 0 ? expressionType(literalArr(types)) : NONE_TYPE;
- }
- function refsToArray(refs, shouldForwardDeclare) {
- var values = literalArr(refs.map(function (ref) { return ref.value; }));
- return shouldForwardDeclare ? fn([], [new ReturnStatement(values)]) : values;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function compilePipeFromMetadata(metadata) {
- var definitionMapValues = [];
- // e.g. `name: 'myPipe'`
- definitionMapValues.push({ key: 'name', value: literal(metadata.pipeName), quoted: false });
- // e.g. `type: MyPipe`
- definitionMapValues.push({ key: 'type', value: metadata.type, quoted: false });
- var templateFactory = compileFactoryFunction({
- name: metadata.name,
- type: metadata.type,
- deps: metadata.deps,
- injectFn: Identifiers$1.directiveInject,
- });
- definitionMapValues.push({ key: 'factory', value: templateFactory.factory, quoted: false });
- // e.g. `pure: true`
- definitionMapValues.push({ key: 'pure', value: literal(metadata.pure), quoted: false });
- var expression = importExpr(Identifiers$1.definePipe).callFn([literalMap(definitionMapValues)]);
- var type = new ExpressionType(importExpr(Identifiers$1.PipeDefWithMeta, [
- typeWithParameters(metadata.type, metadata.typeArgumentCount),
- new ExpressionType(new LiteralExpr(metadata.pipeName)),
- ]));
- return { expression: expression, type: type, statements: templateFactory.statements };
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ParserError = /** @class */ (function () {
- function ParserError(message, input, errLocation, ctxLocation) {
- this.input = input;
- this.errLocation = errLocation;
- this.ctxLocation = ctxLocation;
- this.message = "Parser Error: " + message + " " + errLocation + " [" + input + "] in " + ctxLocation;
- }
- return ParserError;
- }());
- var ParseSpan = /** @class */ (function () {
- function ParseSpan(start, end) {
- this.start = start;
- this.end = end;
- }
- return ParseSpan;
- }());
- var AST = /** @class */ (function () {
- function AST(span) {
- this.span = span;
- }
- AST.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return null;
- };
- AST.prototype.toString = function () { return 'AST'; };
- return AST;
- }());
- /**
- * Represents a quoted expression of the form:
- *
- * quote = prefix `:` uninterpretedExpression
- * prefix = identifier
- * uninterpretedExpression = arbitrary string
- *
- * A quoted expression is meant to be pre-processed by an AST transformer that
- * converts it into another AST that no longer contains quoted expressions.
- * It is meant to allow third-party developers to extend Angular template
- * expression language. The `uninterpretedExpression` part of the quote is
- * therefore not interpreted by the Angular's own expression parser.
- */
- var Quote = /** @class */ (function (_super) {
- __extends(Quote, _super);
- function Quote(span, prefix, uninterpretedExpression, location) {
- var _this = _super.call(this, span) || this;
- _this.prefix = prefix;
- _this.uninterpretedExpression = uninterpretedExpression;
- _this.location = location;
- return _this;
- }
- Quote.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitQuote(this, context);
- };
- Quote.prototype.toString = function () { return 'Quote'; };
- return Quote;
- }(AST));
- var EmptyExpr = /** @class */ (function (_super) {
- __extends(EmptyExpr, _super);
- function EmptyExpr() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- EmptyExpr.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- // do nothing
- };
- return EmptyExpr;
- }(AST));
- var ImplicitReceiver = /** @class */ (function (_super) {
- __extends(ImplicitReceiver, _super);
- function ImplicitReceiver() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- ImplicitReceiver.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitImplicitReceiver(this, context);
- };
- return ImplicitReceiver;
- }(AST));
- /**
- * Multiple expressions separated by a semicolon.
- */
- var Chain = /** @class */ (function (_super) {
- __extends(Chain, _super);
- function Chain(span, expressions) {
- var _this = _super.call(this, span) || this;
- _this.expressions = expressions;
- return _this;
- }
- Chain.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitChain(this, context);
- };
- return Chain;
- }(AST));
- var Conditional = /** @class */ (function (_super) {
- __extends(Conditional, _super);
- function Conditional(span, condition, trueExp, falseExp) {
- var _this = _super.call(this, span) || this;
- _this.condition = condition;
- _this.trueExp = trueExp;
- _this.falseExp = falseExp;
- return _this;
- }
- Conditional.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitConditional(this, context);
- };
- return Conditional;
- }(AST));
- var PropertyRead = /** @class */ (function (_super) {
- __extends(PropertyRead, _super);
- function PropertyRead(span, receiver, name) {
- var _this = _super.call(this, span) || this;
- _this.receiver = receiver;
- _this.name = name;
- return _this;
- }
- PropertyRead.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitPropertyRead(this, context);
- };
- return PropertyRead;
- }(AST));
- var PropertyWrite = /** @class */ (function (_super) {
- __extends(PropertyWrite, _super);
- function PropertyWrite(span, receiver, name, value) {
- var _this = _super.call(this, span) || this;
- _this.receiver = receiver;
- _this.name = name;
- _this.value = value;
- return _this;
- }
- PropertyWrite.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitPropertyWrite(this, context);
- };
- return PropertyWrite;
- }(AST));
- var SafePropertyRead = /** @class */ (function (_super) {
- __extends(SafePropertyRead, _super);
- function SafePropertyRead(span, receiver, name) {
- var _this = _super.call(this, span) || this;
- _this.receiver = receiver;
- _this.name = name;
- return _this;
- }
- SafePropertyRead.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitSafePropertyRead(this, context);
- };
- return SafePropertyRead;
- }(AST));
- var KeyedRead = /** @class */ (function (_super) {
- __extends(KeyedRead, _super);
- function KeyedRead(span, obj, key) {
- var _this = _super.call(this, span) || this;
- _this.obj = obj;
- _this.key = key;
- return _this;
- }
- KeyedRead.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitKeyedRead(this, context);
- };
- return KeyedRead;
- }(AST));
- var KeyedWrite = /** @class */ (function (_super) {
- __extends(KeyedWrite, _super);
- function KeyedWrite(span, obj, key, value) {
- var _this = _super.call(this, span) || this;
- _this.obj = obj;
- _this.key = key;
- _this.value = value;
- return _this;
- }
- KeyedWrite.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitKeyedWrite(this, context);
- };
- return KeyedWrite;
- }(AST));
- var BindingPipe = /** @class */ (function (_super) {
- __extends(BindingPipe, _super);
- function BindingPipe(span, exp, name, args) {
- var _this = _super.call(this, span) || this;
- _this.exp = exp;
- _this.name = name;
- _this.args = args;
- return _this;
- }
- BindingPipe.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitPipe(this, context);
- };
- return BindingPipe;
- }(AST));
- var LiteralPrimitive = /** @class */ (function (_super) {
- __extends(LiteralPrimitive, _super);
- function LiteralPrimitive(span, value) {
- var _this = _super.call(this, span) || this;
- _this.value = value;
- return _this;
- }
- LiteralPrimitive.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitLiteralPrimitive(this, context);
- };
- return LiteralPrimitive;
- }(AST));
- var LiteralArray = /** @class */ (function (_super) {
- __extends(LiteralArray, _super);
- function LiteralArray(span, expressions) {
- var _this = _super.call(this, span) || this;
- _this.expressions = expressions;
- return _this;
- }
- LiteralArray.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitLiteralArray(this, context);
- };
- return LiteralArray;
- }(AST));
- var LiteralMap = /** @class */ (function (_super) {
- __extends(LiteralMap, _super);
- function LiteralMap(span, keys, values) {
- var _this = _super.call(this, span) || this;
- _this.keys = keys;
- _this.values = values;
- return _this;
- }
- LiteralMap.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitLiteralMap(this, context);
- };
- return LiteralMap;
- }(AST));
- var Interpolation = /** @class */ (function (_super) {
- __extends(Interpolation, _super);
- function Interpolation(span, strings, expressions) {
- var _this = _super.call(this, span) || this;
- _this.strings = strings;
- _this.expressions = expressions;
- return _this;
- }
- Interpolation.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitInterpolation(this, context);
- };
- return Interpolation;
- }(AST));
- var Binary = /** @class */ (function (_super) {
- __extends(Binary, _super);
- function Binary(span, operation, left, right) {
- var _this = _super.call(this, span) || this;
- _this.operation = operation;
- _this.left = left;
- _this.right = right;
- return _this;
- }
- Binary.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitBinary(this, context);
- };
- return Binary;
- }(AST));
- var PrefixNot = /** @class */ (function (_super) {
- __extends(PrefixNot, _super);
- function PrefixNot(span, expression) {
- var _this = _super.call(this, span) || this;
- _this.expression = expression;
- return _this;
- }
- PrefixNot.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitPrefixNot(this, context);
- };
- return PrefixNot;
- }(AST));
- var NonNullAssert = /** @class */ (function (_super) {
- __extends(NonNullAssert, _super);
- function NonNullAssert(span, expression) {
- var _this = _super.call(this, span) || this;
- _this.expression = expression;
- return _this;
- }
- NonNullAssert.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitNonNullAssert(this, context);
- };
- return NonNullAssert;
- }(AST));
- var MethodCall = /** @class */ (function (_super) {
- __extends(MethodCall, _super);
- function MethodCall(span, receiver, name, args) {
- var _this = _super.call(this, span) || this;
- _this.receiver = receiver;
- _this.name = name;
- _this.args = args;
- return _this;
- }
- MethodCall.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitMethodCall(this, context);
- };
- return MethodCall;
- }(AST));
- var SafeMethodCall = /** @class */ (function (_super) {
- __extends(SafeMethodCall, _super);
- function SafeMethodCall(span, receiver, name, args) {
- var _this = _super.call(this, span) || this;
- _this.receiver = receiver;
- _this.name = name;
- _this.args = args;
- return _this;
- }
- SafeMethodCall.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitSafeMethodCall(this, context);
- };
- return SafeMethodCall;
- }(AST));
- var FunctionCall = /** @class */ (function (_super) {
- __extends(FunctionCall, _super);
- function FunctionCall(span, target, args) {
- var _this = _super.call(this, span) || this;
- _this.target = target;
- _this.args = args;
- return _this;
- }
- FunctionCall.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return visitor.visitFunctionCall(this, context);
- };
- return FunctionCall;
- }(AST));
- var ASTWithSource = /** @class */ (function (_super) {
- __extends(ASTWithSource, _super);
- function ASTWithSource(ast, source, location, errors) {
- var _this = _super.call(this, new ParseSpan(0, source == null ? 0 : source.length)) || this;
- _this.ast = ast;
- _this.source = source;
- _this.location = location;
- _this.errors = errors;
- return _this;
- }
- ASTWithSource.prototype.visit = function (visitor, context) {
- if (context === void 0) { context = null; }
- return this.ast.visit(visitor, context);
- };
- ASTWithSource.prototype.toString = function () { return this.source + " in " + this.location; };
- return ASTWithSource;
- }(AST));
- var TemplateBinding = /** @class */ (function () {
- function TemplateBinding(span, key, keyIsVar, name, expression) {
- this.span = span;
- this.key = key;
- this.keyIsVar = keyIsVar;
- this.name = name;
- this.expression = expression;
- }
- return TemplateBinding;
- }());
- var NullAstVisitor = /** @class */ (function () {
- function NullAstVisitor() {
- }
- NullAstVisitor.prototype.visitBinary = function (ast, context) { };
- NullAstVisitor.prototype.visitChain = function (ast, context) { };
- NullAstVisitor.prototype.visitConditional = function (ast, context) { };
- NullAstVisitor.prototype.visitFunctionCall = function (ast, context) { };
- NullAstVisitor.prototype.visitImplicitReceiver = function (ast, context) { };
- NullAstVisitor.prototype.visitInterpolation = function (ast, context) { };
- NullAstVisitor.prototype.visitKeyedRead = function (ast, context) { };
- NullAstVisitor.prototype.visitKeyedWrite = function (ast, context) { };
- NullAstVisitor.prototype.visitLiteralArray = function (ast, context) { };
- NullAstVisitor.prototype.visitLiteralMap = function (ast, context) { };
- NullAstVisitor.prototype.visitLiteralPrimitive = function (ast, context) { };
- NullAstVisitor.prototype.visitMethodCall = function (ast, context) { };
- NullAstVisitor.prototype.visitPipe = function (ast, context) { };
- NullAstVisitor.prototype.visitPrefixNot = function (ast, context) { };
- NullAstVisitor.prototype.visitNonNullAssert = function (ast, context) { };
- NullAstVisitor.prototype.visitPropertyRead = function (ast, context) { };
- NullAstVisitor.prototype.visitPropertyWrite = function (ast, context) { };
- NullAstVisitor.prototype.visitQuote = function (ast, context) { };
- NullAstVisitor.prototype.visitSafeMethodCall = function (ast, context) { };
- NullAstVisitor.prototype.visitSafePropertyRead = function (ast, context) { };
- return NullAstVisitor;
- }());
- var RecursiveAstVisitor$1 = /** @class */ (function () {
- function RecursiveAstVisitor() {
- }
- RecursiveAstVisitor.prototype.visitBinary = function (ast, context) {
- ast.left.visit(this, context);
- ast.right.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitChain = function (ast, context) { return this.visitAll(ast.expressions, context); };
- RecursiveAstVisitor.prototype.visitConditional = function (ast, context) {
- ast.condition.visit(this, context);
- ast.trueExp.visit(this, context);
- ast.falseExp.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitPipe = function (ast, context) {
- ast.exp.visit(this, context);
- this.visitAll(ast.args, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitFunctionCall = function (ast, context) {
- ast.target.visit(this, context);
- this.visitAll(ast.args, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitImplicitReceiver = function (ast, context) { return null; };
- RecursiveAstVisitor.prototype.visitInterpolation = function (ast, context) {
- return this.visitAll(ast.expressions, context);
- };
- RecursiveAstVisitor.prototype.visitKeyedRead = function (ast, context) {
- ast.obj.visit(this, context);
- ast.key.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitKeyedWrite = function (ast, context) {
- ast.obj.visit(this, context);
- ast.key.visit(this, context);
- ast.value.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitLiteralArray = function (ast, context) {
- return this.visitAll(ast.expressions, context);
- };
- RecursiveAstVisitor.prototype.visitLiteralMap = function (ast, context) { return this.visitAll(ast.values, context); };
- RecursiveAstVisitor.prototype.visitLiteralPrimitive = function (ast, context) { return null; };
- RecursiveAstVisitor.prototype.visitMethodCall = function (ast, context) {
- ast.receiver.visit(this, context);
- return this.visitAll(ast.args, context);
- };
- RecursiveAstVisitor.prototype.visitPrefixNot = function (ast, context) {
- ast.expression.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitNonNullAssert = function (ast, context) {
- ast.expression.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitPropertyRead = function (ast, context) {
- ast.receiver.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitPropertyWrite = function (ast, context) {
- ast.receiver.visit(this, context);
- ast.value.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitSafePropertyRead = function (ast, context) {
- ast.receiver.visit(this, context);
- return null;
- };
- RecursiveAstVisitor.prototype.visitSafeMethodCall = function (ast, context) {
- ast.receiver.visit(this, context);
- return this.visitAll(ast.args, context);
- };
- RecursiveAstVisitor.prototype.visitAll = function (asts, context) {
- var _this = this;
- asts.forEach(function (ast) { return ast.visit(_this, context); });
- return null;
- };
- RecursiveAstVisitor.prototype.visitQuote = function (ast, context) { return null; };
- return RecursiveAstVisitor;
- }());
- var AstTransformer$1 = /** @class */ (function () {
- function AstTransformer() {
- }
- AstTransformer.prototype.visitImplicitReceiver = function (ast, context) { return ast; };
- AstTransformer.prototype.visitInterpolation = function (ast, context) {
- return new Interpolation(ast.span, ast.strings, this.visitAll(ast.expressions));
- };
- AstTransformer.prototype.visitLiteralPrimitive = function (ast, context) {
- return new LiteralPrimitive(ast.span, ast.value);
- };
- AstTransformer.prototype.visitPropertyRead = function (ast, context) {
- return new PropertyRead(ast.span, ast.receiver.visit(this), ast.name);
- };
- AstTransformer.prototype.visitPropertyWrite = function (ast, context) {
- return new PropertyWrite(ast.span, ast.receiver.visit(this), ast.name, ast.value.visit(this));
- };
- AstTransformer.prototype.visitSafePropertyRead = function (ast, context) {
- return new SafePropertyRead(ast.span, ast.receiver.visit(this), ast.name);
- };
- AstTransformer.prototype.visitMethodCall = function (ast, context) {
- return new MethodCall(ast.span, ast.receiver.visit(this), ast.name, this.visitAll(ast.args));
- };
- AstTransformer.prototype.visitSafeMethodCall = function (ast, context) {
- return new SafeMethodCall(ast.span, ast.receiver.visit(this), ast.name, this.visitAll(ast.args));
- };
- AstTransformer.prototype.visitFunctionCall = function (ast, context) {
- return new FunctionCall(ast.span, ast.target.visit(this), this.visitAll(ast.args));
- };
- AstTransformer.prototype.visitLiteralArray = function (ast, context) {
- return new LiteralArray(ast.span, this.visitAll(ast.expressions));
- };
- AstTransformer.prototype.visitLiteralMap = function (ast, context) {
- return new LiteralMap(ast.span, ast.keys, this.visitAll(ast.values));
- };
- AstTransformer.prototype.visitBinary = function (ast, context) {
- return new Binary(ast.span, ast.operation, ast.left.visit(this), ast.right.visit(this));
- };
- AstTransformer.prototype.visitPrefixNot = function (ast, context) {
- return new PrefixNot(ast.span, ast.expression.visit(this));
- };
- AstTransformer.prototype.visitNonNullAssert = function (ast, context) {
- return new NonNullAssert(ast.span, ast.expression.visit(this));
- };
- AstTransformer.prototype.visitConditional = function (ast, context) {
- return new Conditional(ast.span, ast.condition.visit(this), ast.trueExp.visit(this), ast.falseExp.visit(this));
- };
- AstTransformer.prototype.visitPipe = function (ast, context) {
- return new BindingPipe(ast.span, ast.exp.visit(this), ast.name, this.visitAll(ast.args));
- };
- AstTransformer.prototype.visitKeyedRead = function (ast, context) {
- return new KeyedRead(ast.span, ast.obj.visit(this), ast.key.visit(this));
- };
- AstTransformer.prototype.visitKeyedWrite = function (ast, context) {
- return new KeyedWrite(ast.span, ast.obj.visit(this), ast.key.visit(this), ast.value.visit(this));
- };
- AstTransformer.prototype.visitAll = function (asts) {
- var res = new Array(asts.length);
- for (var i = 0; i < asts.length; ++i) {
- res[i] = asts[i].visit(this);
- }
- return res;
- };
- AstTransformer.prototype.visitChain = function (ast, context) {
- return new Chain(ast.span, this.visitAll(ast.expressions));
- };
- AstTransformer.prototype.visitQuote = function (ast, context) {
- return new Quote(ast.span, ast.prefix, ast.uninterpretedExpression, ast.location);
- };
- return AstTransformer;
- }());
- // A transformer that only creates new nodes if the transformer makes a change or
- // a change is made a child node.
- var AstMemoryEfficientTransformer = /** @class */ (function () {
- function AstMemoryEfficientTransformer() {
- }
- AstMemoryEfficientTransformer.prototype.visitImplicitReceiver = function (ast, context) { return ast; };
- AstMemoryEfficientTransformer.prototype.visitInterpolation = function (ast, context) {
- var expressions = this.visitAll(ast.expressions);
- if (expressions !== ast.expressions)
- return new Interpolation(ast.span, ast.strings, expressions);
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitLiteralPrimitive = function (ast, context) { return ast; };
- AstMemoryEfficientTransformer.prototype.visitPropertyRead = function (ast, context) {
- var receiver = ast.receiver.visit(this);
- if (receiver !== ast.receiver) {
- return new PropertyRead(ast.span, receiver, ast.name);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitPropertyWrite = function (ast, context) {
- var receiver = ast.receiver.visit(this);
- var value = ast.value.visit(this);
- if (receiver !== ast.receiver || value !== ast.value) {
- return new PropertyWrite(ast.span, receiver, ast.name, value);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitSafePropertyRead = function (ast, context) {
- var receiver = ast.receiver.visit(this);
- if (receiver !== ast.receiver) {
- return new SafePropertyRead(ast.span, receiver, ast.name);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitMethodCall = function (ast, context) {
- var receiver = ast.receiver.visit(this);
- var args = this.visitAll(ast.args);
- if (receiver !== ast.receiver || args !== ast.args) {
- return new MethodCall(ast.span, receiver, ast.name, args);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitSafeMethodCall = function (ast, context) {
- var receiver = ast.receiver.visit(this);
- var args = this.visitAll(ast.args);
- if (receiver !== ast.receiver || args !== ast.args) {
- return new SafeMethodCall(ast.span, receiver, ast.name, args);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitFunctionCall = function (ast, context) {
- var target = ast.target && ast.target.visit(this);
- var args = this.visitAll(ast.args);
- if (target !== ast.target || args !== ast.args) {
- return new FunctionCall(ast.span, target, args);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitLiteralArray = function (ast, context) {
- var expressions = this.visitAll(ast.expressions);
- if (expressions !== ast.expressions) {
- return new LiteralArray(ast.span, expressions);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitLiteralMap = function (ast, context) {
- var values = this.visitAll(ast.values);
- if (values !== ast.values) {
- return new LiteralMap(ast.span, ast.keys, values);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitBinary = function (ast, context) {
- var left = ast.left.visit(this);
- var right = ast.right.visit(this);
- if (left !== ast.left || right !== ast.right) {
- return new Binary(ast.span, ast.operation, left, right);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitPrefixNot = function (ast, context) {
- var expression = ast.expression.visit(this);
- if (expression !== ast.expression) {
- return new PrefixNot(ast.span, expression);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitNonNullAssert = function (ast, context) {
- var expression = ast.expression.visit(this);
- if (expression !== ast.expression) {
- return new NonNullAssert(ast.span, expression);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitConditional = function (ast, context) {
- var condition = ast.condition.visit(this);
- var trueExp = ast.trueExp.visit(this);
- var falseExp = ast.falseExp.visit(this);
- if (condition !== ast.condition || trueExp !== ast.trueExp || falseExp !== ast.falseExp) {
- return new Conditional(ast.span, condition, trueExp, falseExp);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitPipe = function (ast, context) {
- var exp = ast.exp.visit(this);
- var args = this.visitAll(ast.args);
- if (exp !== ast.exp || args !== ast.args) {
- return new BindingPipe(ast.span, exp, ast.name, args);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitKeyedRead = function (ast, context) {
- var obj = ast.obj.visit(this);
- var key = ast.key.visit(this);
- if (obj !== ast.obj || key !== ast.key) {
- return new KeyedRead(ast.span, obj, key);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitKeyedWrite = function (ast, context) {
- var obj = ast.obj.visit(this);
- var key = ast.key.visit(this);
- var value = ast.value.visit(this);
- if (obj !== ast.obj || key !== ast.key || value !== ast.value) {
- return new KeyedWrite(ast.span, obj, key, value);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitAll = function (asts) {
- var res = new Array(asts.length);
- var modified = false;
- for (var i = 0; i < asts.length; ++i) {
- var original = asts[i];
- var value = original.visit(this);
- res[i] = value;
- modified = modified || value !== original;
- }
- return modified ? res : asts;
- };
- AstMemoryEfficientTransformer.prototype.visitChain = function (ast, context) {
- var expressions = this.visitAll(ast.expressions);
- if (expressions !== ast.expressions) {
- return new Chain(ast.span, expressions);
- }
- return ast;
- };
- AstMemoryEfficientTransformer.prototype.visitQuote = function (ast, context) { return ast; };
- return AstMemoryEfficientTransformer;
- }());
- function visitAstChildren(ast, visitor, context) {
- function visit(ast) {
- visitor.visit && visitor.visit(ast, context) || ast.visit(visitor, context);
- }
- function visitAll(asts) { asts.forEach(visit); }
- ast.visit({
- visitBinary: function (ast) {
- visit(ast.left);
- visit(ast.right);
- },
- visitChain: function (ast) { visitAll(ast.expressions); },
- visitConditional: function (ast) {
- visit(ast.condition);
- visit(ast.trueExp);
- visit(ast.falseExp);
- },
- visitFunctionCall: function (ast) {
- if (ast.target) {
- visit(ast.target);
- }
- visitAll(ast.args);
- },
- visitImplicitReceiver: function (ast) { },
- visitInterpolation: function (ast) { visitAll(ast.expressions); },
- visitKeyedRead: function (ast) {
- visit(ast.obj);
- visit(ast.key);
- },
- visitKeyedWrite: function (ast) {
- visit(ast.obj);
- visit(ast.key);
- visit(ast.obj);
- },
- visitLiteralArray: function (ast) { visitAll(ast.expressions); },
- visitLiteralMap: function (ast) { },
- visitLiteralPrimitive: function (ast) { },
- visitMethodCall: function (ast) {
- visit(ast.receiver);
- visitAll(ast.args);
- },
- visitPipe: function (ast) {
- visit(ast.exp);
- visitAll(ast.args);
- },
- visitPrefixNot: function (ast) { visit(ast.expression); },
- visitNonNullAssert: function (ast) { visit(ast.expression); },
- visitPropertyRead: function (ast) { visit(ast.receiver); },
- visitPropertyWrite: function (ast) {
- visit(ast.receiver);
- visit(ast.value);
- },
- visitQuote: function (ast) { },
- visitSafeMethodCall: function (ast) {
- visit(ast.receiver);
- visitAll(ast.args);
- },
- visitSafePropertyRead: function (ast) { visit(ast.receiver); },
- });
- }
- // Bindings
- var ParsedProperty = /** @class */ (function () {
- function ParsedProperty(name, expression, type, sourceSpan) {
- this.name = name;
- this.expression = expression;
- this.type = type;
- this.sourceSpan = sourceSpan;
- this.isLiteral = this.type === ParsedPropertyType.LITERAL_ATTR;
- this.isAnimation = this.type === ParsedPropertyType.ANIMATION;
- }
- return ParsedProperty;
- }());
- var ParsedPropertyType;
- (function (ParsedPropertyType) {
- ParsedPropertyType[ParsedPropertyType["DEFAULT"] = 0] = "DEFAULT";
- ParsedPropertyType[ParsedPropertyType["LITERAL_ATTR"] = 1] = "LITERAL_ATTR";
- ParsedPropertyType[ParsedPropertyType["ANIMATION"] = 2] = "ANIMATION";
- })(ParsedPropertyType || (ParsedPropertyType = {}));
- var ParsedEvent = /** @class */ (function () {
- // Regular events have a target
- // Animation events have a phase
- function ParsedEvent(name, targetOrPhase, type, handler, sourceSpan, handlerSpan) {
- this.name = name;
- this.targetOrPhase = targetOrPhase;
- this.type = type;
- this.handler = handler;
- this.sourceSpan = sourceSpan;
- this.handlerSpan = handlerSpan;
- }
- return ParsedEvent;
- }());
- var ParsedVariable = /** @class */ (function () {
- function ParsedVariable(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- return ParsedVariable;
- }());
- var BoundElementProperty = /** @class */ (function () {
- function BoundElementProperty(name, type, securityContext, value, unit, sourceSpan) {
- this.name = name;
- this.type = type;
- this.securityContext = securityContext;
- this.value = value;
- this.unit = unit;
- this.sourceSpan = sourceSpan;
- }
- return BoundElementProperty;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var EventHandlerVars = /** @class */ (function () {
- function EventHandlerVars() {
- }
- EventHandlerVars.event = variable('$event');
- return EventHandlerVars;
- }());
- var ConvertActionBindingResult = /** @class */ (function () {
- function ConvertActionBindingResult(
- /**
- * Render2 compatible statements,
- */
- stmts,
- /**
- * Variable name used with render2 compatible statements.
- */
- allowDefault) {
- this.stmts = stmts;
- this.allowDefault = allowDefault;
- /**
- * This is bit of a hack. It converts statements which render2 expects to statements which are
- * expected by render3.
- *
- * Example: `<div click="doSomething($event)">` will generate:
- *
- * Render3:
- * ```
- * const pd_b:any = ((<any>ctx.doSomething($event)) !== false);
- * return pd_b;
- * ```
- *
- * but render2 expects:
- * ```
- * return ctx.doSomething($event);
- * ```
- */
- // TODO(misko): remove this hack once we no longer support ViewEngine.
- this.render3Stmts = stmts.map(function (statement) {
- if (statement instanceof DeclareVarStmt && statement.name == allowDefault.name &&
- statement.value instanceof BinaryOperatorExpr) {
- var lhs = statement.value.lhs;
- return new ReturnStatement(lhs.value);
- }
- return statement;
- });
- }
- return ConvertActionBindingResult;
- }());
- /**
- * Converts the given expression AST into an executable output AST, assuming the expression is
- * used in an action binding (e.g. an event handler).
- */
- function convertActionBinding(localResolver, implicitReceiver, action, bindingId, interpolationFunction, baseSourceSpan) {
- if (!localResolver) {
- localResolver = new DefaultLocalResolver();
- }
- var actionWithoutBuiltins = convertPropertyBindingBuiltins({
- createLiteralArrayConverter: function (argCount) {
- // Note: no caching for literal arrays in actions.
- return function (args) { return literalArr(args); };
- },
- createLiteralMapConverter: function (keys) {
- // Note: no caching for literal maps in actions.
- return function (values) {
- var entries = keys.map(function (k, i) { return ({
- key: k.key,
- value: values[i],
- quoted: k.quoted,
- }); });
- return literalMap(entries);
- };
- },
- createPipeConverter: function (name) {
- throw new Error("Illegal State: Actions are not allowed to contain pipes. Pipe: " + name);
- }
- }, action);
- var visitor = new _AstToIrVisitor(localResolver, implicitReceiver, bindingId, interpolationFunction, baseSourceSpan);
- var actionStmts = [];
- flattenStatements(actionWithoutBuiltins.visit(visitor, _Mode.Statement), actionStmts);
- prependTemporaryDecls(visitor.temporaryCount, bindingId, actionStmts);
- if (visitor.usesImplicitReceiver) {
- localResolver.notifyImplicitReceiverUse();
- }
- var lastIndex = actionStmts.length - 1;
- var preventDefaultVar = null;
- if (lastIndex >= 0) {
- var lastStatement = actionStmts[lastIndex];
- var returnExpr = convertStmtIntoExpression(lastStatement);
- if (returnExpr) {
- // Note: We need to cast the result of the method call to dynamic,
- // as it might be a void method!
- preventDefaultVar = createPreventDefaultVar(bindingId);
- actionStmts[lastIndex] =
- preventDefaultVar.set(returnExpr.cast(DYNAMIC_TYPE).notIdentical(literal(false)))
- .toDeclStmt(null, [StmtModifier.Final]);
- }
- }
- return new ConvertActionBindingResult(actionStmts, preventDefaultVar);
- }
- function convertPropertyBindingBuiltins(converterFactory, ast) {
- return convertBuiltins(converterFactory, ast);
- }
- var ConvertPropertyBindingResult = /** @class */ (function () {
- function ConvertPropertyBindingResult(stmts, currValExpr) {
- this.stmts = stmts;
- this.currValExpr = currValExpr;
- }
- return ConvertPropertyBindingResult;
- }());
- var BindingForm;
- (function (BindingForm) {
- // The general form of binding expression, supports all expressions.
- BindingForm[BindingForm["General"] = 0] = "General";
- // Try to generate a simple binding (no temporaries or statements)
- // otherwise generate a general binding
- BindingForm[BindingForm["TrySimple"] = 1] = "TrySimple";
- })(BindingForm || (BindingForm = {}));
- /**
- * Converts the given expression AST into an executable output AST, assuming the expression
- * is used in property binding. The expression has to be preprocessed via
- * `convertPropertyBindingBuiltins`.
- */
- function convertPropertyBinding(localResolver, implicitReceiver, expressionWithoutBuiltins, bindingId, form, interpolationFunction) {
- if (!localResolver) {
- localResolver = new DefaultLocalResolver();
- }
- var currValExpr = createCurrValueExpr(bindingId);
- var visitor = new _AstToIrVisitor(localResolver, implicitReceiver, bindingId, interpolationFunction);
- var outputExpr = expressionWithoutBuiltins.visit(visitor, _Mode.Expression);
- var stmts = getStatementsFromVisitor(visitor, bindingId);
- if (visitor.usesImplicitReceiver) {
- localResolver.notifyImplicitReceiverUse();
- }
- if (visitor.temporaryCount === 0 && form == BindingForm.TrySimple) {
- return new ConvertPropertyBindingResult([], outputExpr);
- }
- stmts.push(currValExpr.set(outputExpr).toDeclStmt(DYNAMIC_TYPE, [StmtModifier.Final]));
- return new ConvertPropertyBindingResult(stmts, currValExpr);
- }
- /**
- * Given some expression, such as a binding or interpolation expression, and a context expression to
- * look values up on, visit each facet of the given expression resolving values from the context
- * expression such that a list of arguments can be derived from the found values that can be used as
- * arguments to an external update instruction.
- *
- * @param localResolver The resolver to use to look up expressions by name appropriately
- * @param contextVariableExpression The expression representing the context variable used to create
- * the final argument expressions
- * @param expressionWithArgumentsToExtract The expression to visit to figure out what values need to
- * be resolved and what arguments list to build.
- * @param bindingId A name prefix used to create temporary variable names if they're needed for the
- * arguments generated
- * @returns An array of expressions that can be passed as arguments to instruction expressions like
- * `o.importExpr(R3.propertyInterpolate).callFn(result)`
- */
- function convertUpdateArguments(localResolver, contextVariableExpression, expressionWithArgumentsToExtract, bindingId) {
- var visitor = new _AstToIrVisitor(localResolver, contextVariableExpression, bindingId, undefined);
- var outputExpr = expressionWithArgumentsToExtract.visit(visitor, _Mode.Expression);
- if (visitor.usesImplicitReceiver) {
- localResolver.notifyImplicitReceiverUse();
- }
- var stmts = getStatementsFromVisitor(visitor, bindingId);
- // Removing the first argument, because it was a length for ViewEngine, not Ivy.
- var args = outputExpr.args.slice(1);
- if (expressionWithArgumentsToExtract instanceof Interpolation) {
- // If we're dealing with an interpolation of 1 value with an empty prefix and suffix, reduce the
- // args returned to just the value, because we're going to pass it to a special instruction.
- var strings = expressionWithArgumentsToExtract.strings;
- if (args.length === 3 && strings[0] === '' && strings[1] === '') {
- // Single argument interpolate instructions.
- args = [args[1]];
- }
- else if (args.length >= 19) {
- // 19 or more arguments must be passed to the `interpolateV`-style instructions, which accept
- // an array of arguments
- args = [literalArr(args)];
- }
- }
- return { stmts: stmts, args: args };
- }
- function getStatementsFromVisitor(visitor, bindingId) {
- var stmts = [];
- for (var i = 0; i < visitor.temporaryCount; i++) {
- stmts.push(temporaryDeclaration(bindingId, i));
- }
- return stmts;
- }
- function convertBuiltins(converterFactory, ast) {
- var visitor = new _BuiltinAstConverter(converterFactory);
- return ast.visit(visitor);
- }
- function temporaryName(bindingId, temporaryNumber) {
- return "tmp_" + bindingId + "_" + temporaryNumber;
- }
- function temporaryDeclaration(bindingId, temporaryNumber) {
- return new DeclareVarStmt(temporaryName(bindingId, temporaryNumber), NULL_EXPR);
- }
- function prependTemporaryDecls(temporaryCount, bindingId, statements) {
- for (var i = temporaryCount - 1; i >= 0; i--) {
- statements.unshift(temporaryDeclaration(bindingId, i));
- }
- }
- var _Mode;
- (function (_Mode) {
- _Mode[_Mode["Statement"] = 0] = "Statement";
- _Mode[_Mode["Expression"] = 1] = "Expression";
- })(_Mode || (_Mode = {}));
- function ensureStatementMode(mode, ast) {
- if (mode !== _Mode.Statement) {
- throw new Error("Expected a statement, but saw " + ast);
- }
- }
- function ensureExpressionMode(mode, ast) {
- if (mode !== _Mode.Expression) {
- throw new Error("Expected an expression, but saw " + ast);
- }
- }
- function convertToStatementIfNeeded(mode, expr) {
- if (mode === _Mode.Statement) {
- return expr.toStmt();
- }
- else {
- return expr;
- }
- }
- var _BuiltinAstConverter = /** @class */ (function (_super) {
- __extends(_BuiltinAstConverter, _super);
- function _BuiltinAstConverter(_converterFactory) {
- var _this = _super.call(this) || this;
- _this._converterFactory = _converterFactory;
- return _this;
- }
- _BuiltinAstConverter.prototype.visitPipe = function (ast, context) {
- var _this = this;
- var args = __spread([ast.exp], ast.args).map(function (ast) { return ast.visit(_this, context); });
- return new BuiltinFunctionCall(ast.span, args, this._converterFactory.createPipeConverter(ast.name, args.length));
- };
- _BuiltinAstConverter.prototype.visitLiteralArray = function (ast, context) {
- var _this = this;
- var args = ast.expressions.map(function (ast) { return ast.visit(_this, context); });
- return new BuiltinFunctionCall(ast.span, args, this._converterFactory.createLiteralArrayConverter(ast.expressions.length));
- };
- _BuiltinAstConverter.prototype.visitLiteralMap = function (ast, context) {
- var _this = this;
- var args = ast.values.map(function (ast) { return ast.visit(_this, context); });
- return new BuiltinFunctionCall(ast.span, args, this._converterFactory.createLiteralMapConverter(ast.keys));
- };
- return _BuiltinAstConverter;
- }(AstTransformer$1));
- var _AstToIrVisitor = /** @class */ (function () {
- function _AstToIrVisitor(_localResolver, _implicitReceiver, bindingId, interpolationFunction, baseSourceSpan) {
- this._localResolver = _localResolver;
- this._implicitReceiver = _implicitReceiver;
- this.bindingId = bindingId;
- this.interpolationFunction = interpolationFunction;
- this.baseSourceSpan = baseSourceSpan;
- this._nodeMap = new Map();
- this._resultMap = new Map();
- this._currentTemporary = 0;
- this.temporaryCount = 0;
- this.usesImplicitReceiver = false;
- }
- _AstToIrVisitor.prototype.visitBinary = function (ast, mode) {
- var op;
- switch (ast.operation) {
- case '+':
- op = BinaryOperator.Plus;
- break;
- case '-':
- op = BinaryOperator.Minus;
- break;
- case '*':
- op = BinaryOperator.Multiply;
- break;
- case '/':
- op = BinaryOperator.Divide;
- break;
- case '%':
- op = BinaryOperator.Modulo;
- break;
- case '&&':
- op = BinaryOperator.And;
- break;
- case '||':
- op = BinaryOperator.Or;
- break;
- case '==':
- op = BinaryOperator.Equals;
- break;
- case '!=':
- op = BinaryOperator.NotEquals;
- break;
- case '===':
- op = BinaryOperator.Identical;
- break;
- case '!==':
- op = BinaryOperator.NotIdentical;
- break;
- case '<':
- op = BinaryOperator.Lower;
- break;
- case '>':
- op = BinaryOperator.Bigger;
- break;
- case '<=':
- op = BinaryOperator.LowerEquals;
- break;
- case '>=':
- op = BinaryOperator.BiggerEquals;
- break;
- default:
- throw new Error("Unsupported operation " + ast.operation);
- }
- return convertToStatementIfNeeded(mode, new BinaryOperatorExpr(op, this._visit(ast.left, _Mode.Expression), this._visit(ast.right, _Mode.Expression), undefined, this.convertSourceSpan(ast.span)));
- };
- _AstToIrVisitor.prototype.visitChain = function (ast, mode) {
- ensureStatementMode(mode, ast);
- return this.visitAll(ast.expressions, mode);
- };
- _AstToIrVisitor.prototype.visitConditional = function (ast, mode) {
- var value = this._visit(ast.condition, _Mode.Expression);
- return convertToStatementIfNeeded(mode, value.conditional(this._visit(ast.trueExp, _Mode.Expression), this._visit(ast.falseExp, _Mode.Expression), this.convertSourceSpan(ast.span)));
- };
- _AstToIrVisitor.prototype.visitPipe = function (ast, mode) {
- throw new Error("Illegal state: Pipes should have been converted into functions. Pipe: " + ast.name);
- };
- _AstToIrVisitor.prototype.visitFunctionCall = function (ast, mode) {
- var convertedArgs = this.visitAll(ast.args, _Mode.Expression);
- var fnResult;
- if (ast instanceof BuiltinFunctionCall) {
- fnResult = ast.converter(convertedArgs);
- }
- else {
- fnResult = this._visit(ast.target, _Mode.Expression)
- .callFn(convertedArgs, this.convertSourceSpan(ast.span));
- }
- return convertToStatementIfNeeded(mode, fnResult);
- };
- _AstToIrVisitor.prototype.visitImplicitReceiver = function (ast, mode) {
- ensureExpressionMode(mode, ast);
- this.usesImplicitReceiver = true;
- return this._implicitReceiver;
- };
- _AstToIrVisitor.prototype.visitInterpolation = function (ast, mode) {
- ensureExpressionMode(mode, ast);
- var args = [literal(ast.expressions.length)];
- for (var i = 0; i < ast.strings.length - 1; i++) {
- args.push(literal(ast.strings[i]));
- args.push(this._visit(ast.expressions[i], _Mode.Expression));
- }
- args.push(literal(ast.strings[ast.strings.length - 1]));
- if (this.interpolationFunction) {
- return this.interpolationFunction(args);
- }
- return ast.expressions.length <= 9 ?
- importExpr(Identifiers.inlineInterpolate).callFn(args) :
- importExpr(Identifiers.interpolate).callFn([
- args[0], literalArr(args.slice(1), undefined, this.convertSourceSpan(ast.span))
- ]);
- };
- _AstToIrVisitor.prototype.visitKeyedRead = function (ast, mode) {
- var leftMostSafe = this.leftMostSafeNode(ast);
- if (leftMostSafe) {
- return this.convertSafeAccess(ast, leftMostSafe, mode);
- }
- else {
- return convertToStatementIfNeeded(mode, this._visit(ast.obj, _Mode.Expression).key(this._visit(ast.key, _Mode.Expression)));
- }
- };
- _AstToIrVisitor.prototype.visitKeyedWrite = function (ast, mode) {
- var obj = this._visit(ast.obj, _Mode.Expression);
- var key = this._visit(ast.key, _Mode.Expression);
- var value = this._visit(ast.value, _Mode.Expression);
- return convertToStatementIfNeeded(mode, obj.key(key).set(value));
- };
- _AstToIrVisitor.prototype.visitLiteralArray = function (ast, mode) {
- throw new Error("Illegal State: literal arrays should have been converted into functions");
- };
- _AstToIrVisitor.prototype.visitLiteralMap = function (ast, mode) {
- throw new Error("Illegal State: literal maps should have been converted into functions");
- };
- _AstToIrVisitor.prototype.visitLiteralPrimitive = function (ast, mode) {
- // For literal values of null, undefined, true, or false allow type interference
- // to infer the type.
- var type = ast.value === null || ast.value === undefined || ast.value === true || ast.value === true ?
- INFERRED_TYPE :
- undefined;
- return convertToStatementIfNeeded(mode, literal(ast.value, type, this.convertSourceSpan(ast.span)));
- };
- _AstToIrVisitor.prototype._getLocal = function (name) { return this._localResolver.getLocal(name); };
- _AstToIrVisitor.prototype.visitMethodCall = function (ast, mode) {
- if (ast.receiver instanceof ImplicitReceiver && ast.name == '$any') {
- var args = this.visitAll(ast.args, _Mode.Expression);
- if (args.length != 1) {
- throw new Error("Invalid call to $any, expected 1 argument but received " + (args.length || 'none'));
- }
- return args[0].cast(DYNAMIC_TYPE, this.convertSourceSpan(ast.span));
- }
- var leftMostSafe = this.leftMostSafeNode(ast);
- if (leftMostSafe) {
- return this.convertSafeAccess(ast, leftMostSafe, mode);
- }
- else {
- var args = this.visitAll(ast.args, _Mode.Expression);
- var prevUsesImplicitReceiver = this.usesImplicitReceiver;
- var result = null;
- var receiver = this._visit(ast.receiver, _Mode.Expression);
- if (receiver === this._implicitReceiver) {
- var varExpr = this._getLocal(ast.name);
- if (varExpr) {
- // Restore the previous "usesImplicitReceiver" state since the implicit
- // receiver has been replaced with a resolved local expression.
- this.usesImplicitReceiver = prevUsesImplicitReceiver;
- result = varExpr.callFn(args);
- }
- }
- if (result == null) {
- result = receiver.callMethod(ast.name, args, this.convertSourceSpan(ast.span));
- }
- return convertToStatementIfNeeded(mode, result);
- }
- };
- _AstToIrVisitor.prototype.visitPrefixNot = function (ast, mode) {
- return convertToStatementIfNeeded(mode, not(this._visit(ast.expression, _Mode.Expression)));
- };
- _AstToIrVisitor.prototype.visitNonNullAssert = function (ast, mode) {
- return convertToStatementIfNeeded(mode, assertNotNull(this._visit(ast.expression, _Mode.Expression)));
- };
- _AstToIrVisitor.prototype.visitPropertyRead = function (ast, mode) {
- var leftMostSafe = this.leftMostSafeNode(ast);
- if (leftMostSafe) {
- return this.convertSafeAccess(ast, leftMostSafe, mode);
- }
- else {
- var result = null;
- var prevUsesImplicitReceiver = this.usesImplicitReceiver;
- var receiver = this._visit(ast.receiver, _Mode.Expression);
- if (receiver === this._implicitReceiver) {
- result = this._getLocal(ast.name);
- if (result) {
- // Restore the previous "usesImplicitReceiver" state since the implicit
- // receiver has been replaced with a resolved local expression.
- this.usesImplicitReceiver = prevUsesImplicitReceiver;
- }
- }
- if (result == null) {
- result = receiver.prop(ast.name);
- }
- return convertToStatementIfNeeded(mode, result);
- }
- };
- _AstToIrVisitor.prototype.visitPropertyWrite = function (ast, mode) {
- var receiver = this._visit(ast.receiver, _Mode.Expression);
- var prevUsesImplicitReceiver = this.usesImplicitReceiver;
- var varExpr = null;
- if (receiver === this._implicitReceiver) {
- var localExpr = this._getLocal(ast.name);
- if (localExpr) {
- if (localExpr instanceof ReadPropExpr) {
- // If the local variable is a property read expression, it's a reference
- // to a 'context.property' value and will be used as the target of the
- // write expression.
- varExpr = localExpr;
- // Restore the previous "usesImplicitReceiver" state since the implicit
- // receiver has been replaced with a resolved local expression.
- this.usesImplicitReceiver = prevUsesImplicitReceiver;
- }
- else {
- // Otherwise it's an error.
- throw new Error('Cannot assign to a reference or variable!');
- }
- }
- }
- // If no local expression could be produced, use the original receiver's
- // property as the target.
- if (varExpr === null) {
- varExpr = receiver.prop(ast.name);
- }
- return convertToStatementIfNeeded(mode, varExpr.set(this._visit(ast.value, _Mode.Expression)));
- };
- _AstToIrVisitor.prototype.visitSafePropertyRead = function (ast, mode) {
- return this.convertSafeAccess(ast, this.leftMostSafeNode(ast), mode);
- };
- _AstToIrVisitor.prototype.visitSafeMethodCall = function (ast, mode) {
- return this.convertSafeAccess(ast, this.leftMostSafeNode(ast), mode);
- };
- _AstToIrVisitor.prototype.visitAll = function (asts, mode) {
- var _this = this;
- return asts.map(function (ast) { return _this._visit(ast, mode); });
- };
- _AstToIrVisitor.prototype.visitQuote = function (ast, mode) {
- throw new Error("Quotes are not supported for evaluation!\n Statement: " + ast.uninterpretedExpression + " located at " + ast.location);
- };
- _AstToIrVisitor.prototype._visit = function (ast, mode) {
- var result = this._resultMap.get(ast);
- if (result)
- return result;
- return (this._nodeMap.get(ast) || ast).visit(this, mode);
- };
- _AstToIrVisitor.prototype.convertSafeAccess = function (ast, leftMostSafe, mode) {
- // If the expression contains a safe access node on the left it needs to be converted to
- // an expression that guards the access to the member by checking the receiver for blank. As
- // execution proceeds from left to right, the left most part of the expression must be guarded
- // first but, because member access is left associative, the right side of the expression is at
- // the top of the AST. The desired result requires lifting a copy of the the left part of the
- // expression up to test it for blank before generating the unguarded version.
- // Consider, for example the following expression: a?.b.c?.d.e
- // This results in the ast:
- // .
- // / \
- // ?. e
- // / \
- // . d
- // / \
- // ?. c
- // / \
- // a b
- // The following tree should be generated:
- //
- // /---- ? ----\
- // / | \
- // a /--- ? ---\ null
- // / | \
- // . . null
- // / \ / \
- // . c . e
- // / \ / \
- // a b . d
- // / \
- // . c
- // / \
- // a b
- //
- // Notice that the first guard condition is the left hand of the left most safe access node
- // which comes in as leftMostSafe to this routine.
- var guardedExpression = this._visit(leftMostSafe.receiver, _Mode.Expression);
- var temporary = undefined;
- if (this.needsTemporary(leftMostSafe.receiver)) {
- // If the expression has method calls or pipes then we need to save the result into a
- // temporary variable to avoid calling stateful or impure code more than once.
- temporary = this.allocateTemporary();
- // Preserve the result in the temporary variable
- guardedExpression = temporary.set(guardedExpression);
- // Ensure all further references to the guarded expression refer to the temporary instead.
- this._resultMap.set(leftMostSafe.receiver, temporary);
- }
- var condition = guardedExpression.isBlank();
- // Convert the ast to an unguarded access to the receiver's member. The map will substitute
- // leftMostNode with its unguarded version in the call to `this.visit()`.
- if (leftMostSafe instanceof SafeMethodCall) {
- this._nodeMap.set(leftMostSafe, new MethodCall(leftMostSafe.span, leftMostSafe.receiver, leftMostSafe.name, leftMostSafe.args));
- }
- else {
- this._nodeMap.set(leftMostSafe, new PropertyRead(leftMostSafe.span, leftMostSafe.receiver, leftMostSafe.name));
- }
- // Recursively convert the node now without the guarded member access.
- var access = this._visit(ast, _Mode.Expression);
- // Remove the mapping. This is not strictly required as the converter only traverses each node
- // once but is safer if the conversion is changed to traverse the nodes more than once.
- this._nodeMap.delete(leftMostSafe);
- // If we allocated a temporary, release it.
- if (temporary) {
- this.releaseTemporary(temporary);
- }
- // Produce the conditional
- return convertToStatementIfNeeded(mode, condition.conditional(literal(null), access));
- };
- // Given a expression of the form a?.b.c?.d.e the the left most safe node is
- // the (a?.b). The . and ?. are left associative thus can be rewritten as:
- // ((((a?.c).b).c)?.d).e. This returns the most deeply nested safe read or
- // safe method call as this needs be transform initially to:
- // a == null ? null : a.c.b.c?.d.e
- // then to:
- // a == null ? null : a.b.c == null ? null : a.b.c.d.e
- _AstToIrVisitor.prototype.leftMostSafeNode = function (ast) {
- var _this = this;
- var visit = function (visitor, ast) {
- return (_this._nodeMap.get(ast) || ast).visit(visitor);
- };
- return ast.visit({
- visitBinary: function (ast) { return null; },
- visitChain: function (ast) { return null; },
- visitConditional: function (ast) { return null; },
- visitFunctionCall: function (ast) { return null; },
- visitImplicitReceiver: function (ast) { return null; },
- visitInterpolation: function (ast) { return null; },
- visitKeyedRead: function (ast) { return visit(this, ast.obj); },
- visitKeyedWrite: function (ast) { return null; },
- visitLiteralArray: function (ast) { return null; },
- visitLiteralMap: function (ast) { return null; },
- visitLiteralPrimitive: function (ast) { return null; },
- visitMethodCall: function (ast) { return visit(this, ast.receiver); },
- visitPipe: function (ast) { return null; },
- visitPrefixNot: function (ast) { return null; },
- visitNonNullAssert: function (ast) { return null; },
- visitPropertyRead: function (ast) { return visit(this, ast.receiver); },
- visitPropertyWrite: function (ast) { return null; },
- visitQuote: function (ast) { return null; },
- visitSafeMethodCall: function (ast) { return visit(this, ast.receiver) || ast; },
- visitSafePropertyRead: function (ast) {
- return visit(this, ast.receiver) || ast;
- }
- });
- };
- // Returns true of the AST includes a method or a pipe indicating that, if the
- // expression is used as the target of a safe property or method access then
- // the expression should be stored into a temporary variable.
- _AstToIrVisitor.prototype.needsTemporary = function (ast) {
- var _this = this;
- var visit = function (visitor, ast) {
- return ast && (_this._nodeMap.get(ast) || ast).visit(visitor);
- };
- var visitSome = function (visitor, ast) {
- return ast.some(function (ast) { return visit(visitor, ast); });
- };
- return ast.visit({
- visitBinary: function (ast) { return visit(this, ast.left) || visit(this, ast.right); },
- visitChain: function (ast) { return false; },
- visitConditional: function (ast) {
- return visit(this, ast.condition) || visit(this, ast.trueExp) ||
- visit(this, ast.falseExp);
- },
- visitFunctionCall: function (ast) { return true; },
- visitImplicitReceiver: function (ast) { return false; },
- visitInterpolation: function (ast) { return visitSome(this, ast.expressions); },
- visitKeyedRead: function (ast) { return false; },
- visitKeyedWrite: function (ast) { return false; },
- visitLiteralArray: function (ast) { return true; },
- visitLiteralMap: function (ast) { return true; },
- visitLiteralPrimitive: function (ast) { return false; },
- visitMethodCall: function (ast) { return true; },
- visitPipe: function (ast) { return true; },
- visitPrefixNot: function (ast) { return visit(this, ast.expression); },
- visitNonNullAssert: function (ast) { return visit(this, ast.expression); },
- visitPropertyRead: function (ast) { return false; },
- visitPropertyWrite: function (ast) { return false; },
- visitQuote: function (ast) { return false; },
- visitSafeMethodCall: function (ast) { return true; },
- visitSafePropertyRead: function (ast) { return false; }
- });
- };
- _AstToIrVisitor.prototype.allocateTemporary = function () {
- var tempNumber = this._currentTemporary++;
- this.temporaryCount = Math.max(this._currentTemporary, this.temporaryCount);
- return new ReadVarExpr(temporaryName(this.bindingId, tempNumber));
- };
- _AstToIrVisitor.prototype.releaseTemporary = function (temporary) {
- this._currentTemporary--;
- if (temporary.name != temporaryName(this.bindingId, this._currentTemporary)) {
- throw new Error("Temporary " + temporary.name + " released out of order");
- }
- };
- /**
- * Creates an absolute `ParseSourceSpan` from the relative `ParseSpan`.
- *
- * `ParseSpan` objects are relative to the start of the expression.
- * This method converts these to full `ParseSourceSpan` objects that
- * show where the span is within the overall source file.
- *
- * @param span the relative span to convert.
- * @returns a `ParseSourceSpan` for the the given span or null if no
- * `baseSourceSpan` was provided to this class.
- */
- _AstToIrVisitor.prototype.convertSourceSpan = function (span) {
- if (this.baseSourceSpan) {
- var start = this.baseSourceSpan.start.moveBy(span.start);
- var end = this.baseSourceSpan.start.moveBy(span.end);
- return new ParseSourceSpan(start, end);
- }
- else {
- return null;
- }
- };
- return _AstToIrVisitor;
- }());
- function flattenStatements(arg, output) {
- if (Array.isArray(arg)) {
- arg.forEach(function (entry) { return flattenStatements(entry, output); });
- }
- else {
- output.push(arg);
- }
- }
- var DefaultLocalResolver = /** @class */ (function () {
- function DefaultLocalResolver() {
- }
- DefaultLocalResolver.prototype.notifyImplicitReceiverUse = function () { };
- DefaultLocalResolver.prototype.getLocal = function (name) {
- if (name === EventHandlerVars.event.name) {
- return EventHandlerVars.event;
- }
- return null;
- };
- return DefaultLocalResolver;
- }());
- function createCurrValueExpr(bindingId) {
- return variable("currVal_" + bindingId); // fix syntax highlighting: `
- }
- function createPreventDefaultVar(bindingId) {
- return variable("pd_" + bindingId);
- }
- function convertStmtIntoExpression(stmt) {
- if (stmt instanceof ExpressionStatement) {
- return stmt.expr;
- }
- else if (stmt instanceof ReturnStatement) {
- return stmt.value;
- }
- return null;
- }
- var BuiltinFunctionCall = /** @class */ (function (_super) {
- __extends(BuiltinFunctionCall, _super);
- function BuiltinFunctionCall(span, args, converter) {
- var _this = _super.call(this, span, null, args) || this;
- _this.args = args;
- _this.converter = converter;
- return _this;
- }
- return BuiltinFunctionCall;
- }(FunctionCall));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * This file is a port of shadowCSS from webcomponents.js to TypeScript.
- *
- * Please make sure to keep to edits in sync with the source file.
- *
- * Source:
- * https://github.com/webcomponents/webcomponentsjs/blob/4efecd7e0e/src/ShadowCSS/ShadowCSS.js
- *
- * The original file level comment is reproduced below
- */
- /*
- This is a limited shim for ShadowDOM css styling.
- https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
- The intention here is to support only the styling features which can be
- relatively simply implemented. The goal is to allow users to avoid the
- most obvious pitfalls and do so without compromising performance significantly.
- For ShadowDOM styling that's not covered here, a set of best practices
- can be provided that should allow users to accomplish more complex styling.
- The following is a list of specific ShadowDOM styling features and a brief
- discussion of the approach used to shim.
- Shimmed features:
- * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
- element using the :host rule. To shim this feature, the :host styles are
- reformatted and prefixed with a given scope name and promoted to a
- document level stylesheet.
- For example, given a scope name of .foo, a rule like this:
- :host {
- background: red;
- }
- }
- becomes:
- .foo {
- background: red;
- }
- * encapsulation: Styles defined within ShadowDOM, apply only to
- dom inside the ShadowDOM. Polymer uses one of two techniques to implement
- this feature.
- By default, rules are prefixed with the host element tag name
- as a descendant selector. This ensures styling does not leak out of the 'top'
- of the element's ShadowDOM. For example,
- div {
- font-weight: bold;
- }
- becomes:
- x-foo div {
- font-weight: bold;
- }
- becomes:
- Alternatively, if WebComponents.ShadowCSS.strictStyling is set to true then
- selectors are scoped by adding an attribute selector suffix to each
- simple selector that contains the host element tag name. Each element
- in the element's ShadowDOM template is also given the scope attribute.
- Thus, these rules match only elements that have the scope attribute.
- For example, given a scope name of x-foo, a rule like this:
- div {
- font-weight: bold;
- }
- becomes:
- div[x-foo] {
- font-weight: bold;
- }
- Note that elements that are dynamically added to a scope must have the scope
- selector added to them manually.
- * upper/lower bound encapsulation: Styles which are defined outside a
- shadowRoot should not cross the ShadowDOM boundary and should not apply
- inside a shadowRoot.
- This styling behavior is not emulated. Some possible ways to do this that
- were rejected due to complexity and/or performance concerns include: (1) reset
- every possible property for every possible selector for a given scope name;
- (2) re-implement css in javascript.
- As an alternative, users should make sure to use selectors
- specific to the scope in which they are working.
- * ::distributed: This behavior is not emulated. It's often not necessary
- to style the contents of a specific insertion point and instead, descendants
- of the host element can be styled selectively. Users can also create an
- extra node around an insertion point and style that node's contents
- via descendent selectors. For example, with a shadowRoot like this:
- <style>
- ::content(div) {
- background: red;
- }
- </style>
- <content></content>
- could become:
- <style>
- / *@polyfill .content-container div * /
- ::content(div) {
- background: red;
- }
- </style>
- <div class="content-container">
- <content></content>
- </div>
- Note the use of @polyfill in the comment above a ShadowDOM specific style
- declaration. This is a directive to the styling shim to use the selector
- in comments in lieu of the next selector when running under polyfill.
- */
- var ShadowCss = /** @class */ (function () {
- function ShadowCss() {
- this.strictStyling = true;
- }
- /*
- * Shim some cssText with the given selector. Returns cssText that can
- * be included in the document via WebComponents.ShadowCSS.addCssToDocument(css).
- *
- * When strictStyling is true:
- * - selector is the attribute added to all elements inside the host,
- * - hostSelector is the attribute added to the host itself.
- */
- ShadowCss.prototype.shimCssText = function (cssText, selector, hostSelector) {
- if (hostSelector === void 0) { hostSelector = ''; }
- var commentsWithHash = extractCommentsWithHash(cssText);
- cssText = stripComments(cssText);
- cssText = this._insertDirectives(cssText);
- var scopedCssText = this._scopeCssText(cssText, selector, hostSelector);
- return __spread([scopedCssText], commentsWithHash).join('\n');
- };
- ShadowCss.prototype._insertDirectives = function (cssText) {
- cssText = this._insertPolyfillDirectivesInCssText(cssText);
- return this._insertPolyfillRulesInCssText(cssText);
- };
- /*
- * Process styles to convert native ShadowDOM rules that will trip
- * up the css parser; we rely on decorating the stylesheet with inert rules.
- *
- * For example, we convert this rule:
- *
- * polyfill-next-selector { content: ':host menu-item'; }
- * ::content menu-item {
- *
- * to this:
- *
- * scopeName menu-item {
- *
- **/
- ShadowCss.prototype._insertPolyfillDirectivesInCssText = function (cssText) {
- // Difference with webcomponents.js: does not handle comments
- return cssText.replace(_cssContentNextSelectorRe, function () {
- var m = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- m[_i] = arguments[_i];
- }
- return m[2] + '{';
- });
- };
- /*
- * Process styles to add rules which will only apply under the polyfill
- *
- * For example, we convert this rule:
- *
- * polyfill-rule {
- * content: ':host menu-item';
- * ...
- * }
- *
- * to this:
- *
- * scopeName menu-item {...}
- *
- **/
- ShadowCss.prototype._insertPolyfillRulesInCssText = function (cssText) {
- // Difference with webcomponents.js: does not handle comments
- return cssText.replace(_cssContentRuleRe, function () {
- var m = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- m[_i] = arguments[_i];
- }
- var rule = m[0].replace(m[1], '').replace(m[2], '');
- return m[4] + rule;
- });
- };
- /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
- *
- * .foo {... }
- *
- * and converts this to
- *
- * scopeName .foo { ... }
- */
- ShadowCss.prototype._scopeCssText = function (cssText, scopeSelector, hostSelector) {
- var unscopedRules = this._extractUnscopedRulesFromCssText(cssText);
- // replace :host and :host-context -shadowcsshost and -shadowcsshost respectively
- cssText = this._insertPolyfillHostInCssText(cssText);
- cssText = this._convertColonHost(cssText);
- cssText = this._convertColonHostContext(cssText);
- cssText = this._convertShadowDOMSelectors(cssText);
- if (scopeSelector) {
- cssText = this._scopeSelectors(cssText, scopeSelector, hostSelector);
- }
- cssText = cssText + '\n' + unscopedRules;
- return cssText.trim();
- };
- /*
- * Process styles to add rules which will only apply under the polyfill
- * and do not process via CSSOM. (CSSOM is destructive to rules on rare
- * occasions, e.g. -webkit-calc on Safari.)
- * For example, we convert this rule:
- *
- * @polyfill-unscoped-rule {
- * content: 'menu-item';
- * ... }
- *
- * to this:
- *
- * menu-item {...}
- *
- **/
- ShadowCss.prototype._extractUnscopedRulesFromCssText = function (cssText) {
- // Difference with webcomponents.js: does not handle comments
- var r = '';
- var m;
- _cssContentUnscopedRuleRe.lastIndex = 0;
- while ((m = _cssContentUnscopedRuleRe.exec(cssText)) !== null) {
- var rule = m[0].replace(m[2], '').replace(m[1], m[4]);
- r += rule + '\n\n';
- }
- return r;
- };
- /*
- * convert a rule like :host(.foo) > .bar { }
- *
- * to
- *
- * .foo<scopeName> > .bar
- */
- ShadowCss.prototype._convertColonHost = function (cssText) {
- return this._convertColonRule(cssText, _cssColonHostRe, this._colonHostPartReplacer);
- };
- /*
- * convert a rule like :host-context(.foo) > .bar { }
- *
- * to
- *
- * .foo<scopeName> > .bar, .foo scopeName > .bar { }
- *
- * and
- *
- * :host-context(.foo:host) .bar { ... }
- *
- * to
- *
- * .foo<scopeName> .bar { ... }
- */
- ShadowCss.prototype._convertColonHostContext = function (cssText) {
- return this._convertColonRule(cssText, _cssColonHostContextRe, this._colonHostContextPartReplacer);
- };
- ShadowCss.prototype._convertColonRule = function (cssText, regExp, partReplacer) {
- // m[1] = :host(-context), m[2] = contents of (), m[3] rest of rule
- return cssText.replace(regExp, function () {
- var m = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- m[_i] = arguments[_i];
- }
- if (m[2]) {
- var parts = m[2].split(',');
- var r = [];
- for (var i = 0; i < parts.length; i++) {
- var p = parts[i].trim();
- if (!p)
- break;
- r.push(partReplacer(_polyfillHostNoCombinator, p, m[3]));
- }
- return r.join(',');
- }
- else {
- return _polyfillHostNoCombinator + m[3];
- }
- });
- };
- ShadowCss.prototype._colonHostContextPartReplacer = function (host, part, suffix) {
- if (part.indexOf(_polyfillHost) > -1) {
- return this._colonHostPartReplacer(host, part, suffix);
- }
- else {
- return host + part + suffix + ', ' + part + ' ' + host + suffix;
- }
- };
- ShadowCss.prototype._colonHostPartReplacer = function (host, part, suffix) {
- return host + part.replace(_polyfillHost, '') + suffix;
- };
- /*
- * Convert combinators like ::shadow and pseudo-elements like ::content
- * by replacing with space.
- */
- ShadowCss.prototype._convertShadowDOMSelectors = function (cssText) {
- return _shadowDOMSelectorsRe.reduce(function (result, pattern) { return result.replace(pattern, ' '); }, cssText);
- };
- // change a selector like 'div' to 'name div'
- ShadowCss.prototype._scopeSelectors = function (cssText, scopeSelector, hostSelector) {
- var _this = this;
- return processRules(cssText, function (rule) {
- var selector = rule.selector;
- var content = rule.content;
- if (rule.selector[0] != '@') {
- selector =
- _this._scopeSelector(rule.selector, scopeSelector, hostSelector, _this.strictStyling);
- }
- else if (rule.selector.startsWith('@media') || rule.selector.startsWith('@supports') ||
- rule.selector.startsWith('@page') || rule.selector.startsWith('@document')) {
- content = _this._scopeSelectors(rule.content, scopeSelector, hostSelector);
- }
- return new CssRule(selector, content);
- });
- };
- ShadowCss.prototype._scopeSelector = function (selector, scopeSelector, hostSelector, strict) {
- var _this = this;
- return selector.split(',')
- .map(function (part) { return part.trim().split(_shadowDeepSelectors); })
- .map(function (deepParts) {
- var _a = __read(deepParts), shallowPart = _a[0], otherParts = _a.slice(1);
- var applyScope = function (shallowPart) {
- if (_this._selectorNeedsScoping(shallowPart, scopeSelector)) {
- return strict ?
- _this._applyStrictSelectorScope(shallowPart, scopeSelector, hostSelector) :
- _this._applySelectorScope(shallowPart, scopeSelector, hostSelector);
- }
- else {
- return shallowPart;
- }
- };
- return __spread([applyScope(shallowPart)], otherParts).join(' ');
- })
- .join(', ');
- };
- ShadowCss.prototype._selectorNeedsScoping = function (selector, scopeSelector) {
- var re = this._makeScopeMatcher(scopeSelector);
- return !re.test(selector);
- };
- ShadowCss.prototype._makeScopeMatcher = function (scopeSelector) {
- var lre = /\[/g;
- var rre = /\]/g;
- scopeSelector = scopeSelector.replace(lre, '\\[').replace(rre, '\\]');
- return new RegExp('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');
- };
- ShadowCss.prototype._applySelectorScope = function (selector, scopeSelector, hostSelector) {
- // Difference from webcomponents.js: scopeSelector could not be an array
- return this._applySimpleSelectorScope(selector, scopeSelector, hostSelector);
- };
- // scope via name and [is=name]
- ShadowCss.prototype._applySimpleSelectorScope = function (selector, scopeSelector, hostSelector) {
- // In Android browser, the lastIndex is not reset when the regex is used in String.replace()
- _polyfillHostRe.lastIndex = 0;
- if (_polyfillHostRe.test(selector)) {
- var replaceBy_1 = this.strictStyling ? "[" + hostSelector + "]" : scopeSelector;
- return selector
- .replace(_polyfillHostNoCombinatorRe, function (hnc, selector) {
- return selector.replace(/([^:]*)(:*)(.*)/, function (_, before, colon, after) {
- return before + replaceBy_1 + colon + after;
- });
- })
- .replace(_polyfillHostRe, replaceBy_1 + ' ');
- }
- return scopeSelector + ' ' + selector;
- };
- // return a selector with [name] suffix on each simple selector
- // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name] /** @internal */
- ShadowCss.prototype._applyStrictSelectorScope = function (selector, scopeSelector, hostSelector) {
- var _this = this;
- var isRe = /\[is=([^\]]*)\]/g;
- scopeSelector = scopeSelector.replace(isRe, function (_) {
- var parts = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- parts[_i - 1] = arguments[_i];
- }
- return parts[0];
- });
- var attrName = '[' + scopeSelector + ']';
- var _scopeSelectorPart = function (p) {
- var scopedP = p.trim();
- if (!scopedP) {
- return '';
- }
- if (p.indexOf(_polyfillHostNoCombinator) > -1) {
- scopedP = _this._applySimpleSelectorScope(p, scopeSelector, hostSelector);
- }
- else {
- // remove :host since it should be unnecessary
- var t = p.replace(_polyfillHostRe, '');
- if (t.length > 0) {
- var matches = t.match(/([^:]*)(:*)(.*)/);
- if (matches) {
- scopedP = matches[1] + attrName + matches[2] + matches[3];
- }
- }
- }
- return scopedP;
- };
- var safeContent = new SafeSelector(selector);
- selector = safeContent.content();
- var scopedSelector = '';
- var startIndex = 0;
- var res;
- var sep = /( |>|\+|~(?!=))\s*/g;
- // If a selector appears before :host it should not be shimmed as it
- // matches on ancestor elements and not on elements in the host's shadow
- // `:host-context(div)` is transformed to
- // `-shadowcsshost-no-combinatordiv, div -shadowcsshost-no-combinator`
- // the `div` is not part of the component in the 2nd selectors and should not be scoped.
- // Historically `component-tag:host` was matching the component so we also want to preserve
- // this behavior to avoid breaking legacy apps (it should not match).
- // The behavior should be:
- // - `tag:host` -> `tag[h]` (this is to avoid breaking legacy apps, should not match anything)
- // - `tag :host` -> `tag [h]` (`tag` is not scoped because it's considered part of a
- // `:host-context(tag)`)
- var hasHost = selector.indexOf(_polyfillHostNoCombinator) > -1;
- // Only scope parts after the first `-shadowcsshost-no-combinator` when it is present
- var shouldScope = !hasHost;
- while ((res = sep.exec(selector)) !== null) {
- var separator = res[1];
- var part_1 = selector.slice(startIndex, res.index).trim();
- shouldScope = shouldScope || part_1.indexOf(_polyfillHostNoCombinator) > -1;
- var scopedPart = shouldScope ? _scopeSelectorPart(part_1) : part_1;
- scopedSelector += scopedPart + " " + separator + " ";
- startIndex = sep.lastIndex;
- }
- var part = selector.substring(startIndex);
- shouldScope = shouldScope || part.indexOf(_polyfillHostNoCombinator) > -1;
- scopedSelector += shouldScope ? _scopeSelectorPart(part) : part;
- // replace the placeholders with their original values
- return safeContent.restore(scopedSelector);
- };
- ShadowCss.prototype._insertPolyfillHostInCssText = function (selector) {
- return selector.replace(_colonHostContextRe, _polyfillHostContext)
- .replace(_colonHostRe, _polyfillHost);
- };
- return ShadowCss;
- }());
- var SafeSelector = /** @class */ (function () {
- function SafeSelector(selector) {
- var _this = this;
- this.placeholders = [];
- this.index = 0;
- // Replaces attribute selectors with placeholders.
- // The WS in [attr="va lue"] would otherwise be interpreted as a selector separator.
- selector = selector.replace(/(\[[^\]]*\])/g, function (_, keep) {
- var replaceBy = "__ph-" + _this.index + "__";
- _this.placeholders.push(keep);
- _this.index++;
- return replaceBy;
- });
- // Replaces the expression in `:nth-child(2n + 1)` with a placeholder.
- // WS and "+" would otherwise be interpreted as selector separators.
- this._content = selector.replace(/(:nth-[-\w]+)(\([^)]+\))/g, function (_, pseudo, exp) {
- var replaceBy = "__ph-" + _this.index + "__";
- _this.placeholders.push(exp);
- _this.index++;
- return pseudo + replaceBy;
- });
- }
- SafeSelector.prototype.restore = function (content) {
- var _this = this;
- return content.replace(/__ph-(\d+)__/g, function (ph, index) { return _this.placeholders[+index]; });
- };
- SafeSelector.prototype.content = function () { return this._content; };
- return SafeSelector;
- }());
- var _cssContentNextSelectorRe = /polyfill-next-selector[^}]*content:[\s]*?(['"])(.*?)\1[;\s]*}([^{]*?){/gim;
- var _cssContentRuleRe = /(polyfill-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim;
- var _cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim;
- var _polyfillHost = '-shadowcsshost';
- // note: :host-context pre-processed to -shadowcsshostcontext.
- var _polyfillHostContext = '-shadowcsscontext';
- var _parenSuffix = ')(?:\\((' +
- '(?:\\([^)(]*\\)|[^)(]*)+?' +
- ')\\))?([^,{]*)';
- var _cssColonHostRe = new RegExp('(' + _polyfillHost + _parenSuffix, 'gim');
- var _cssColonHostContextRe = new RegExp('(' + _polyfillHostContext + _parenSuffix, 'gim');
- var _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';
- var _polyfillHostNoCombinatorRe = /-shadowcsshost-no-combinator([^\s]*)/;
- var _shadowDOMSelectorsRe = [
- /::shadow/g,
- /::content/g,
- // Deprecated selectors
- /\/shadow-deep\//g,
- /\/shadow\//g,
- ];
- // The deep combinator is deprecated in the CSS spec
- // Support for `>>>`, `deep`, `::ng-deep` is then also deprecated and will be removed in the future.
- // see https://github.com/angular/angular/pull/17677
- var _shadowDeepSelectors = /(?:>>>)|(?:\/deep\/)|(?:::ng-deep)/g;
- var _selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
- var _polyfillHostRe = /-shadowcsshost/gim;
- var _colonHostRe = /:host/gim;
- var _colonHostContextRe = /:host-context/gim;
- var _commentRe = /\/\*\s*[\s\S]*?\*\//g;
- function stripComments(input) {
- return input.replace(_commentRe, '');
- }
- var _commentWithHashRe = /\/\*\s*#\s*source(Mapping)?URL=[\s\S]+?\*\//g;
- function extractCommentsWithHash(input) {
- return input.match(_commentWithHashRe) || [];
- }
- var _ruleRe = /(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g;
- var _curlyRe = /([{}])/g;
- var OPEN_CURLY = '{';
- var CLOSE_CURLY = '}';
- var BLOCK_PLACEHOLDER = '%BLOCK%';
- var CssRule = /** @class */ (function () {
- function CssRule(selector, content) {
- this.selector = selector;
- this.content = content;
- }
- return CssRule;
- }());
- function processRules(input, ruleCallback) {
- var inputWithEscapedBlocks = escapeBlocks(input);
- var nextBlockIndex = 0;
- return inputWithEscapedBlocks.escapedString.replace(_ruleRe, function () {
- var m = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- m[_i] = arguments[_i];
- }
- var selector = m[2];
- var content = '';
- var suffix = m[4];
- var contentPrefix = '';
- if (suffix && suffix.startsWith('{' + BLOCK_PLACEHOLDER)) {
- content = inputWithEscapedBlocks.blocks[nextBlockIndex++];
- suffix = suffix.substring(BLOCK_PLACEHOLDER.length + 1);
- contentPrefix = '{';
- }
- var rule = ruleCallback(new CssRule(selector, content));
- return "" + m[1] + rule.selector + m[3] + contentPrefix + rule.content + suffix;
- });
- }
- var StringWithEscapedBlocks = /** @class */ (function () {
- function StringWithEscapedBlocks(escapedString, blocks) {
- this.escapedString = escapedString;
- this.blocks = blocks;
- }
- return StringWithEscapedBlocks;
- }());
- function escapeBlocks(input) {
- var inputParts = input.split(_curlyRe);
- var resultParts = [];
- var escapedBlocks = [];
- var bracketCount = 0;
- var currentBlockParts = [];
- for (var partIndex = 0; partIndex < inputParts.length; partIndex++) {
- var part = inputParts[partIndex];
- if (part == CLOSE_CURLY) {
- bracketCount--;
- }
- if (bracketCount > 0) {
- currentBlockParts.push(part);
- }
- else {
- if (currentBlockParts.length > 0) {
- escapedBlocks.push(currentBlockParts.join(''));
- resultParts.push(BLOCK_PLACEHOLDER);
- currentBlockParts = [];
- }
- resultParts.push(part);
- }
- if (part == OPEN_CURLY) {
- bracketCount++;
- }
- }
- if (currentBlockParts.length > 0) {
- escapedBlocks.push(currentBlockParts.join(''));
- resultParts.push(BLOCK_PLACEHOLDER);
- }
- return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var COMPONENT_VARIABLE = '%COMP%';
- var HOST_ATTR = "_nghost-" + COMPONENT_VARIABLE;
- var CONTENT_ATTR = "_ngcontent-" + COMPONENT_VARIABLE;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A path is an ordered set of elements. Typically a path is to a
- * particular offset in a source file. The head of the list is the top
- * most node. The tail is the node that contains the offset directly.
- *
- * For example, the expression `a + b + c` might have an ast that looks
- * like:
- * +
- * / \
- * a +
- * / \
- * b c
- *
- * The path to the node at offset 9 would be `['+' at 1-10, '+' at 7-10,
- * 'c' at 9-10]` and the path the node at offset 1 would be
- * `['+' at 1-10, 'a' at 1-2]`.
- */
- var AstPath = /** @class */ (function () {
- function AstPath(path, position) {
- if (position === void 0) { position = -1; }
- this.path = path;
- this.position = position;
- }
- Object.defineProperty(AstPath.prototype, "empty", {
- get: function () { return !this.path || !this.path.length; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AstPath.prototype, "head", {
- get: function () { return this.path[0]; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AstPath.prototype, "tail", {
- get: function () { return this.path[this.path.length - 1]; },
- enumerable: true,
- configurable: true
- });
- AstPath.prototype.parentOf = function (node) {
- return node && this.path[this.path.indexOf(node) - 1];
- };
- AstPath.prototype.childOf = function (node) { return this.path[this.path.indexOf(node) + 1]; };
- AstPath.prototype.first = function (ctor) {
- for (var i = this.path.length - 1; i >= 0; i--) {
- var item = this.path[i];
- if (item instanceof ctor)
- return item;
- }
- };
- AstPath.prototype.push = function (node) { this.path.push(node); };
- AstPath.prototype.pop = function () { return this.path.pop(); };
- return AstPath;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var Text$3 = /** @class */ (function () {
- function Text(value, sourceSpan, i18n) {
- this.value = value;
- this.sourceSpan = sourceSpan;
- this.i18n = i18n;
- }
- Text.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
- return Text;
- }());
- var Expansion = /** @class */ (function () {
- function Expansion(switchValue, type, cases, sourceSpan, switchValueSourceSpan, i18n) {
- this.switchValue = switchValue;
- this.type = type;
- this.cases = cases;
- this.sourceSpan = sourceSpan;
- this.switchValueSourceSpan = switchValueSourceSpan;
- this.i18n = i18n;
- }
- Expansion.prototype.visit = function (visitor, context) { return visitor.visitExpansion(this, context); };
- return Expansion;
- }());
- var ExpansionCase = /** @class */ (function () {
- function ExpansionCase(value, expression, sourceSpan, valueSourceSpan, expSourceSpan) {
- this.value = value;
- this.expression = expression;
- this.sourceSpan = sourceSpan;
- this.valueSourceSpan = valueSourceSpan;
- this.expSourceSpan = expSourceSpan;
- }
- ExpansionCase.prototype.visit = function (visitor, context) { return visitor.visitExpansionCase(this, context); };
- return ExpansionCase;
- }());
- var Attribute = /** @class */ (function () {
- function Attribute(name, value, sourceSpan, valueSpan, i18n) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- this.valueSpan = valueSpan;
- this.i18n = i18n;
- }
- Attribute.prototype.visit = function (visitor, context) { return visitor.visitAttribute(this, context); };
- return Attribute;
- }());
- var Element$1 = /** @class */ (function () {
- function Element(name, attrs, children, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
- if (startSourceSpan === void 0) { startSourceSpan = null; }
- if (endSourceSpan === void 0) { endSourceSpan = null; }
- this.name = name;
- this.attrs = attrs;
- this.children = children;
- this.sourceSpan = sourceSpan;
- this.startSourceSpan = startSourceSpan;
- this.endSourceSpan = endSourceSpan;
- this.i18n = i18n;
- }
- Element.prototype.visit = function (visitor, context) { return visitor.visitElement(this, context); };
- return Element;
- }());
- var Comment = /** @class */ (function () {
- function Comment(value, sourceSpan) {
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- Comment.prototype.visit = function (visitor, context) { return visitor.visitComment(this, context); };
- return Comment;
- }());
- function visitAll$1(visitor, nodes, context) {
- if (context === void 0) { context = null; }
- var result = [];
- var visit = visitor.visit ?
- function (ast) { return visitor.visit(ast, context) || ast.visit(visitor, context); } :
- function (ast) { return ast.visit(visitor, context); };
- nodes.forEach(function (ast) {
- var astResult = visit(ast);
- if (astResult) {
- result.push(astResult);
- }
- });
- return result;
- }
- var RecursiveVisitor = /** @class */ (function () {
- function RecursiveVisitor() {
- }
- RecursiveVisitor.prototype.visitElement = function (ast, context) {
- this.visitChildren(context, function (visit) {
- visit(ast.attrs);
- visit(ast.children);
- });
- };
- RecursiveVisitor.prototype.visitAttribute = function (ast, context) { };
- RecursiveVisitor.prototype.visitText = function (ast, context) { };
- RecursiveVisitor.prototype.visitComment = function (ast, context) { };
- RecursiveVisitor.prototype.visitExpansion = function (ast, context) {
- return this.visitChildren(context, function (visit) { visit(ast.cases); });
- };
- RecursiveVisitor.prototype.visitExpansionCase = function (ast, context) { };
- RecursiveVisitor.prototype.visitChildren = function (context, cb) {
- var results = [];
- var t = this;
- function visit(children) {
- if (children)
- results.push(visitAll$1(t, children, context));
- }
- cb(visit);
- return [].concat.apply([], results);
- };
- return RecursiveVisitor;
- }());
- function spanOf(ast) {
- var start = ast.sourceSpan.start.offset;
- var end = ast.sourceSpan.end.offset;
- if (ast instanceof Element$1) {
- if (ast.endSourceSpan) {
- end = ast.endSourceSpan.end.offset;
- }
- else if (ast.children && ast.children.length) {
- end = spanOf(ast.children[ast.children.length - 1]).end;
- }
- }
- return { start: start, end: end };
- }
- function findNode(nodes, position) {
- var path = [];
- var visitor = new /** @class */ (function (_super) {
- __extends(class_1, _super);
- function class_1() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- class_1.prototype.visit = function (ast, context) {
- var span = spanOf(ast);
- if (span.start <= position && position < span.end) {
- path.push(ast);
- }
- else {
- // Returning a value here will result in the children being skipped.
- return true;
- }
- };
- return class_1;
- }(RecursiveVisitor));
- visitAll$1(visitor, nodes);
- return new AstPath(path, position);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TokenType;
- (function (TokenType) {
- TokenType[TokenType["TAG_OPEN_START"] = 0] = "TAG_OPEN_START";
- TokenType[TokenType["TAG_OPEN_END"] = 1] = "TAG_OPEN_END";
- TokenType[TokenType["TAG_OPEN_END_VOID"] = 2] = "TAG_OPEN_END_VOID";
- TokenType[TokenType["TAG_CLOSE"] = 3] = "TAG_CLOSE";
- TokenType[TokenType["TEXT"] = 4] = "TEXT";
- TokenType[TokenType["ESCAPABLE_RAW_TEXT"] = 5] = "ESCAPABLE_RAW_TEXT";
- TokenType[TokenType["RAW_TEXT"] = 6] = "RAW_TEXT";
- TokenType[TokenType["COMMENT_START"] = 7] = "COMMENT_START";
- TokenType[TokenType["COMMENT_END"] = 8] = "COMMENT_END";
- TokenType[TokenType["CDATA_START"] = 9] = "CDATA_START";
- TokenType[TokenType["CDATA_END"] = 10] = "CDATA_END";
- TokenType[TokenType["ATTR_NAME"] = 11] = "ATTR_NAME";
- TokenType[TokenType["ATTR_QUOTE"] = 12] = "ATTR_QUOTE";
- TokenType[TokenType["ATTR_VALUE"] = 13] = "ATTR_VALUE";
- TokenType[TokenType["DOC_TYPE"] = 14] = "DOC_TYPE";
- TokenType[TokenType["EXPANSION_FORM_START"] = 15] = "EXPANSION_FORM_START";
- TokenType[TokenType["EXPANSION_CASE_VALUE"] = 16] = "EXPANSION_CASE_VALUE";
- TokenType[TokenType["EXPANSION_CASE_EXP_START"] = 17] = "EXPANSION_CASE_EXP_START";
- TokenType[TokenType["EXPANSION_CASE_EXP_END"] = 18] = "EXPANSION_CASE_EXP_END";
- TokenType[TokenType["EXPANSION_FORM_END"] = 19] = "EXPANSION_FORM_END";
- TokenType[TokenType["EOF"] = 20] = "EOF";
- })(TokenType || (TokenType = {}));
- var Token = /** @class */ (function () {
- function Token(type, parts, sourceSpan) {
- this.type = type;
- this.parts = parts;
- this.sourceSpan = sourceSpan;
- }
- return Token;
- }());
- var TokenError = /** @class */ (function (_super) {
- __extends(TokenError, _super);
- function TokenError(errorMsg, tokenType, span) {
- var _this = _super.call(this, span, errorMsg) || this;
- _this.tokenType = tokenType;
- return _this;
- }
- return TokenError;
- }(ParseError));
- var TokenizeResult = /** @class */ (function () {
- function TokenizeResult(tokens, errors) {
- this.tokens = tokens;
- this.errors = errors;
- }
- return TokenizeResult;
- }());
- function tokenize(source, url, getTagDefinition, options) {
- if (options === void 0) { options = {}; }
- return new _Tokenizer(new ParseSourceFile(source, url), getTagDefinition, options).tokenize();
- }
- var _CR_OR_CRLF_REGEXP = /\r\n?/g;
- function _unexpectedCharacterErrorMsg(charCode) {
- var char = charCode === $EOF ? 'EOF' : String.fromCharCode(charCode);
- return "Unexpected character \"" + char + "\"";
- }
- function _unknownEntityErrorMsg(entitySrc) {
- return "Unknown entity \"" + entitySrc + "\" - use the \"&#<decimal>;\" or \"&#x<hex>;\" syntax";
- }
- var _ControlFlowError = /** @class */ (function () {
- function _ControlFlowError(error) {
- this.error = error;
- }
- return _ControlFlowError;
- }());
- // See http://www.w3.org/TR/html51/syntax.html#writing
- var _Tokenizer = /** @class */ (function () {
- /**
- * @param _file The html source file being tokenized.
- * @param _getTagDefinition A function that will retrieve a tag definition for a given tag name.
- * @param options Configuration of the tokenization.
- */
- function _Tokenizer(_file, _getTagDefinition, options) {
- this._getTagDefinition = _getTagDefinition;
- this._currentTokenStart = null;
- this._currentTokenType = null;
- this._expansionCaseStack = [];
- this._inInterpolation = false;
- this.tokens = [];
- this.errors = [];
- this._tokenizeIcu = options.tokenizeExpansionForms || false;
- this._interpolationConfig = options.interpolationConfig || DEFAULT_INTERPOLATION_CONFIG;
- this._leadingTriviaCodePoints =
- options.leadingTriviaChars && options.leadingTriviaChars.map(function (c) { return c.codePointAt(0) || 0; });
- var range = options.range || { endPos: _file.content.length, startPos: 0, startLine: 0, startCol: 0 };
- this._cursor = options.escapedString ? new EscapedCharacterCursor(_file, range) :
- new PlainCharacterCursor(_file, range);
- try {
- this._cursor.init();
- }
- catch (e) {
- this.handleError(e);
- }
- }
- _Tokenizer.prototype._processCarriageReturns = function (content) {
- // http://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream
- // In order to keep the original position in the source, we can not
- // pre-process it.
- // Instead CRs are processed right before instantiating the tokens.
- return content.replace(_CR_OR_CRLF_REGEXP, '\n');
- };
- _Tokenizer.prototype.tokenize = function () {
- while (this._cursor.peek() !== $EOF) {
- var start = this._cursor.clone();
- try {
- if (this._attemptCharCode($LT)) {
- if (this._attemptCharCode($BANG)) {
- if (this._attemptCharCode($LBRACKET)) {
- this._consumeCdata(start);
- }
- else if (this._attemptCharCode($MINUS)) {
- this._consumeComment(start);
- }
- else {
- this._consumeDocType(start);
- }
- }
- else if (this._attemptCharCode($SLASH)) {
- this._consumeTagClose(start);
- }
- else {
- this._consumeTagOpen(start);
- }
- }
- else if (!(this._tokenizeIcu && this._tokenizeExpansionForm())) {
- this._consumeText();
- }
- }
- catch (e) {
- this.handleError(e);
- }
- }
- this._beginToken(TokenType.EOF);
- this._endToken([]);
- return new TokenizeResult(mergeTextTokens(this.tokens), this.errors);
- };
- /**
- * @returns whether an ICU token has been created
- * @internal
- */
- _Tokenizer.prototype._tokenizeExpansionForm = function () {
- if (this.isExpansionFormStart()) {
- this._consumeExpansionFormStart();
- return true;
- }
- if (isExpansionCaseStart(this._cursor.peek()) && this._isInExpansionForm()) {
- this._consumeExpansionCaseStart();
- return true;
- }
- if (this._cursor.peek() === $RBRACE) {
- if (this._isInExpansionCase()) {
- this._consumeExpansionCaseEnd();
- return true;
- }
- if (this._isInExpansionForm()) {
- this._consumeExpansionFormEnd();
- return true;
- }
- }
- return false;
- };
- _Tokenizer.prototype._beginToken = function (type, start) {
- if (start === void 0) { start = this._cursor.clone(); }
- this._currentTokenStart = start;
- this._currentTokenType = type;
- };
- _Tokenizer.prototype._endToken = function (parts, end) {
- if (end === void 0) { end = this._cursor.clone(); }
- if (this._currentTokenStart === null) {
- throw new TokenError('Programming error - attempted to end a token when there was no start to the token', this._currentTokenType, this._cursor.getSpan(end));
- }
- if (this._currentTokenType === null) {
- throw new TokenError('Programming error - attempted to end a token which has no token type', null, this._cursor.getSpan(this._currentTokenStart));
- }
- var token = new Token(this._currentTokenType, parts, this._cursor.getSpan(this._currentTokenStart, this._leadingTriviaCodePoints));
- this.tokens.push(token);
- this._currentTokenStart = null;
- this._currentTokenType = null;
- return token;
- };
- _Tokenizer.prototype._createError = function (msg, span) {
- if (this._isInExpansionForm()) {
- msg += " (Do you have an unescaped \"{\" in your template? Use \"{{ '{' }}\") to escape it.)";
- }
- var error = new TokenError(msg, this._currentTokenType, span);
- this._currentTokenStart = null;
- this._currentTokenType = null;
- return new _ControlFlowError(error);
- };
- _Tokenizer.prototype.handleError = function (e) {
- if (e instanceof CursorError) {
- e = this._createError(e.msg, this._cursor.getSpan(e.cursor));
- }
- if (e instanceof _ControlFlowError) {
- this.errors.push(e.error);
- }
- else {
- throw e;
- }
- };
- _Tokenizer.prototype._attemptCharCode = function (charCode) {
- if (this._cursor.peek() === charCode) {
- this._cursor.advance();
- return true;
- }
- return false;
- };
- _Tokenizer.prototype._attemptCharCodeCaseInsensitive = function (charCode) {
- if (compareCharCodeCaseInsensitive(this._cursor.peek(), charCode)) {
- this._cursor.advance();
- return true;
- }
- return false;
- };
- _Tokenizer.prototype._requireCharCode = function (charCode) {
- var location = this._cursor.clone();
- if (!this._attemptCharCode(charCode)) {
- throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(location));
- }
- };
- _Tokenizer.prototype._attemptStr = function (chars) {
- var len = chars.length;
- if (this._cursor.charsLeft() < len) {
- return false;
- }
- var initialPosition = this._cursor.clone();
- for (var i = 0; i < len; i++) {
- if (!this._attemptCharCode(chars.charCodeAt(i))) {
- // If attempting to parse the string fails, we want to reset the parser
- // to where it was before the attempt
- this._cursor = initialPosition;
- return false;
- }
- }
- return true;
- };
- _Tokenizer.prototype._attemptStrCaseInsensitive = function (chars) {
- for (var i = 0; i < chars.length; i++) {
- if (!this._attemptCharCodeCaseInsensitive(chars.charCodeAt(i))) {
- return false;
- }
- }
- return true;
- };
- _Tokenizer.prototype._requireStr = function (chars) {
- var location = this._cursor.clone();
- if (!this._attemptStr(chars)) {
- throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(location));
- }
- };
- _Tokenizer.prototype._attemptCharCodeUntilFn = function (predicate) {
- while (!predicate(this._cursor.peek())) {
- this._cursor.advance();
- }
- };
- _Tokenizer.prototype._requireCharCodeUntilFn = function (predicate, len) {
- var start = this._cursor.clone();
- this._attemptCharCodeUntilFn(predicate);
- var end = this._cursor.clone();
- if (end.diff(start) < len) {
- throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(start));
- }
- };
- _Tokenizer.prototype._attemptUntilChar = function (char) {
- while (this._cursor.peek() !== char) {
- this._cursor.advance();
- }
- };
- _Tokenizer.prototype._readChar = function (decodeEntities) {
- if (decodeEntities && this._cursor.peek() === $AMPERSAND) {
- return this._decodeEntity();
- }
- else {
- // Don't rely upon reading directly from `_input` as the actual char value
- // may have been generated from an escape sequence.
- var char = String.fromCodePoint(this._cursor.peek());
- this._cursor.advance();
- return char;
- }
- };
- _Tokenizer.prototype._decodeEntity = function () {
- var start = this._cursor.clone();
- this._cursor.advance();
- if (this._attemptCharCode($HASH)) {
- var isHex = this._attemptCharCode($x) || this._attemptCharCode($X);
- var codeStart = this._cursor.clone();
- this._attemptCharCodeUntilFn(isDigitEntityEnd);
- if (this._cursor.peek() != $SEMICOLON) {
- throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan());
- }
- var strNum = this._cursor.getChars(codeStart);
- this._cursor.advance();
- try {
- var charCode = parseInt(strNum, isHex ? 16 : 10);
- return String.fromCharCode(charCode);
- }
- catch (_a) {
- throw this._createError(_unknownEntityErrorMsg(this._cursor.getChars(start)), this._cursor.getSpan());
- }
- }
- else {
- var nameStart = this._cursor.clone();
- this._attemptCharCodeUntilFn(isNamedEntityEnd);
- if (this._cursor.peek() != $SEMICOLON) {
- this._cursor = nameStart;
- return '&';
- }
- var name_1 = this._cursor.getChars(nameStart);
- this._cursor.advance();
- var char = NAMED_ENTITIES[name_1];
- if (!char) {
- throw this._createError(_unknownEntityErrorMsg(name_1), this._cursor.getSpan(start));
- }
- return char;
- }
- };
- _Tokenizer.prototype._consumeRawText = function (decodeEntities, endMarkerPredicate) {
- this._beginToken(decodeEntities ? TokenType.ESCAPABLE_RAW_TEXT : TokenType.RAW_TEXT);
- var parts = [];
- while (true) {
- var tagCloseStart = this._cursor.clone();
- var foundEndMarker = endMarkerPredicate();
- this._cursor = tagCloseStart;
- if (foundEndMarker) {
- break;
- }
- parts.push(this._readChar(decodeEntities));
- }
- return this._endToken([this._processCarriageReturns(parts.join(''))]);
- };
- _Tokenizer.prototype._consumeComment = function (start) {
- var _this = this;
- this._beginToken(TokenType.COMMENT_START, start);
- this._requireCharCode($MINUS);
- this._endToken([]);
- this._consumeRawText(false, function () { return _this._attemptStr('-->'); });
- this._beginToken(TokenType.COMMENT_END);
- this._requireStr('-->');
- this._endToken([]);
- };
- _Tokenizer.prototype._consumeCdata = function (start) {
- var _this = this;
- this._beginToken(TokenType.CDATA_START, start);
- this._requireStr('CDATA[');
- this._endToken([]);
- this._consumeRawText(false, function () { return _this._attemptStr(']]>'); });
- this._beginToken(TokenType.CDATA_END);
- this._requireStr(']]>');
- this._endToken([]);
- };
- _Tokenizer.prototype._consumeDocType = function (start) {
- this._beginToken(TokenType.DOC_TYPE, start);
- var contentStart = this._cursor.clone();
- this._attemptUntilChar($GT);
- var content = this._cursor.getChars(contentStart);
- this._cursor.advance();
- this._endToken([content]);
- };
- _Tokenizer.prototype._consumePrefixAndName = function () {
- var nameOrPrefixStart = this._cursor.clone();
- var prefix = '';
- while (this._cursor.peek() !== $COLON && !isPrefixEnd(this._cursor.peek())) {
- this._cursor.advance();
- }
- var nameStart;
- if (this._cursor.peek() === $COLON) {
- prefix = this._cursor.getChars(nameOrPrefixStart);
- this._cursor.advance();
- nameStart = this._cursor.clone();
- }
- else {
- nameStart = nameOrPrefixStart;
- }
- this._requireCharCodeUntilFn(isNameEnd, prefix === '' ? 0 : 1);
- var name = this._cursor.getChars(nameStart);
- return [prefix, name];
- };
- _Tokenizer.prototype._consumeTagOpen = function (start) {
- var tagName;
- var prefix;
- var openTagToken;
- var tokensBeforeTagOpen = this.tokens.length;
- var innerStart = this._cursor.clone();
- try {
- if (!isAsciiLetter(this._cursor.peek())) {
- throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(start));
- }
- openTagToken = this._consumeTagOpenStart(start);
- prefix = openTagToken.parts[0];
- tagName = openTagToken.parts[1];
- this._attemptCharCodeUntilFn(isNotWhitespace);
- while (this._cursor.peek() !== $SLASH && this._cursor.peek() !== $GT) {
- this._consumeAttributeName();
- this._attemptCharCodeUntilFn(isNotWhitespace);
- if (this._attemptCharCode($EQ)) {
- this._attemptCharCodeUntilFn(isNotWhitespace);
- this._consumeAttributeValue();
- }
- this._attemptCharCodeUntilFn(isNotWhitespace);
- }
- this._consumeTagOpenEnd();
- }
- catch (e) {
- if (e instanceof _ControlFlowError) {
- // When the start tag is invalid (including invalid "attributes"), assume we want a "<"
- this._cursor = innerStart;
- if (openTagToken) {
- this.tokens.length = tokensBeforeTagOpen;
- }
- // Back to back text tokens are merged at the end
- this._beginToken(TokenType.TEXT, start);
- this._endToken(['<']);
- return;
- }
- throw e;
- }
- var contentTokenType = this._getTagDefinition(tagName).contentType;
- if (contentTokenType === TagContentType.RAW_TEXT) {
- this._consumeRawTextWithTagClose(prefix, tagName, false);
- }
- else if (contentTokenType === TagContentType.ESCAPABLE_RAW_TEXT) {
- this._consumeRawTextWithTagClose(prefix, tagName, true);
- }
- };
- _Tokenizer.prototype._consumeRawTextWithTagClose = function (prefix, tagName, decodeEntities) {
- var _this = this;
- var textToken = this._consumeRawText(decodeEntities, function () {
- if (!_this._attemptCharCode($LT))
- return false;
- if (!_this._attemptCharCode($SLASH))
- return false;
- _this._attemptCharCodeUntilFn(isNotWhitespace);
- if (!_this._attemptStrCaseInsensitive(tagName))
- return false;
- _this._attemptCharCodeUntilFn(isNotWhitespace);
- return _this._attemptCharCode($GT);
- });
- this._beginToken(TokenType.TAG_CLOSE);
- this._requireCharCodeUntilFn(function (code) { return code === $GT; }, 3);
- this._cursor.advance(); // Consume the `>`
- this._endToken([prefix, tagName]);
- };
- _Tokenizer.prototype._consumeTagOpenStart = function (start) {
- this._beginToken(TokenType.TAG_OPEN_START, start);
- var parts = this._consumePrefixAndName();
- return this._endToken(parts);
- };
- _Tokenizer.prototype._consumeAttributeName = function () {
- var attrNameStart = this._cursor.peek();
- if (attrNameStart === $SQ || attrNameStart === $DQ) {
- throw this._createError(_unexpectedCharacterErrorMsg(attrNameStart), this._cursor.getSpan());
- }
- this._beginToken(TokenType.ATTR_NAME);
- var prefixAndName = this._consumePrefixAndName();
- this._endToken(prefixAndName);
- };
- _Tokenizer.prototype._consumeAttributeValue = function () {
- var value;
- if (this._cursor.peek() === $SQ || this._cursor.peek() === $DQ) {
- this._beginToken(TokenType.ATTR_QUOTE);
- var quoteChar = this._cursor.peek();
- this._cursor.advance();
- this._endToken([String.fromCodePoint(quoteChar)]);
- this._beginToken(TokenType.ATTR_VALUE);
- var parts = [];
- while (this._cursor.peek() !== quoteChar) {
- parts.push(this._readChar(true));
- }
- value = parts.join('');
- this._endToken([this._processCarriageReturns(value)]);
- this._beginToken(TokenType.ATTR_QUOTE);
- this._cursor.advance();
- this._endToken([String.fromCodePoint(quoteChar)]);
- }
- else {
- this._beginToken(TokenType.ATTR_VALUE);
- var valueStart = this._cursor.clone();
- this._requireCharCodeUntilFn(isNameEnd, 1);
- value = this._cursor.getChars(valueStart);
- this._endToken([this._processCarriageReturns(value)]);
- }
- };
- _Tokenizer.prototype._consumeTagOpenEnd = function () {
- var tokenType = this._attemptCharCode($SLASH) ? TokenType.TAG_OPEN_END_VOID : TokenType.TAG_OPEN_END;
- this._beginToken(tokenType);
- this._requireCharCode($GT);
- this._endToken([]);
- };
- _Tokenizer.prototype._consumeTagClose = function (start) {
- this._beginToken(TokenType.TAG_CLOSE, start);
- this._attemptCharCodeUntilFn(isNotWhitespace);
- var prefixAndName = this._consumePrefixAndName();
- this._attemptCharCodeUntilFn(isNotWhitespace);
- this._requireCharCode($GT);
- this._endToken(prefixAndName);
- };
- _Tokenizer.prototype._consumeExpansionFormStart = function () {
- this._beginToken(TokenType.EXPANSION_FORM_START);
- this._requireCharCode($LBRACE);
- this._endToken([]);
- this._expansionCaseStack.push(TokenType.EXPANSION_FORM_START);
- this._beginToken(TokenType.RAW_TEXT);
- var condition = this._readUntil($COMMA);
- this._endToken([condition]);
- this._requireCharCode($COMMA);
- this._attemptCharCodeUntilFn(isNotWhitespace);
- this._beginToken(TokenType.RAW_TEXT);
- var type = this._readUntil($COMMA);
- this._endToken([type]);
- this._requireCharCode($COMMA);
- this._attemptCharCodeUntilFn(isNotWhitespace);
- };
- _Tokenizer.prototype._consumeExpansionCaseStart = function () {
- this._beginToken(TokenType.EXPANSION_CASE_VALUE);
- var value = this._readUntil($LBRACE).trim();
- this._endToken([value]);
- this._attemptCharCodeUntilFn(isNotWhitespace);
- this._beginToken(TokenType.EXPANSION_CASE_EXP_START);
- this._requireCharCode($LBRACE);
- this._endToken([]);
- this._attemptCharCodeUntilFn(isNotWhitespace);
- this._expansionCaseStack.push(TokenType.EXPANSION_CASE_EXP_START);
- };
- _Tokenizer.prototype._consumeExpansionCaseEnd = function () {
- this._beginToken(TokenType.EXPANSION_CASE_EXP_END);
- this._requireCharCode($RBRACE);
- this._endToken([]);
- this._attemptCharCodeUntilFn(isNotWhitespace);
- this._expansionCaseStack.pop();
- };
- _Tokenizer.prototype._consumeExpansionFormEnd = function () {
- this._beginToken(TokenType.EXPANSION_FORM_END);
- this._requireCharCode($RBRACE);
- this._endToken([]);
- this._expansionCaseStack.pop();
- };
- _Tokenizer.prototype._consumeText = function () {
- var start = this._cursor.clone();
- this._beginToken(TokenType.TEXT, start);
- var parts = [];
- do {
- if (this._interpolationConfig && this._attemptStr(this._interpolationConfig.start)) {
- parts.push(this._interpolationConfig.start);
- this._inInterpolation = true;
- }
- else if (this._interpolationConfig && this._inInterpolation &&
- this._attemptStr(this._interpolationConfig.end)) {
- parts.push(this._interpolationConfig.end);
- this._inInterpolation = false;
- }
- else {
- parts.push(this._readChar(true));
- }
- } while (!this._isTextEnd());
- this._endToken([this._processCarriageReturns(parts.join(''))]);
- };
- _Tokenizer.prototype._isTextEnd = function () {
- if (this._cursor.peek() === $LT || this._cursor.peek() === $EOF) {
- return true;
- }
- if (this._tokenizeIcu && !this._inInterpolation) {
- if (this.isExpansionFormStart()) {
- // start of an expansion form
- return true;
- }
- if (this._cursor.peek() === $RBRACE && this._isInExpansionCase()) {
- // end of and expansion case
- return true;
- }
- }
- return false;
- };
- _Tokenizer.prototype._readUntil = function (char) {
- var start = this._cursor.clone();
- this._attemptUntilChar(char);
- return this._cursor.getChars(start);
- };
- _Tokenizer.prototype._isInExpansionCase = function () {
- return this._expansionCaseStack.length > 0 &&
- this._expansionCaseStack[this._expansionCaseStack.length - 1] ===
- TokenType.EXPANSION_CASE_EXP_START;
- };
- _Tokenizer.prototype._isInExpansionForm = function () {
- return this._expansionCaseStack.length > 0 &&
- this._expansionCaseStack[this._expansionCaseStack.length - 1] ===
- TokenType.EXPANSION_FORM_START;
- };
- _Tokenizer.prototype.isExpansionFormStart = function () {
- if (this._cursor.peek() !== $LBRACE) {
- return false;
- }
- if (this._interpolationConfig) {
- var start = this._cursor.clone();
- var isInterpolation = this._attemptStr(this._interpolationConfig.start);
- this._cursor = start;
- return !isInterpolation;
- }
- return true;
- };
- return _Tokenizer;
- }());
- function isNotWhitespace(code) {
- return !isWhitespace(code) || code === $EOF;
- }
- function isNameEnd(code) {
- return isWhitespace(code) || code === $GT || code === $SLASH ||
- code === $SQ || code === $DQ || code === $EQ;
- }
- function isPrefixEnd(code) {
- return (code < $a || $z < code) && (code < $A || $Z < code) &&
- (code < $0 || code > $9);
- }
- function isDigitEntityEnd(code) {
- return code == $SEMICOLON || code == $EOF || !isAsciiHexDigit(code);
- }
- function isNamedEntityEnd(code) {
- return code == $SEMICOLON || code == $EOF || !isAsciiLetter(code);
- }
- function isExpansionCaseStart(peek) {
- return peek === $EQ || isAsciiLetter(peek) || isDigit(peek);
- }
- function compareCharCodeCaseInsensitive(code1, code2) {
- return toUpperCaseCharCode(code1) == toUpperCaseCharCode(code2);
- }
- function toUpperCaseCharCode(code) {
- return code >= $a && code <= $z ? code - $a + $A : code;
- }
- function mergeTextTokens(srcTokens) {
- var dstTokens = [];
- var lastDstToken = undefined;
- for (var i = 0; i < srcTokens.length; i++) {
- var token = srcTokens[i];
- if (lastDstToken && lastDstToken.type == TokenType.TEXT && token.type == TokenType.TEXT) {
- lastDstToken.parts[0] += token.parts[0];
- lastDstToken.sourceSpan.end = token.sourceSpan.end;
- }
- else {
- lastDstToken = token;
- dstTokens.push(lastDstToken);
- }
- }
- return dstTokens;
- }
- var PlainCharacterCursor = /** @class */ (function () {
- function PlainCharacterCursor(fileOrCursor, range) {
- if (fileOrCursor instanceof PlainCharacterCursor) {
- this.file = fileOrCursor.file;
- this.input = fileOrCursor.input;
- this.end = fileOrCursor.end;
- this.state = __assign({}, fileOrCursor.state);
- }
- else {
- if (!range) {
- throw new Error('Programming error: the range argument must be provided with a file argument.');
- }
- this.file = fileOrCursor;
- this.input = fileOrCursor.content;
- this.end = range.endPos;
- this.state = {
- peek: -1,
- offset: range.startPos,
- line: range.startLine,
- column: range.startCol,
- };
- }
- }
- PlainCharacterCursor.prototype.clone = function () { return new PlainCharacterCursor(this); };
- PlainCharacterCursor.prototype.peek = function () { return this.state.peek; };
- PlainCharacterCursor.prototype.charsLeft = function () { return this.end - this.state.offset; };
- PlainCharacterCursor.prototype.diff = function (other) { return this.state.offset - other.state.offset; };
- PlainCharacterCursor.prototype.advance = function () { this.advanceState(this.state); };
- PlainCharacterCursor.prototype.init = function () { this.updatePeek(this.state); };
- PlainCharacterCursor.prototype.getSpan = function (start, leadingTriviaCodePoints) {
- start = start || this;
- if (leadingTriviaCodePoints) {
- start = start.clone();
- while (this.diff(start) > 0 && leadingTriviaCodePoints.indexOf(start.peek()) !== -1) {
- start.advance();
- }
- }
- return new ParseSourceSpan(new ParseLocation(start.file, start.state.offset, start.state.line, start.state.column), new ParseLocation(this.file, this.state.offset, this.state.line, this.state.column));
- };
- PlainCharacterCursor.prototype.getChars = function (start) {
- return this.input.substring(start.state.offset, this.state.offset);
- };
- PlainCharacterCursor.prototype.charAt = function (pos) { return this.input.charCodeAt(pos); };
- PlainCharacterCursor.prototype.advanceState = function (state) {
- if (state.offset >= this.end) {
- this.state = state;
- throw new CursorError('Unexpected character "EOF"', this);
- }
- var currentChar = this.charAt(state.offset);
- if (currentChar === $LF) {
- state.line++;
- state.column = 0;
- }
- else if (!isNewLine(currentChar)) {
- state.column++;
- }
- state.offset++;
- this.updatePeek(state);
- };
- PlainCharacterCursor.prototype.updatePeek = function (state) {
- state.peek = state.offset >= this.end ? $EOF : this.charAt(state.offset);
- };
- return PlainCharacterCursor;
- }());
- var EscapedCharacterCursor = /** @class */ (function (_super) {
- __extends(EscapedCharacterCursor, _super);
- function EscapedCharacterCursor(fileOrCursor, range) {
- var _this = this;
- if (fileOrCursor instanceof EscapedCharacterCursor) {
- _this = _super.call(this, fileOrCursor) || this;
- _this.internalState = __assign({}, fileOrCursor.internalState);
- }
- else {
- _this = _super.call(this, fileOrCursor, range) || this;
- _this.internalState = _this.state;
- }
- return _this;
- }
- EscapedCharacterCursor.prototype.advance = function () {
- this.state = this.internalState;
- _super.prototype.advance.call(this);
- this.processEscapeSequence();
- };
- EscapedCharacterCursor.prototype.init = function () {
- _super.prototype.init.call(this);
- this.processEscapeSequence();
- };
- EscapedCharacterCursor.prototype.clone = function () { return new EscapedCharacterCursor(this); };
- EscapedCharacterCursor.prototype.getChars = function (start) {
- var cursor = start.clone();
- var chars = '';
- while (cursor.internalState.offset < this.internalState.offset) {
- chars += String.fromCodePoint(cursor.peek());
- cursor.advance();
- }
- return chars;
- };
- /**
- * Process the escape sequence that starts at the current position in the text.
- *
- * This method is called to ensure that `peek` has the unescaped value of escape sequences.
- */
- EscapedCharacterCursor.prototype.processEscapeSequence = function () {
- var _this = this;
- var peek = function () { return _this.internalState.peek; };
- if (peek() === $BACKSLASH) {
- // We have hit an escape sequence so we need the internal state to become independent
- // of the external state.
- this.internalState = __assign({}, this.state);
- // Move past the backslash
- this.advanceState(this.internalState);
- // First check for standard control char sequences
- if (peek() === $n) {
- this.state.peek = $LF;
- }
- else if (peek() === $r) {
- this.state.peek = $CR;
- }
- else if (peek() === $v) {
- this.state.peek = $VTAB;
- }
- else if (peek() === $t) {
- this.state.peek = $TAB;
- }
- else if (peek() === $b) {
- this.state.peek = $BSPACE;
- }
- else if (peek() === $f) {
- this.state.peek = $FF;
- }
- // Now consider more complex sequences
- else if (peek() === $u) {
- // Unicode code-point sequence
- this.advanceState(this.internalState); // advance past the `u` char
- if (peek() === $LBRACE) {
- // Variable length Unicode, e.g. `\x{123}`
- this.advanceState(this.internalState); // advance past the `{` char
- // Advance past the variable number of hex digits until we hit a `}` char
- var digitStart = this.clone();
- var length_1 = 0;
- while (peek() !== $RBRACE) {
- this.advanceState(this.internalState);
- length_1++;
- }
- this.state.peek = this.decodeHexDigits(digitStart, length_1);
- }
- else {
- // Fixed length Unicode, e.g. `\u1234`
- var digitStart = this.clone();
- this.advanceState(this.internalState);
- this.advanceState(this.internalState);
- this.advanceState(this.internalState);
- this.state.peek = this.decodeHexDigits(digitStart, 4);
- }
- }
- else if (peek() === $x) {
- // Hex char code, e.g. `\x2F`
- this.advanceState(this.internalState); // advance past the `x` char
- var digitStart = this.clone();
- this.advanceState(this.internalState);
- this.state.peek = this.decodeHexDigits(digitStart, 2);
- }
- else if (isOctalDigit(peek())) {
- // Octal char code, e.g. `\012`,
- var octal = '';
- var length_2 = 0;
- var previous = this.clone();
- while (isOctalDigit(peek()) && length_2 < 3) {
- previous = this.clone();
- octal += String.fromCodePoint(peek());
- this.advanceState(this.internalState);
- length_2++;
- }
- this.state.peek = parseInt(octal, 8);
- // Backup one char
- this.internalState = previous.internalState;
- }
- else if (isNewLine(this.internalState.peek)) {
- // Line continuation `\` followed by a new line
- this.advanceState(this.internalState); // advance over the newline
- this.state = this.internalState;
- }
- else {
- // If none of the `if` blocks were executed then we just have an escaped normal character.
- // In that case we just, effectively, skip the backslash from the character.
- this.state.peek = this.internalState.peek;
- }
- }
- };
- EscapedCharacterCursor.prototype.decodeHexDigits = function (start, length) {
- var hex = this.input.substr(start.internalState.offset, length);
- var charCode = parseInt(hex, 16);
- if (!isNaN(charCode)) {
- return charCode;
- }
- else {
- start.state = start.internalState;
- throw new CursorError('Invalid hexadecimal escape sequence', start);
- }
- };
- return EscapedCharacterCursor;
- }(PlainCharacterCursor));
- var CursorError = /** @class */ (function () {
- function CursorError(msg, cursor) {
- this.msg = msg;
- this.cursor = cursor;
- }
- return CursorError;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TreeError = /** @class */ (function (_super) {
- __extends(TreeError, _super);
- function TreeError(elementName, span, msg) {
- var _this = _super.call(this, span, msg) || this;
- _this.elementName = elementName;
- return _this;
- }
- TreeError.create = function (elementName, span, msg) {
- return new TreeError(elementName, span, msg);
- };
- return TreeError;
- }(ParseError));
- var ParseTreeResult = /** @class */ (function () {
- function ParseTreeResult(rootNodes, errors) {
- this.rootNodes = rootNodes;
- this.errors = errors;
- }
- return ParseTreeResult;
- }());
- var Parser = /** @class */ (function () {
- function Parser(getTagDefinition) {
- this.getTagDefinition = getTagDefinition;
- }
- Parser.prototype.parse = function (source, url, options) {
- var tokensAndErrors = tokenize(source, url, this.getTagDefinition, options);
- var treeAndErrors = new _TreeBuilder(tokensAndErrors.tokens, this.getTagDefinition).build();
- return new ParseTreeResult(treeAndErrors.rootNodes, tokensAndErrors.errors.concat(treeAndErrors.errors));
- };
- return Parser;
- }());
- var _TreeBuilder = /** @class */ (function () {
- function _TreeBuilder(tokens, getTagDefinition) {
- this.tokens = tokens;
- this.getTagDefinition = getTagDefinition;
- this._index = -1;
- this._rootNodes = [];
- this._errors = [];
- this._elementStack = [];
- this._advance();
- }
- _TreeBuilder.prototype.build = function () {
- while (this._peek.type !== TokenType.EOF) {
- if (this._peek.type === TokenType.TAG_OPEN_START) {
- this._consumeStartTag(this._advance());
- }
- else if (this._peek.type === TokenType.TAG_CLOSE) {
- this._consumeEndTag(this._advance());
- }
- else if (this._peek.type === TokenType.CDATA_START) {
- this._closeVoidElement();
- this._consumeCdata(this._advance());
- }
- else if (this._peek.type === TokenType.COMMENT_START) {
- this._closeVoidElement();
- this._consumeComment(this._advance());
- }
- else if (this._peek.type === TokenType.TEXT || this._peek.type === TokenType.RAW_TEXT ||
- this._peek.type === TokenType.ESCAPABLE_RAW_TEXT) {
- this._closeVoidElement();
- this._consumeText(this._advance());
- }
- else if (this._peek.type === TokenType.EXPANSION_FORM_START) {
- this._consumeExpansion(this._advance());
- }
- else {
- // Skip all other tokens...
- this._advance();
- }
- }
- return new ParseTreeResult(this._rootNodes, this._errors);
- };
- _TreeBuilder.prototype._advance = function () {
- var prev = this._peek;
- if (this._index < this.tokens.length - 1) {
- // Note: there is always an EOF token at the end
- this._index++;
- }
- this._peek = this.tokens[this._index];
- return prev;
- };
- _TreeBuilder.prototype._advanceIf = function (type) {
- if (this._peek.type === type) {
- return this._advance();
- }
- return null;
- };
- _TreeBuilder.prototype._consumeCdata = function (startToken) {
- this._consumeText(this._advance());
- this._advanceIf(TokenType.CDATA_END);
- };
- _TreeBuilder.prototype._consumeComment = function (token) {
- var text = this._advanceIf(TokenType.RAW_TEXT);
- this._advanceIf(TokenType.COMMENT_END);
- var value = text != null ? text.parts[0].trim() : null;
- this._addToParent(new Comment(value, token.sourceSpan));
- };
- _TreeBuilder.prototype._consumeExpansion = function (token) {
- var switchValue = this._advance();
- var type = this._advance();
- var cases = [];
- // read =
- while (this._peek.type === TokenType.EXPANSION_CASE_VALUE) {
- var expCase = this._parseExpansionCase();
- if (!expCase)
- return; // error
- cases.push(expCase);
- }
- // read the final }
- if (this._peek.type !== TokenType.EXPANSION_FORM_END) {
- this._errors.push(TreeError.create(null, this._peek.sourceSpan, "Invalid ICU message. Missing '}'."));
- return;
- }
- var sourceSpan = new ParseSourceSpan(token.sourceSpan.start, this._peek.sourceSpan.end);
- this._addToParent(new Expansion(switchValue.parts[0], type.parts[0], cases, sourceSpan, switchValue.sourceSpan));
- this._advance();
- };
- _TreeBuilder.prototype._parseExpansionCase = function () {
- var value = this._advance();
- // read {
- if (this._peek.type !== TokenType.EXPANSION_CASE_EXP_START) {
- this._errors.push(TreeError.create(null, this._peek.sourceSpan, "Invalid ICU message. Missing '{'."));
- return null;
- }
- // read until }
- var start = this._advance();
- var exp = this._collectExpansionExpTokens(start);
- if (!exp)
- return null;
- var end = this._advance();
- exp.push(new Token(TokenType.EOF, [], end.sourceSpan));
- // parse everything in between { and }
- var parsedExp = new _TreeBuilder(exp, this.getTagDefinition).build();
- if (parsedExp.errors.length > 0) {
- this._errors = this._errors.concat(parsedExp.errors);
- return null;
- }
- var sourceSpan = new ParseSourceSpan(value.sourceSpan.start, end.sourceSpan.end);
- var expSourceSpan = new ParseSourceSpan(start.sourceSpan.start, end.sourceSpan.end);
- return new ExpansionCase(value.parts[0], parsedExp.rootNodes, sourceSpan, value.sourceSpan, expSourceSpan);
- };
- _TreeBuilder.prototype._collectExpansionExpTokens = function (start) {
- var exp = [];
- var expansionFormStack = [TokenType.EXPANSION_CASE_EXP_START];
- while (true) {
- if (this._peek.type === TokenType.EXPANSION_FORM_START ||
- this._peek.type === TokenType.EXPANSION_CASE_EXP_START) {
- expansionFormStack.push(this._peek.type);
- }
- if (this._peek.type === TokenType.EXPANSION_CASE_EXP_END) {
- if (lastOnStack(expansionFormStack, TokenType.EXPANSION_CASE_EXP_START)) {
- expansionFormStack.pop();
- if (expansionFormStack.length == 0)
- return exp;
- }
- else {
- this._errors.push(TreeError.create(null, start.sourceSpan, "Invalid ICU message. Missing '}'."));
- return null;
- }
- }
- if (this._peek.type === TokenType.EXPANSION_FORM_END) {
- if (lastOnStack(expansionFormStack, TokenType.EXPANSION_FORM_START)) {
- expansionFormStack.pop();
- }
- else {
- this._errors.push(TreeError.create(null, start.sourceSpan, "Invalid ICU message. Missing '}'."));
- return null;
- }
- }
- if (this._peek.type === TokenType.EOF) {
- this._errors.push(TreeError.create(null, start.sourceSpan, "Invalid ICU message. Missing '}'."));
- return null;
- }
- exp.push(this._advance());
- }
- };
- _TreeBuilder.prototype._consumeText = function (token) {
- var text = token.parts[0];
- if (text.length > 0 && text[0] == '\n') {
- var parent_1 = this._getParentElement();
- if (parent_1 != null && parent_1.children.length == 0 &&
- this.getTagDefinition(parent_1.name).ignoreFirstLf) {
- text = text.substring(1);
- }
- }
- if (text.length > 0) {
- this._addToParent(new Text$3(text, token.sourceSpan));
- }
- };
- _TreeBuilder.prototype._closeVoidElement = function () {
- var el = this._getParentElement();
- if (el && this.getTagDefinition(el.name).isVoid) {
- this._elementStack.pop();
- }
- };
- _TreeBuilder.prototype._consumeStartTag = function (startTagToken) {
- var prefix = startTagToken.parts[0];
- var name = startTagToken.parts[1];
- var attrs = [];
- while (this._peek.type === TokenType.ATTR_NAME) {
- attrs.push(this._consumeAttr(this._advance()));
- }
- var fullName = this._getElementFullName(prefix, name, this._getParentElement());
- var selfClosing = false;
- // Note: There could have been a tokenizer error
- // so that we don't get a token for the end tag...
- if (this._peek.type === TokenType.TAG_OPEN_END_VOID) {
- this._advance();
- selfClosing = true;
- var tagDef = this.getTagDefinition(fullName);
- if (!(tagDef.canSelfClose || getNsPrefix(fullName) !== null || tagDef.isVoid)) {
- this._errors.push(TreeError.create(fullName, startTagToken.sourceSpan, "Only void and foreign elements can be self closed \"" + startTagToken.parts[1] + "\""));
- }
- }
- else if (this._peek.type === TokenType.TAG_OPEN_END) {
- this._advance();
- selfClosing = false;
- }
- var end = this._peek.sourceSpan.start;
- var span = new ParseSourceSpan(startTagToken.sourceSpan.start, end);
- var el = new Element$1(fullName, attrs, [], span, span, undefined);
- this._pushElement(el);
- if (selfClosing) {
- this._popElement(fullName);
- el.endSourceSpan = span;
- }
- };
- _TreeBuilder.prototype._pushElement = function (el) {
- var parentEl = this._getParentElement();
- if (parentEl && this.getTagDefinition(parentEl.name).isClosedByChild(el.name)) {
- this._elementStack.pop();
- }
- this._addToParent(el);
- this._elementStack.push(el);
- };
- _TreeBuilder.prototype._consumeEndTag = function (endTagToken) {
- var fullName = this._getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement());
- if (this._getParentElement()) {
- this._getParentElement().endSourceSpan = endTagToken.sourceSpan;
- }
- if (this.getTagDefinition(fullName).isVoid) {
- this._errors.push(TreeError.create(fullName, endTagToken.sourceSpan, "Void elements do not have end tags \"" + endTagToken.parts[1] + "\""));
- }
- else if (!this._popElement(fullName)) {
- var errMsg = "Unexpected closing tag \"" + fullName + "\". It may happen when the tag has already been closed by another tag. For more info see https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags";
- this._errors.push(TreeError.create(fullName, endTagToken.sourceSpan, errMsg));
- }
- };
- _TreeBuilder.prototype._popElement = function (fullName) {
- for (var stackIndex = this._elementStack.length - 1; stackIndex >= 0; stackIndex--) {
- var el = this._elementStack[stackIndex];
- if (el.name == fullName) {
- this._elementStack.splice(stackIndex, this._elementStack.length - stackIndex);
- return true;
- }
- if (!this.getTagDefinition(el.name).closedByParent) {
- return false;
- }
- }
- return false;
- };
- _TreeBuilder.prototype._consumeAttr = function (attrName) {
- var fullName = mergeNsAndName(attrName.parts[0], attrName.parts[1]);
- var end = attrName.sourceSpan.end;
- var value = '';
- var valueSpan = undefined;
- if (this._peek.type === TokenType.ATTR_QUOTE) {
- this._advance();
- }
- if (this._peek.type === TokenType.ATTR_VALUE) {
- var valueToken = this._advance();
- value = valueToken.parts[0];
- end = valueToken.sourceSpan.end;
- valueSpan = valueToken.sourceSpan;
- }
- if (this._peek.type === TokenType.ATTR_QUOTE) {
- var quoteToken = this._advance();
- end = quoteToken.sourceSpan.end;
- }
- return new Attribute(fullName, value, new ParseSourceSpan(attrName.sourceSpan.start, end), valueSpan);
- };
- _TreeBuilder.prototype._getParentElement = function () {
- return this._elementStack.length > 0 ? this._elementStack[this._elementStack.length - 1] : null;
- };
- /**
- * Returns the parent in the DOM and the container.
- *
- * `<ng-container>` elements are skipped as they are not rendered as DOM element.
- */
- _TreeBuilder.prototype._getParentElementSkippingContainers = function () {
- var container = null;
- for (var i = this._elementStack.length - 1; i >= 0; i--) {
- if (!isNgContainer(this._elementStack[i].name)) {
- return { parent: this._elementStack[i], container: container };
- }
- container = this._elementStack[i];
- }
- return { parent: null, container: container };
- };
- _TreeBuilder.prototype._addToParent = function (node) {
- var parent = this._getParentElement();
- if (parent != null) {
- parent.children.push(node);
- }
- else {
- this._rootNodes.push(node);
- }
- };
- /**
- * Insert a node between the parent and the container.
- * When no container is given, the node is appended as a child of the parent.
- * Also updates the element stack accordingly.
- *
- * @internal
- */
- _TreeBuilder.prototype._insertBeforeContainer = function (parent, container, node) {
- if (!container) {
- this._addToParent(node);
- this._elementStack.push(node);
- }
- else {
- if (parent) {
- // replace the container with the new node in the children
- var index = parent.children.indexOf(container);
- parent.children[index] = node;
- }
- else {
- this._rootNodes.push(node);
- }
- node.children.push(container);
- this._elementStack.splice(this._elementStack.indexOf(container), 0, node);
- }
- };
- _TreeBuilder.prototype._getElementFullName = function (prefix, localName, parentElement) {
- if (prefix === '') {
- prefix = this.getTagDefinition(localName).implicitNamespacePrefix || '';
- if (prefix === '' && parentElement != null) {
- prefix = getNsPrefix(parentElement.name);
- }
- }
- return mergeNsAndName(prefix, localName);
- };
- return _TreeBuilder;
- }());
- function lastOnStack(stack, element) {
- return stack.length > 0 && stack[stack.length - 1] === element;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var HtmlParser = /** @class */ (function (_super) {
- __extends(HtmlParser, _super);
- function HtmlParser() {
- return _super.call(this, getHtmlTagDefinition) || this;
- }
- HtmlParser.prototype.parse = function (source, url, options) {
- return _super.prototype.parse.call(this, source, url, options);
- };
- return HtmlParser;
- }(Parser));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var PRESERVE_WS_ATTR_NAME = 'ngPreserveWhitespaces';
- var SKIP_WS_TRIM_TAGS = new Set(['pre', 'template', 'textarea', 'script', 'style']);
- // Equivalent to \s with \u00a0 (non-breaking space) excluded.
- // Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
- var WS_CHARS = ' \f\n\r\t\v\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff';
- var NO_WS_REGEXP = new RegExp("[^" + WS_CHARS + "]");
- var WS_REPLACE_REGEXP = new RegExp("[" + WS_CHARS + "]{2,}", 'g');
- function hasPreserveWhitespacesAttr(attrs) {
- return attrs.some(function (attr) { return attr.name === PRESERVE_WS_ATTR_NAME; });
- }
- /**
- * Angular Dart introduced &ngsp; as a placeholder for non-removable space, see:
- * https://github.com/dart-lang/angular/blob/0bb611387d29d65b5af7f9d2515ab571fd3fbee4/_tests/test/compiler/preserve_whitespace_test.dart#L25-L32
- * In Angular Dart &ngsp; is converted to the 0xE500 PUA (Private Use Areas) unicode character
- * and later on replaced by a space. We are re-implementing the same idea here.
- */
- function replaceNgsp(value) {
- // lexer is replacing the &ngsp; pseudo-entity with NGSP_UNICODE
- return value.replace(new RegExp(NGSP_UNICODE, 'g'), ' ');
- }
- /**
- * This visitor can walk HTML parse tree and remove / trim text nodes using the following rules:
- * - consider spaces, tabs and new lines as whitespace characters;
- * - drop text nodes consisting of whitespace characters only;
- * - for all other text nodes replace consecutive whitespace characters with one space;
- * - convert &ngsp; pseudo-entity to a single space;
- *
- * Removal and trimming of whitespaces have positive performance impact (less code to generate
- * while compiling templates, faster view creation). At the same time it can be "destructive"
- * in some cases (whitespaces can influence layout). Because of the potential of breaking layout
- * this visitor is not activated by default in Angular 5 and people need to explicitly opt-in for
- * whitespace removal. The default option for whitespace removal will be revisited in Angular 6
- * and might be changed to "on" by default.
- */
- var WhitespaceVisitor = /** @class */ (function () {
- function WhitespaceVisitor() {
- }
- WhitespaceVisitor.prototype.visitElement = function (element, context) {
- if (SKIP_WS_TRIM_TAGS.has(element.name) || hasPreserveWhitespacesAttr(element.attrs)) {
- // don't descent into elements where we need to preserve whitespaces
- // but still visit all attributes to eliminate one used as a market to preserve WS
- return new Element$1(element.name, visitAll$1(this, element.attrs), element.children, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
- }
- return new Element$1(element.name, element.attrs, visitAll$1(this, element.children), element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
- };
- WhitespaceVisitor.prototype.visitAttribute = function (attribute, context) {
- return attribute.name !== PRESERVE_WS_ATTR_NAME ? attribute : null;
- };
- WhitespaceVisitor.prototype.visitText = function (text, context) {
- var isNotBlank = text.value.match(NO_WS_REGEXP);
- if (isNotBlank) {
- return new Text$3(replaceNgsp(text.value).replace(WS_REPLACE_REGEXP, ' '), text.sourceSpan, text.i18n);
- }
- return null;
- };
- WhitespaceVisitor.prototype.visitComment = function (comment, context) { return comment; };
- WhitespaceVisitor.prototype.visitExpansion = function (expansion, context) { return expansion; };
- WhitespaceVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return expansionCase; };
- return WhitespaceVisitor;
- }());
- function removeWhitespaces(htmlAstWithErrors) {
- return new ParseTreeResult(visitAll$1(new WhitespaceVisitor(), htmlAstWithErrors.rootNodes), htmlAstWithErrors.errors);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // http://cldr.unicode.org/index/cldr-spec/plural-rules
- var PLURAL_CASES = ['zero', 'one', 'two', 'few', 'many', 'other'];
- /**
- * Expands special forms into elements.
- *
- * For example,
- *
- * ```
- * { messages.length, plural,
- * =0 {zero}
- * =1 {one}
- * other {more than one}
- * }
- * ```
- *
- * will be expanded into
- *
- * ```
- * <ng-container [ngPlural]="messages.length">
- * <ng-template ngPluralCase="=0">zero</ng-template>
- * <ng-template ngPluralCase="=1">one</ng-template>
- * <ng-template ngPluralCase="other">more than one</ng-template>
- * </ng-container>
- * ```
- */
- function expandNodes(nodes) {
- var expander = new _Expander();
- return new ExpansionResult(visitAll$1(expander, nodes), expander.isExpanded, expander.errors);
- }
- var ExpansionResult = /** @class */ (function () {
- function ExpansionResult(nodes, expanded, errors) {
- this.nodes = nodes;
- this.expanded = expanded;
- this.errors = errors;
- }
- return ExpansionResult;
- }());
- var ExpansionError = /** @class */ (function (_super) {
- __extends(ExpansionError, _super);
- function ExpansionError(span, errorMsg) {
- return _super.call(this, span, errorMsg) || this;
- }
- return ExpansionError;
- }(ParseError));
- /**
- * Expand expansion forms (plural, select) to directives
- *
- * @internal
- */
- var _Expander = /** @class */ (function () {
- function _Expander() {
- this.isExpanded = false;
- this.errors = [];
- }
- _Expander.prototype.visitElement = function (element, context) {
- return new Element$1(element.name, element.attrs, visitAll$1(this, element.children), element.sourceSpan, element.startSourceSpan, element.endSourceSpan);
- };
- _Expander.prototype.visitAttribute = function (attribute, context) { return attribute; };
- _Expander.prototype.visitText = function (text, context) { return text; };
- _Expander.prototype.visitComment = function (comment, context) { return comment; };
- _Expander.prototype.visitExpansion = function (icu, context) {
- this.isExpanded = true;
- return icu.type == 'plural' ? _expandPluralForm(icu, this.errors) :
- _expandDefaultForm(icu, this.errors);
- };
- _Expander.prototype.visitExpansionCase = function (icuCase, context) {
- throw new Error('Should not be reached');
- };
- return _Expander;
- }());
- // Plural forms are expanded to `NgPlural` and `NgPluralCase`s
- function _expandPluralForm(ast, errors) {
- var children = ast.cases.map(function (c) {
- if (PLURAL_CASES.indexOf(c.value) == -1 && !c.value.match(/^=\d+$/)) {
- errors.push(new ExpansionError(c.valueSourceSpan, "Plural cases should be \"=<number>\" or one of " + PLURAL_CASES.join(", ")));
- }
- var expansionResult = expandNodes(c.expression);
- errors.push.apply(errors, __spread(expansionResult.errors));
- return new Element$1("ng-template", [new Attribute('ngPluralCase', "" + c.value, c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);
- });
- var switchAttr = new Attribute('[ngPlural]', ast.switchValue, ast.switchValueSourceSpan);
- return new Element$1('ng-container', [switchAttr], children, ast.sourceSpan, ast.sourceSpan, ast.sourceSpan);
- }
- // ICU messages (excluding plural form) are expanded to `NgSwitch` and `NgSwitchCase`s
- function _expandDefaultForm(ast, errors) {
- var children = ast.cases.map(function (c) {
- var expansionResult = expandNodes(c.expression);
- errors.push.apply(errors, __spread(expansionResult.errors));
- if (c.value === 'other') {
- // other is the default case when no values match
- return new Element$1("ng-template", [new Attribute('ngSwitchDefault', '', c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);
- }
- return new Element$1("ng-template", [new Attribute('ngSwitchCase', "" + c.value, c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);
- });
- var switchAttr = new Attribute('[ngSwitch]', ast.switchValue, ast.switchValueSourceSpan);
- return new Element$1('ng-container', [switchAttr], children, ast.sourceSpan, ast.sourceSpan, ast.sourceSpan);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _a;
- /**
- * A segment of text within the template.
- */
- var TextAst = /** @class */ (function () {
- function TextAst(value, ngContentIndex, sourceSpan) {
- this.value = value;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- TextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
- return TextAst;
- }());
- /**
- * A bound expression within the text of a template.
- */
- var BoundTextAst = /** @class */ (function () {
- function BoundTextAst(value, ngContentIndex, sourceSpan) {
- this.value = value;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- BoundTextAst.prototype.visit = function (visitor, context) {
- return visitor.visitBoundText(this, context);
- };
- return BoundTextAst;
- }());
- /**
- * A plain attribute on an element.
- */
- var AttrAst = /** @class */ (function () {
- function AttrAst(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- AttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };
- return AttrAst;
- }());
- var BoundPropertyMapping = (_a = {},
- _a[4 /* Animation */] = 4 /* Animation */,
- _a[1 /* Attribute */] = 1 /* Attribute */,
- _a[2 /* Class */] = 2 /* Class */,
- _a[0 /* Property */] = 0 /* Property */,
- _a[3 /* Style */] = 3 /* Style */,
- _a);
- /**
- * A binding for an element property (e.g. `[property]="expression"`) or an animation trigger (e.g.
- * `[@trigger]="stateExp"`)
- */
- var BoundElementPropertyAst = /** @class */ (function () {
- function BoundElementPropertyAst(name, type, securityContext, value, unit, sourceSpan) {
- this.name = name;
- this.type = type;
- this.securityContext = securityContext;
- this.value = value;
- this.unit = unit;
- this.sourceSpan = sourceSpan;
- this.isAnimation = this.type === 4 /* Animation */;
- }
- BoundElementPropertyAst.fromBoundProperty = function (prop) {
- var type = BoundPropertyMapping[prop.type];
- return new BoundElementPropertyAst(prop.name, type, prop.securityContext, prop.value, prop.unit, prop.sourceSpan);
- };
- BoundElementPropertyAst.prototype.visit = function (visitor, context) {
- return visitor.visitElementProperty(this, context);
- };
- return BoundElementPropertyAst;
- }());
- /**
- * A binding for an element event (e.g. `(event)="handler()"`) or an animation trigger event (e.g.
- * `(@trigger.phase)="callback($event)"`).
- */
- var BoundEventAst = /** @class */ (function () {
- function BoundEventAst(name, target, phase, handler, sourceSpan, handlerSpan) {
- this.name = name;
- this.target = target;
- this.phase = phase;
- this.handler = handler;
- this.sourceSpan = sourceSpan;
- this.handlerSpan = handlerSpan;
- this.fullName = BoundEventAst.calcFullName(this.name, this.target, this.phase);
- this.isAnimation = !!this.phase;
- }
- BoundEventAst.calcFullName = function (name, target, phase) {
- if (target) {
- return target + ":" + name;
- }
- if (phase) {
- return "@" + name + "." + phase;
- }
- return name;
- };
- BoundEventAst.fromParsedEvent = function (event) {
- var target = event.type === 0 /* Regular */ ? event.targetOrPhase : null;
- var phase = event.type === 1 /* Animation */ ? event.targetOrPhase : null;
- return new BoundEventAst(event.name, target, phase, event.handler, event.sourceSpan, event.handlerSpan);
- };
- BoundEventAst.prototype.visit = function (visitor, context) {
- return visitor.visitEvent(this, context);
- };
- return BoundEventAst;
- }());
- /**
- * A reference declaration on an element (e.g. `let someName="expression"`).
- */
- var ReferenceAst = /** @class */ (function () {
- function ReferenceAst(name, value, originalValue, sourceSpan) {
- this.name = name;
- this.value = value;
- this.originalValue = originalValue;
- this.sourceSpan = sourceSpan;
- }
- ReferenceAst.prototype.visit = function (visitor, context) {
- return visitor.visitReference(this, context);
- };
- return ReferenceAst;
- }());
- /**
- * A variable declaration on a <ng-template> (e.g. `var-someName="someLocalName"`).
- */
- var VariableAst = /** @class */ (function () {
- function VariableAst(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- VariableAst.fromParsedVariable = function (v) {
- return new VariableAst(v.name, v.value, v.sourceSpan);
- };
- VariableAst.prototype.visit = function (visitor, context) {
- return visitor.visitVariable(this, context);
- };
- return VariableAst;
- }());
- /**
- * An element declaration in a template.
- */
- var ElementAst = /** @class */ (function () {
- function ElementAst(name, attrs, inputs, outputs, references, directives, providers, hasViewContainer, queryMatches, children, ngContentIndex, sourceSpan, endSourceSpan) {
- this.name = name;
- this.attrs = attrs;
- this.inputs = inputs;
- this.outputs = outputs;
- this.references = references;
- this.directives = directives;
- this.providers = providers;
- this.hasViewContainer = hasViewContainer;
- this.queryMatches = queryMatches;
- this.children = children;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- this.endSourceSpan = endSourceSpan;
- }
- ElementAst.prototype.visit = function (visitor, context) {
- return visitor.visitElement(this, context);
- };
- return ElementAst;
- }());
- /**
- * A `<ng-template>` element included in an Angular template.
- */
- var EmbeddedTemplateAst = /** @class */ (function () {
- function EmbeddedTemplateAst(attrs, outputs, references, variables, directives, providers, hasViewContainer, queryMatches, children, ngContentIndex, sourceSpan) {
- this.attrs = attrs;
- this.outputs = outputs;
- this.references = references;
- this.variables = variables;
- this.directives = directives;
- this.providers = providers;
- this.hasViewContainer = hasViewContainer;
- this.queryMatches = queryMatches;
- this.children = children;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- EmbeddedTemplateAst.prototype.visit = function (visitor, context) {
- return visitor.visitEmbeddedTemplate(this, context);
- };
- return EmbeddedTemplateAst;
- }());
- /**
- * A directive property with a bound value (e.g. `*ngIf="condition").
- */
- var BoundDirectivePropertyAst = /** @class */ (function () {
- function BoundDirectivePropertyAst(directiveName, templateName, value, sourceSpan) {
- this.directiveName = directiveName;
- this.templateName = templateName;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- BoundDirectivePropertyAst.prototype.visit = function (visitor, context) {
- return visitor.visitDirectiveProperty(this, context);
- };
- return BoundDirectivePropertyAst;
- }());
- /**
- * A directive declared on an element.
- */
- var DirectiveAst = /** @class */ (function () {
- function DirectiveAst(directive, inputs, hostProperties, hostEvents, contentQueryStartId, sourceSpan) {
- this.directive = directive;
- this.inputs = inputs;
- this.hostProperties = hostProperties;
- this.hostEvents = hostEvents;
- this.contentQueryStartId = contentQueryStartId;
- this.sourceSpan = sourceSpan;
- }
- DirectiveAst.prototype.visit = function (visitor, context) {
- return visitor.visitDirective(this, context);
- };
- return DirectiveAst;
- }());
- /**
- * A provider declared on an element
- */
- var ProviderAst = /** @class */ (function () {
- function ProviderAst(token, multiProvider, eager, providers, providerType, lifecycleHooks, sourceSpan, isModule) {
- this.token = token;
- this.multiProvider = multiProvider;
- this.eager = eager;
- this.providers = providers;
- this.providerType = providerType;
- this.lifecycleHooks = lifecycleHooks;
- this.sourceSpan = sourceSpan;
- this.isModule = isModule;
- }
- ProviderAst.prototype.visit = function (visitor, context) {
- // No visit method in the visitor for now...
- return null;
- };
- return ProviderAst;
- }());
- var ProviderAstType;
- (function (ProviderAstType) {
- ProviderAstType[ProviderAstType["PublicService"] = 0] = "PublicService";
- ProviderAstType[ProviderAstType["PrivateService"] = 1] = "PrivateService";
- ProviderAstType[ProviderAstType["Component"] = 2] = "Component";
- ProviderAstType[ProviderAstType["Directive"] = 3] = "Directive";
- ProviderAstType[ProviderAstType["Builtin"] = 4] = "Builtin";
- })(ProviderAstType || (ProviderAstType = {}));
- /**
- * Position where content is to be projected (instance of `<ng-content>` in a template).
- */
- var NgContentAst = /** @class */ (function () {
- function NgContentAst(index, ngContentIndex, sourceSpan) {
- this.index = index;
- this.ngContentIndex = ngContentIndex;
- this.sourceSpan = sourceSpan;
- }
- NgContentAst.prototype.visit = function (visitor, context) {
- return visitor.visitNgContent(this, context);
- };
- return NgContentAst;
- }());
- /**
- * A visitor that accepts each node but doesn't do anything. It is intended to be used
- * as the base class for a visitor that is only interested in a subset of the node types.
- */
- var NullTemplateVisitor = /** @class */ (function () {
- function NullTemplateVisitor() {
- }
- NullTemplateVisitor.prototype.visitNgContent = function (ast, context) { };
- NullTemplateVisitor.prototype.visitEmbeddedTemplate = function (ast, context) { };
- NullTemplateVisitor.prototype.visitElement = function (ast, context) { };
- NullTemplateVisitor.prototype.visitReference = function (ast, context) { };
- NullTemplateVisitor.prototype.visitVariable = function (ast, context) { };
- NullTemplateVisitor.prototype.visitEvent = function (ast, context) { };
- NullTemplateVisitor.prototype.visitElementProperty = function (ast, context) { };
- NullTemplateVisitor.prototype.visitAttr = function (ast, context) { };
- NullTemplateVisitor.prototype.visitBoundText = function (ast, context) { };
- NullTemplateVisitor.prototype.visitText = function (ast, context) { };
- NullTemplateVisitor.prototype.visitDirective = function (ast, context) { };
- NullTemplateVisitor.prototype.visitDirectiveProperty = function (ast, context) { };
- return NullTemplateVisitor;
- }());
- /**
- * Base class that can be used to build a visitor that visits each node
- * in an template ast recursively.
- */
- var RecursiveTemplateAstVisitor = /** @class */ (function (_super) {
- __extends(RecursiveTemplateAstVisitor, _super);
- function RecursiveTemplateAstVisitor() {
- return _super.call(this) || this;
- }
- // Nodes with children
- RecursiveTemplateAstVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
- return this.visitChildren(context, function (visit) {
- visit(ast.attrs);
- visit(ast.references);
- visit(ast.variables);
- visit(ast.directives);
- visit(ast.providers);
- visit(ast.children);
- });
- };
- RecursiveTemplateAstVisitor.prototype.visitElement = function (ast, context) {
- return this.visitChildren(context, function (visit) {
- visit(ast.attrs);
- visit(ast.inputs);
- visit(ast.outputs);
- visit(ast.references);
- visit(ast.directives);
- visit(ast.providers);
- visit(ast.children);
- });
- };
- RecursiveTemplateAstVisitor.prototype.visitDirective = function (ast, context) {
- return this.visitChildren(context, function (visit) {
- visit(ast.inputs);
- visit(ast.hostProperties);
- visit(ast.hostEvents);
- });
- };
- RecursiveTemplateAstVisitor.prototype.visitChildren = function (context, cb) {
- var results = [];
- var t = this;
- function visit(children) {
- if (children && children.length)
- results.push(templateVisitAll(t, children, context));
- }
- cb(visit);
- return [].concat.apply([], results);
- };
- return RecursiveTemplateAstVisitor;
- }(NullTemplateVisitor));
- /**
- * Visit every node in a list of {@link TemplateAst}s with the given {@link TemplateAstVisitor}.
- */
- function templateVisitAll(visitor, asts, context) {
- if (context === void 0) { context = null; }
- var result = [];
- var visit = visitor.visit ?
- function (ast) { return visitor.visit(ast, context) || ast.visit(visitor, context); } :
- function (ast) { return ast.visit(visitor, context); };
- asts.forEach(function (ast) {
- var astResult = visit(ast);
- if (astResult) {
- result.push(astResult);
- }
- });
- return result;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ProviderError = /** @class */ (function (_super) {
- __extends(ProviderError, _super);
- function ProviderError(message, span) {
- return _super.call(this, span, message) || this;
- }
- return ProviderError;
- }(ParseError));
- var ProviderViewContext = /** @class */ (function () {
- function ProviderViewContext(reflector, component) {
- var _this = this;
- this.reflector = reflector;
- this.component = component;
- this.errors = [];
- this.viewQueries = _getViewQueries(component);
- this.viewProviders = new Map();
- component.viewProviders.forEach(function (provider) {
- if (_this.viewProviders.get(tokenReference(provider.token)) == null) {
- _this.viewProviders.set(tokenReference(provider.token), true);
- }
- });
- }
- return ProviderViewContext;
- }());
- var ProviderElementContext = /** @class */ (function () {
- function ProviderElementContext(viewContext, _parent, _isViewRoot, _directiveAsts, attrs, refs, isTemplate, contentQueryStartId, _sourceSpan) {
- var _this = this;
- this.viewContext = viewContext;
- this._parent = _parent;
- this._isViewRoot = _isViewRoot;
- this._directiveAsts = _directiveAsts;
- this._sourceSpan = _sourceSpan;
- this._transformedProviders = new Map();
- this._seenProviders = new Map();
- this._queriedTokens = new Map();
- this.transformedHasViewContainer = false;
- this._attrs = {};
- attrs.forEach(function (attrAst) { return _this._attrs[attrAst.name] = attrAst.value; });
- var directivesMeta = _directiveAsts.map(function (directiveAst) { return directiveAst.directive; });
- this._allProviders =
- _resolveProvidersFromDirectives(directivesMeta, _sourceSpan, viewContext.errors);
- this._contentQueries = _getContentQueries(contentQueryStartId, directivesMeta);
- Array.from(this._allProviders.values()).forEach(function (provider) {
- _this._addQueryReadsTo(provider.token, provider.token, _this._queriedTokens);
- });
- if (isTemplate) {
- var templateRefId = createTokenForExternalReference(this.viewContext.reflector, Identifiers.TemplateRef);
- this._addQueryReadsTo(templateRefId, templateRefId, this._queriedTokens);
- }
- refs.forEach(function (refAst) {
- var defaultQueryValue = refAst.value ||
- createTokenForExternalReference(_this.viewContext.reflector, Identifiers.ElementRef);
- _this._addQueryReadsTo({ value: refAst.name }, defaultQueryValue, _this._queriedTokens);
- });
- if (this._queriedTokens.get(this.viewContext.reflector.resolveExternalReference(Identifiers.ViewContainerRef))) {
- this.transformedHasViewContainer = true;
- }
- // create the providers that we know are eager first
- Array.from(this._allProviders.values()).forEach(function (provider) {
- var eager = provider.eager || _this._queriedTokens.get(tokenReference(provider.token));
- if (eager) {
- _this._getOrCreateLocalProvider(provider.providerType, provider.token, true);
- }
- });
- }
- ProviderElementContext.prototype.afterElement = function () {
- var _this = this;
- // collect lazy providers
- Array.from(this._allProviders.values()).forEach(function (provider) {
- _this._getOrCreateLocalProvider(provider.providerType, provider.token, false);
- });
- };
- Object.defineProperty(ProviderElementContext.prototype, "transformProviders", {
- get: function () {
- // Note: Maps keep their insertion order.
- var lazyProviders = [];
- var eagerProviders = [];
- this._transformedProviders.forEach(function (provider) {
- if (provider.eager) {
- eagerProviders.push(provider);
- }
- else {
- lazyProviders.push(provider);
- }
- });
- return lazyProviders.concat(eagerProviders);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ProviderElementContext.prototype, "transformedDirectiveAsts", {
- get: function () {
- var sortedProviderTypes = this.transformProviders.map(function (provider) { return provider.token.identifier; });
- var sortedDirectives = this._directiveAsts.slice();
- sortedDirectives.sort(function (dir1, dir2) { return sortedProviderTypes.indexOf(dir1.directive.type) -
- sortedProviderTypes.indexOf(dir2.directive.type); });
- return sortedDirectives;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ProviderElementContext.prototype, "queryMatches", {
- get: function () {
- var allMatches = [];
- this._queriedTokens.forEach(function (matches) { allMatches.push.apply(allMatches, __spread(matches)); });
- return allMatches;
- },
- enumerable: true,
- configurable: true
- });
- ProviderElementContext.prototype._addQueryReadsTo = function (token, defaultValue, queryReadTokens) {
- this._getQueriesFor(token).forEach(function (query) {
- var queryValue = query.meta.read || defaultValue;
- var tokenRef = tokenReference(queryValue);
- var queryMatches = queryReadTokens.get(tokenRef);
- if (!queryMatches) {
- queryMatches = [];
- queryReadTokens.set(tokenRef, queryMatches);
- }
- queryMatches.push({ queryId: query.queryId, value: queryValue });
- });
- };
- ProviderElementContext.prototype._getQueriesFor = function (token) {
- var result = [];
- var currentEl = this;
- var distance = 0;
- var queries;
- while (currentEl !== null) {
- queries = currentEl._contentQueries.get(tokenReference(token));
- if (queries) {
- result.push.apply(result, __spread(queries.filter(function (query) { return query.meta.descendants || distance <= 1; })));
- }
- if (currentEl._directiveAsts.length > 0) {
- distance++;
- }
- currentEl = currentEl._parent;
- }
- queries = this.viewContext.viewQueries.get(tokenReference(token));
- if (queries) {
- result.push.apply(result, __spread(queries));
- }
- return result;
- };
- ProviderElementContext.prototype._getOrCreateLocalProvider = function (requestingProviderType, token, eager) {
- var _this = this;
- var resolvedProvider = this._allProviders.get(tokenReference(token));
- if (!resolvedProvider || ((requestingProviderType === ProviderAstType.Directive ||
- requestingProviderType === ProviderAstType.PublicService) &&
- resolvedProvider.providerType === ProviderAstType.PrivateService) ||
- ((requestingProviderType === ProviderAstType.PrivateService ||
- requestingProviderType === ProviderAstType.PublicService) &&
- resolvedProvider.providerType === ProviderAstType.Builtin)) {
- return null;
- }
- var transformedProviderAst = this._transformedProviders.get(tokenReference(token));
- if (transformedProviderAst) {
- return transformedProviderAst;
- }
- if (this._seenProviders.get(tokenReference(token)) != null) {
- this.viewContext.errors.push(new ProviderError("Cannot instantiate cyclic dependency! " + tokenName(token), this._sourceSpan));
- return null;
- }
- this._seenProviders.set(tokenReference(token), true);
- var transformedProviders = resolvedProvider.providers.map(function (provider) {
- var transformedUseValue = provider.useValue;
- var transformedUseExisting = provider.useExisting;
- var transformedDeps = undefined;
- if (provider.useExisting != null) {
- var existingDiDep = _this._getDependency(resolvedProvider.providerType, { token: provider.useExisting }, eager);
- if (existingDiDep.token != null) {
- transformedUseExisting = existingDiDep.token;
- }
- else {
- transformedUseExisting = null;
- transformedUseValue = existingDiDep.value;
- }
- }
- else if (provider.useFactory) {
- var deps = provider.deps || provider.useFactory.diDeps;
- transformedDeps =
- deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep, eager); });
- }
- else if (provider.useClass) {
- var deps = provider.deps || provider.useClass.diDeps;
- transformedDeps =
- deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep, eager); });
- }
- return _transformProvider(provider, {
- useExisting: transformedUseExisting,
- useValue: transformedUseValue,
- deps: transformedDeps
- });
- });
- transformedProviderAst =
- _transformProviderAst(resolvedProvider, { eager: eager, providers: transformedProviders });
- this._transformedProviders.set(tokenReference(token), transformedProviderAst);
- return transformedProviderAst;
- };
- ProviderElementContext.prototype._getLocalDependency = function (requestingProviderType, dep, eager) {
- if (eager === void 0) { eager = false; }
- if (dep.isAttribute) {
- var attrValue = this._attrs[dep.token.value];
- return { isValue: true, value: attrValue == null ? null : attrValue };
- }
- if (dep.token != null) {
- // access builtints
- if ((requestingProviderType === ProviderAstType.Directive ||
- requestingProviderType === ProviderAstType.Component)) {
- if (tokenReference(dep.token) ===
- this.viewContext.reflector.resolveExternalReference(Identifiers.Renderer) ||
- tokenReference(dep.token) ===
- this.viewContext.reflector.resolveExternalReference(Identifiers.ElementRef) ||
- tokenReference(dep.token) ===
- this.viewContext.reflector.resolveExternalReference(Identifiers.ChangeDetectorRef) ||
- tokenReference(dep.token) ===
- this.viewContext.reflector.resolveExternalReference(Identifiers.TemplateRef)) {
- return dep;
- }
- if (tokenReference(dep.token) ===
- this.viewContext.reflector.resolveExternalReference(Identifiers.ViewContainerRef)) {
- this.transformedHasViewContainer = true;
- }
- }
- // access the injector
- if (tokenReference(dep.token) ===
- this.viewContext.reflector.resolveExternalReference(Identifiers.Injector)) {
- return dep;
- }
- // access providers
- if (this._getOrCreateLocalProvider(requestingProviderType, dep.token, eager) != null) {
- return dep;
- }
- }
- return null;
- };
- ProviderElementContext.prototype._getDependency = function (requestingProviderType, dep, eager) {
- if (eager === void 0) { eager = false; }
- var currElement = this;
- var currEager = eager;
- var result = null;
- if (!dep.isSkipSelf) {
- result = this._getLocalDependency(requestingProviderType, dep, eager);
- }
- if (dep.isSelf) {
- if (!result && dep.isOptional) {
- result = { isValue: true, value: null };
- }
- }
- else {
- // check parent elements
- while (!result && currElement._parent) {
- var prevElement = currElement;
- currElement = currElement._parent;
- if (prevElement._isViewRoot) {
- currEager = false;
- }
- result = currElement._getLocalDependency(ProviderAstType.PublicService, dep, currEager);
- }
- // check @Host restriction
- if (!result) {
- if (!dep.isHost || this.viewContext.component.isHost ||
- this.viewContext.component.type.reference === tokenReference(dep.token) ||
- this.viewContext.viewProviders.get(tokenReference(dep.token)) != null) {
- result = dep;
- }
- else {
- result = dep.isOptional ? { isValue: true, value: null } : null;
- }
- }
- }
- if (!result) {
- this.viewContext.errors.push(new ProviderError("No provider for " + tokenName(dep.token), this._sourceSpan));
- }
- return result;
- };
- return ProviderElementContext;
- }());
- function _transformProvider(provider, _a) {
- var useExisting = _a.useExisting, useValue = _a.useValue, deps = _a.deps;
- return {
- token: provider.token,
- useClass: provider.useClass,
- useExisting: useExisting,
- useFactory: provider.useFactory,
- useValue: useValue,
- deps: deps,
- multi: provider.multi
- };
- }
- function _transformProviderAst(provider, _a) {
- var eager = _a.eager, providers = _a.providers;
- return new ProviderAst(provider.token, provider.multiProvider, provider.eager || eager, providers, provider.providerType, provider.lifecycleHooks, provider.sourceSpan, provider.isModule);
- }
- function _resolveProvidersFromDirectives(directives, sourceSpan, targetErrors) {
- var providersByToken = new Map();
- directives.forEach(function (directive) {
- var dirProvider = { token: { identifier: directive.type }, useClass: directive.type };
- _resolveProviders([dirProvider], directive.isComponent ? ProviderAstType.Component : ProviderAstType.Directive, true, sourceSpan, targetErrors, providersByToken, /* isModule */ false);
- });
- // Note: directives need to be able to overwrite providers of a component!
- var directivesWithComponentFirst = directives.filter(function (dir) { return dir.isComponent; }).concat(directives.filter(function (dir) { return !dir.isComponent; }));
- directivesWithComponentFirst.forEach(function (directive) {
- _resolveProviders(directive.providers, ProviderAstType.PublicService, false, sourceSpan, targetErrors, providersByToken, /* isModule */ false);
- _resolveProviders(directive.viewProviders, ProviderAstType.PrivateService, false, sourceSpan, targetErrors, providersByToken, /* isModule */ false);
- });
- return providersByToken;
- }
- function _resolveProviders(providers, providerType, eager, sourceSpan, targetErrors, targetProvidersByToken, isModule) {
- providers.forEach(function (provider) {
- var resolvedProvider = targetProvidersByToken.get(tokenReference(provider.token));
- if (resolvedProvider != null && !!resolvedProvider.multiProvider !== !!provider.multi) {
- targetErrors.push(new ProviderError("Mixing multi and non multi provider is not possible for token " + tokenName(resolvedProvider.token), sourceSpan));
- }
- if (!resolvedProvider) {
- var lifecycleHooks = provider.token.identifier &&
- provider.token.identifier.lifecycleHooks ?
- provider.token.identifier.lifecycleHooks :
- [];
- var isUseValue = !(provider.useClass || provider.useExisting || provider.useFactory);
- resolvedProvider = new ProviderAst(provider.token, !!provider.multi, eager || isUseValue, [provider], providerType, lifecycleHooks, sourceSpan, isModule);
- targetProvidersByToken.set(tokenReference(provider.token), resolvedProvider);
- }
- else {
- if (!provider.multi) {
- resolvedProvider.providers.length = 0;
- }
- resolvedProvider.providers.push(provider);
- }
- });
- }
- function _getViewQueries(component) {
- // Note: queries start with id 1 so we can use the number in a Bloom filter!
- var viewQueryId = 1;
- var viewQueries = new Map();
- if (component.viewQueries) {
- component.viewQueries.forEach(function (query) { return _addQueryToTokenMap(viewQueries, { meta: query, queryId: viewQueryId++ }); });
- }
- return viewQueries;
- }
- function _getContentQueries(contentQueryStartId, directives) {
- var contentQueryId = contentQueryStartId;
- var contentQueries = new Map();
- directives.forEach(function (directive, directiveIndex) {
- if (directive.queries) {
- directive.queries.forEach(function (query) { return _addQueryToTokenMap(contentQueries, { meta: query, queryId: contentQueryId++ }); });
- }
- });
- return contentQueries;
- }
- function _addQueryToTokenMap(map, query) {
- query.meta.selectors.forEach(function (token) {
- var entry = map.get(tokenReference(token));
- if (!entry) {
- entry = [];
- map.set(tokenReference(token), entry);
- }
- entry.push(query);
- });
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var StyleWithImports = /** @class */ (function () {
- function StyleWithImports(style, styleUrls) {
- this.style = style;
- this.styleUrls = styleUrls;
- }
- return StyleWithImports;
- }());
- function isStyleUrlResolvable(url) {
- if (url == null || url.length === 0 || url[0] == '/')
- return false;
- var schemeMatch = url.match(URL_WITH_SCHEMA_REGEXP);
- return schemeMatch === null || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';
- }
- /**
- * Rewrites stylesheets by resolving and removing the @import urls that
- * are either relative or don't have a `package:` scheme
- */
- function extractStyleUrls(resolver, baseUrl, cssText) {
- var foundUrls = [];
- var modifiedCssText = cssText.replace(CSS_STRIPPABLE_COMMENT_REGEXP, '')
- .replace(CSS_IMPORT_REGEXP, function () {
- var m = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- m[_i] = arguments[_i];
- }
- var url = m[1] || m[2];
- if (!isStyleUrlResolvable(url)) {
- // Do not attempt to resolve non-package absolute URLs with URI
- // scheme
- return m[0];
- }
- foundUrls.push(resolver.resolve(baseUrl, url));
- return '';
- });
- return new StyleWithImports(modifiedCssText, foundUrls);
- }
- var CSS_IMPORT_REGEXP = /@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g;
- var CSS_STRIPPABLE_COMMENT_REGEXP = /\/\*(?!#\s*(?:sourceURL|sourceMappingURL)=)[\s\S]+?\*\//g;
- var URL_WITH_SCHEMA_REGEXP = /^([^:/?#]+):/;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var PROPERTY_PARTS_SEPARATOR = '.';
- var ATTRIBUTE_PREFIX = 'attr';
- var CLASS_PREFIX = 'class';
- var STYLE_PREFIX = 'style';
- var ANIMATE_PROP_PREFIX = 'animate-';
- /**
- * Parses bindings in templates and in the directive host area.
- */
- var BindingParser = /** @class */ (function () {
- function BindingParser(_exprParser, _interpolationConfig, _schemaRegistry, pipes, errors) {
- this._exprParser = _exprParser;
- this._interpolationConfig = _interpolationConfig;
- this._schemaRegistry = _schemaRegistry;
- this.errors = errors;
- this.pipesByName = null;
- this._usedPipes = new Map();
- // When the `pipes` parameter is `null`, do not check for used pipes
- // This is used in IVY when we might not know the available pipes at compile time
- if (pipes) {
- var pipesByName_1 = new Map();
- pipes.forEach(function (pipe) { return pipesByName_1.set(pipe.name, pipe); });
- this.pipesByName = pipesByName_1;
- }
- }
- Object.defineProperty(BindingParser.prototype, "interpolationConfig", {
- get: function () { return this._interpolationConfig; },
- enumerable: true,
- configurable: true
- });
- BindingParser.prototype.getUsedPipes = function () { return Array.from(this._usedPipes.values()); };
- BindingParser.prototype.createBoundHostProperties = function (dirMeta, sourceSpan) {
- var _this = this;
- if (dirMeta.hostProperties) {
- var boundProps_1 = [];
- Object.keys(dirMeta.hostProperties).forEach(function (propName) {
- var expression = dirMeta.hostProperties[propName];
- if (typeof expression === 'string') {
- _this.parsePropertyBinding(propName, expression, true, sourceSpan, [], boundProps_1);
- }
- else {
- _this._reportError("Value of the host property binding \"" + propName + "\" needs to be a string representing an expression but got \"" + expression + "\" (" + typeof expression + ")", sourceSpan);
- }
- });
- return boundProps_1;
- }
- return null;
- };
- BindingParser.prototype.createDirectiveHostPropertyAsts = function (dirMeta, elementSelector, sourceSpan) {
- var _this = this;
- var boundProps = this.createBoundHostProperties(dirMeta, sourceSpan);
- return boundProps &&
- boundProps.map(function (prop) { return _this.createBoundElementProperty(elementSelector, prop); });
- };
- BindingParser.prototype.createDirectiveHostEventAsts = function (dirMeta, sourceSpan) {
- var _this = this;
- if (dirMeta.hostListeners) {
- var targetEvents_1 = [];
- Object.keys(dirMeta.hostListeners).forEach(function (propName) {
- var expression = dirMeta.hostListeners[propName];
- if (typeof expression === 'string') {
- // TODO: pass a more accurate handlerSpan for this event.
- _this.parseEvent(propName, expression, sourceSpan, sourceSpan, [], targetEvents_1);
- }
- else {
- _this._reportError("Value of the host listener \"" + propName + "\" needs to be a string representing an expression but got \"" + expression + "\" (" + typeof expression + ")", sourceSpan);
- }
- });
- return targetEvents_1;
- }
- return null;
- };
- BindingParser.prototype.parseInterpolation = function (value, sourceSpan) {
- var sourceInfo = sourceSpan.start.toString();
- try {
- var ast = this._exprParser.parseInterpolation(value, sourceInfo, this._interpolationConfig);
- if (ast)
- this._reportExpressionParserErrors(ast.errors, sourceSpan);
- this._checkPipes(ast, sourceSpan);
- return ast;
- }
- catch (e) {
- this._reportError("" + e, sourceSpan);
- return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
- }
- };
- // Parse an inline template binding. ie `<tag *tplKey="<tplValue>">`
- BindingParser.prototype.parseInlineTemplateBinding = function (tplKey, tplValue, sourceSpan, targetMatchableAttrs, targetProps, targetVars) {
- var bindings = this._parseTemplateBindings(tplKey, tplValue, sourceSpan);
- for (var i = 0; i < bindings.length; i++) {
- var binding = bindings[i];
- if (binding.keyIsVar) {
- targetVars.push(new ParsedVariable(binding.key, binding.name, sourceSpan));
- }
- else if (binding.expression) {
- this._parsePropertyAst(binding.key, binding.expression, sourceSpan, targetMatchableAttrs, targetProps);
- }
- else {
- targetMatchableAttrs.push([binding.key, '']);
- this.parseLiteralAttr(binding.key, null, sourceSpan, targetMatchableAttrs, targetProps);
- }
- }
- };
- BindingParser.prototype._parseTemplateBindings = function (tplKey, tplValue, sourceSpan) {
- var _this = this;
- var sourceInfo = sourceSpan.start.toString();
- try {
- var bindingsResult = this._exprParser.parseTemplateBindings(tplKey, tplValue, sourceInfo);
- this._reportExpressionParserErrors(bindingsResult.errors, sourceSpan);
- bindingsResult.templateBindings.forEach(function (binding) {
- if (binding.expression) {
- _this._checkPipes(binding.expression, sourceSpan);
- }
- });
- bindingsResult.warnings.forEach(function (warning) { _this._reportError(warning, sourceSpan, ParseErrorLevel.WARNING); });
- return bindingsResult.templateBindings;
- }
- catch (e) {
- this._reportError("" + e, sourceSpan);
- return [];
- }
- };
- BindingParser.prototype.parseLiteralAttr = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {
- if (isAnimationLabel(name)) {
- name = name.substring(1);
- if (value) {
- this._reportError("Assigning animation triggers via @prop=\"exp\" attributes with an expression is invalid." +
- " Use property bindings (e.g. [@prop]=\"exp\") or use an attribute without a value (e.g. @prop) instead.", sourceSpan, ParseErrorLevel.ERROR);
- }
- this._parseAnimation(name, value, sourceSpan, targetMatchableAttrs, targetProps);
- }
- else {
- targetProps.push(new ParsedProperty(name, this._exprParser.wrapLiteralPrimitive(value, ''), ParsedPropertyType.LITERAL_ATTR, sourceSpan));
- }
- };
- BindingParser.prototype.parsePropertyBinding = function (name, expression, isHost, sourceSpan, targetMatchableAttrs, targetProps) {
- var isAnimationProp = false;
- if (name.startsWith(ANIMATE_PROP_PREFIX)) {
- isAnimationProp = true;
- name = name.substring(ANIMATE_PROP_PREFIX.length);
- }
- else if (isAnimationLabel(name)) {
- isAnimationProp = true;
- name = name.substring(1);
- }
- if (isAnimationProp) {
- this._parseAnimation(name, expression, sourceSpan, targetMatchableAttrs, targetProps);
- }
- else {
- this._parsePropertyAst(name, this._parseBinding(expression, isHost, sourceSpan), sourceSpan, targetMatchableAttrs, targetProps);
- }
- };
- BindingParser.prototype.parsePropertyInterpolation = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {
- var expr = this.parseInterpolation(value, sourceSpan);
- if (expr) {
- this._parsePropertyAst(name, expr, sourceSpan, targetMatchableAttrs, targetProps);
- return true;
- }
- return false;
- };
- BindingParser.prototype._parsePropertyAst = function (name, ast, sourceSpan, targetMatchableAttrs, targetProps) {
- targetMatchableAttrs.push([name, ast.source]);
- targetProps.push(new ParsedProperty(name, ast, ParsedPropertyType.DEFAULT, sourceSpan));
- };
- BindingParser.prototype._parseAnimation = function (name, expression, sourceSpan, targetMatchableAttrs, targetProps) {
- // This will occur when a @trigger is not paired with an expression.
- // For animations it is valid to not have an expression since */void
- // states will be applied by angular when the element is attached/detached
- var ast = this._parseBinding(expression || 'undefined', false, sourceSpan);
- targetMatchableAttrs.push([name, ast.source]);
- targetProps.push(new ParsedProperty(name, ast, ParsedPropertyType.ANIMATION, sourceSpan));
- };
- BindingParser.prototype._parseBinding = function (value, isHostBinding, sourceSpan) {
- var sourceInfo = (sourceSpan && sourceSpan.start || '(unknown)').toString();
- try {
- var ast = isHostBinding ?
- this._exprParser.parseSimpleBinding(value, sourceInfo, this._interpolationConfig) :
- this._exprParser.parseBinding(value, sourceInfo, this._interpolationConfig);
- if (ast)
- this._reportExpressionParserErrors(ast.errors, sourceSpan);
- this._checkPipes(ast, sourceSpan);
- return ast;
- }
- catch (e) {
- this._reportError("" + e, sourceSpan);
- return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
- }
- };
- BindingParser.prototype.createBoundElementProperty = function (elementSelector, boundProp, skipValidation, mapPropertyName) {
- if (skipValidation === void 0) { skipValidation = false; }
- if (mapPropertyName === void 0) { mapPropertyName = true; }
- if (boundProp.isAnimation) {
- return new BoundElementProperty(boundProp.name, 4 /* Animation */, SecurityContext.NONE, boundProp.expression, null, boundProp.sourceSpan);
- }
- var unit = null;
- var bindingType = undefined;
- var boundPropertyName = null;
- var parts = boundProp.name.split(PROPERTY_PARTS_SEPARATOR);
- var securityContexts = undefined;
- // Check for special cases (prefix style, attr, class)
- if (parts.length > 1) {
- if (parts[0] == ATTRIBUTE_PREFIX) {
- boundPropertyName = parts[1];
- if (!skipValidation) {
- this._validatePropertyOrAttributeName(boundPropertyName, boundProp.sourceSpan, true);
- }
- securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, boundPropertyName, true);
- var nsSeparatorIdx = boundPropertyName.indexOf(':');
- if (nsSeparatorIdx > -1) {
- var ns = boundPropertyName.substring(0, nsSeparatorIdx);
- var name_1 = boundPropertyName.substring(nsSeparatorIdx + 1);
- boundPropertyName = mergeNsAndName(ns, name_1);
- }
- bindingType = 1 /* Attribute */;
- }
- else if (parts[0] == CLASS_PREFIX) {
- boundPropertyName = parts[1];
- bindingType = 2 /* Class */;
- securityContexts = [SecurityContext.NONE];
- }
- else if (parts[0] == STYLE_PREFIX) {
- unit = parts.length > 2 ? parts[2] : null;
- boundPropertyName = parts[1];
- bindingType = 3 /* Style */;
- securityContexts = [SecurityContext.STYLE];
- }
- }
- // If not a special case, use the full property name
- if (boundPropertyName === null) {
- var mappedPropName = this._schemaRegistry.getMappedPropName(boundProp.name);
- boundPropertyName = mapPropertyName ? mappedPropName : boundProp.name;
- securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, mappedPropName, false);
- bindingType = 0 /* Property */;
- if (!skipValidation) {
- this._validatePropertyOrAttributeName(mappedPropName, boundProp.sourceSpan, false);
- }
- }
- return new BoundElementProperty(boundPropertyName, bindingType, securityContexts[0], boundProp.expression, unit, boundProp.sourceSpan);
- };
- BindingParser.prototype.parseEvent = function (name, expression, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents) {
- if (isAnimationLabel(name)) {
- name = name.substr(1);
- this._parseAnimationEvent(name, expression, sourceSpan, handlerSpan, targetEvents);
- }
- else {
- this._parseRegularEvent(name, expression, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents);
- }
- };
- BindingParser.prototype.calcPossibleSecurityContexts = function (selector, propName, isAttribute) {
- var prop = this._schemaRegistry.getMappedPropName(propName);
- return calcPossibleSecurityContexts(this._schemaRegistry, selector, prop, isAttribute);
- };
- BindingParser.prototype._parseAnimationEvent = function (name, expression, sourceSpan, handlerSpan, targetEvents) {
- var matches = splitAtPeriod(name, [name, '']);
- var eventName = matches[0];
- var phase = matches[1].toLowerCase();
- if (phase) {
- switch (phase) {
- case 'start':
- case 'done':
- var ast = this._parseAction(expression, handlerSpan);
- targetEvents.push(new ParsedEvent(eventName, phase, 1 /* Animation */, ast, sourceSpan, handlerSpan));
- break;
- default:
- this._reportError("The provided animation output phase value \"" + phase + "\" for \"@" + eventName + "\" is not supported (use start or done)", sourceSpan);
- break;
- }
- }
- else {
- this._reportError("The animation trigger output event (@" + eventName + ") is missing its phase value name (start or done are currently supported)", sourceSpan);
- }
- };
- BindingParser.prototype._parseRegularEvent = function (name, expression, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents) {
- // long format: 'target: eventName'
- var _a = __read(splitAtColon(name, [null, name]), 2), target = _a[0], eventName = _a[1];
- var ast = this._parseAction(expression, handlerSpan);
- targetMatchableAttrs.push([name, ast.source]);
- targetEvents.push(new ParsedEvent(eventName, target, 0 /* Regular */, ast, sourceSpan, handlerSpan));
- // Don't detect directives for event names for now,
- // so don't add the event name to the matchableAttrs
- };
- BindingParser.prototype._parseAction = function (value, sourceSpan) {
- var sourceInfo = (sourceSpan && sourceSpan.start || '(unknown').toString();
- try {
- var ast = this._exprParser.parseAction(value, sourceInfo, this._interpolationConfig);
- if (ast) {
- this._reportExpressionParserErrors(ast.errors, sourceSpan);
- }
- if (!ast || ast.ast instanceof EmptyExpr) {
- this._reportError("Empty expressions are not allowed", sourceSpan);
- return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
- }
- this._checkPipes(ast, sourceSpan);
- return ast;
- }
- catch (e) {
- this._reportError("" + e, sourceSpan);
- return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
- }
- };
- BindingParser.prototype._reportError = function (message, sourceSpan, level) {
- if (level === void 0) { level = ParseErrorLevel.ERROR; }
- this.errors.push(new ParseError(sourceSpan, message, level));
- };
- BindingParser.prototype._reportExpressionParserErrors = function (errors, sourceSpan) {
- var e_1, _a;
- try {
- for (var errors_1 = __values(errors), errors_1_1 = errors_1.next(); !errors_1_1.done; errors_1_1 = errors_1.next()) {
- var error = errors_1_1.value;
- this._reportError(error.message, sourceSpan);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (errors_1_1 && !errors_1_1.done && (_a = errors_1.return)) _a.call(errors_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- };
- // Make sure all the used pipes are known in `this.pipesByName`
- BindingParser.prototype._checkPipes = function (ast, sourceSpan) {
- var _this = this;
- if (ast && this.pipesByName) {
- var collector = new PipeCollector();
- ast.visit(collector);
- collector.pipes.forEach(function (ast, pipeName) {
- var pipeMeta = _this.pipesByName.get(pipeName);
- if (!pipeMeta) {
- _this._reportError("The pipe '" + pipeName + "' could not be found", new ParseSourceSpan(sourceSpan.start.moveBy(ast.span.start), sourceSpan.start.moveBy(ast.span.end)));
- }
- else {
- _this._usedPipes.set(pipeName, pipeMeta);
- }
- });
- }
- };
- /**
- * @param propName the name of the property / attribute
- * @param sourceSpan
- * @param isAttr true when binding to an attribute
- */
- BindingParser.prototype._validatePropertyOrAttributeName = function (propName, sourceSpan, isAttr) {
- var report = isAttr ? this._schemaRegistry.validateAttribute(propName) :
- this._schemaRegistry.validateProperty(propName);
- if (report.error) {
- this._reportError(report.msg, sourceSpan, ParseErrorLevel.ERROR);
- }
- };
- return BindingParser;
- }());
- var PipeCollector = /** @class */ (function (_super) {
- __extends(PipeCollector, _super);
- function PipeCollector() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.pipes = new Map();
- return _this;
- }
- PipeCollector.prototype.visitPipe = function (ast, context) {
- this.pipes.set(ast.name, ast);
- ast.exp.visit(this);
- this.visitAll(ast.args, context);
- return null;
- };
- return PipeCollector;
- }(RecursiveAstVisitor$1));
- function isAnimationLabel(name) {
- return name[0] == '@';
- }
- function calcPossibleSecurityContexts(registry, selector, propName, isAttribute) {
- var ctxs = [];
- CssSelector.parse(selector).forEach(function (selector) {
- var elementNames = selector.element ? [selector.element] : registry.allKnownElementNames();
- var notElementNames = new Set(selector.notSelectors.filter(function (selector) { return selector.isElementSelector(); })
- .map(function (selector) { return selector.element; }));
- var possibleElementNames = elementNames.filter(function (elementName) { return !notElementNames.has(elementName); });
- ctxs.push.apply(ctxs, __spread(possibleElementNames.map(function (elementName) { return registry.securityContext(elementName, propName, isAttribute); })));
- });
- return ctxs.length === 0 ? [SecurityContext.NONE] : Array.from(new Set(ctxs)).sort();
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var NG_CONTENT_SELECT_ATTR = 'select';
- var LINK_ELEMENT = 'link';
- var LINK_STYLE_REL_ATTR = 'rel';
- var LINK_STYLE_HREF_ATTR = 'href';
- var LINK_STYLE_REL_VALUE = 'stylesheet';
- var STYLE_ELEMENT = 'style';
- var SCRIPT_ELEMENT = 'script';
- var NG_NON_BINDABLE_ATTR = 'ngNonBindable';
- var NG_PROJECT_AS = 'ngProjectAs';
- function preparseElement(ast) {
- var selectAttr = null;
- var hrefAttr = null;
- var relAttr = null;
- var nonBindable = false;
- var projectAs = '';
- ast.attrs.forEach(function (attr) {
- var lcAttrName = attr.name.toLowerCase();
- if (lcAttrName == NG_CONTENT_SELECT_ATTR) {
- selectAttr = attr.value;
- }
- else if (lcAttrName == LINK_STYLE_HREF_ATTR) {
- hrefAttr = attr.value;
- }
- else if (lcAttrName == LINK_STYLE_REL_ATTR) {
- relAttr = attr.value;
- }
- else if (attr.name == NG_NON_BINDABLE_ATTR) {
- nonBindable = true;
- }
- else if (attr.name == NG_PROJECT_AS) {
- if (attr.value.length > 0) {
- projectAs = attr.value;
- }
- }
- });
- selectAttr = normalizeNgContentSelect(selectAttr);
- var nodeName = ast.name.toLowerCase();
- var type = PreparsedElementType.OTHER;
- if (isNgContent(nodeName)) {
- type = PreparsedElementType.NG_CONTENT;
- }
- else if (nodeName == STYLE_ELEMENT) {
- type = PreparsedElementType.STYLE;
- }
- else if (nodeName == SCRIPT_ELEMENT) {
- type = PreparsedElementType.SCRIPT;
- }
- else if (nodeName == LINK_ELEMENT && relAttr == LINK_STYLE_REL_VALUE) {
- type = PreparsedElementType.STYLESHEET;
- }
- return new PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs);
- }
- var PreparsedElementType;
- (function (PreparsedElementType) {
- PreparsedElementType[PreparsedElementType["NG_CONTENT"] = 0] = "NG_CONTENT";
- PreparsedElementType[PreparsedElementType["STYLE"] = 1] = "STYLE";
- PreparsedElementType[PreparsedElementType["STYLESHEET"] = 2] = "STYLESHEET";
- PreparsedElementType[PreparsedElementType["SCRIPT"] = 3] = "SCRIPT";
- PreparsedElementType[PreparsedElementType["OTHER"] = 4] = "OTHER";
- })(PreparsedElementType || (PreparsedElementType = {}));
- var PreparsedElement = /** @class */ (function () {
- function PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs) {
- this.type = type;
- this.selectAttr = selectAttr;
- this.hrefAttr = hrefAttr;
- this.nonBindable = nonBindable;
- this.projectAs = projectAs;
- }
- return PreparsedElement;
- }());
- function normalizeNgContentSelect(selectAttr) {
- if (selectAttr === null || selectAttr.length === 0) {
- return '*';
- }
- return selectAttr;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var BIND_NAME_REGEXP = /^(?:(?:(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/;
- // Group 1 = "bind-"
- var KW_BIND_IDX = 1;
- // Group 2 = "let-"
- var KW_LET_IDX = 2;
- // Group 3 = "ref-/#"
- var KW_REF_IDX = 3;
- // Group 4 = "on-"
- var KW_ON_IDX = 4;
- // Group 5 = "bindon-"
- var KW_BINDON_IDX = 5;
- // Group 6 = "@"
- var KW_AT_IDX = 6;
- // Group 7 = the identifier after "bind-", "let-", "ref-/#", "on-", "bindon-" or "@"
- var IDENT_KW_IDX = 7;
- // Group 8 = identifier inside [()]
- var IDENT_BANANA_BOX_IDX = 8;
- // Group 9 = identifier inside []
- var IDENT_PROPERTY_IDX = 9;
- // Group 10 = identifier inside ()
- var IDENT_EVENT_IDX = 10;
- var TEMPLATE_ATTR_PREFIX = '*';
- var CLASS_ATTR = 'class';
- var _TEXT_CSS_SELECTOR;
- function TEXT_CSS_SELECTOR() {
- if (!_TEXT_CSS_SELECTOR) {
- _TEXT_CSS_SELECTOR = CssSelector.parse('*')[0];
- }
- return _TEXT_CSS_SELECTOR;
- }
- var TemplateParseError = /** @class */ (function (_super) {
- __extends(TemplateParseError, _super);
- function TemplateParseError(message, span, level) {
- return _super.call(this, span, message, level) || this;
- }
- return TemplateParseError;
- }(ParseError));
- var TemplateParseResult = /** @class */ (function () {
- function TemplateParseResult(templateAst, usedPipes, errors) {
- this.templateAst = templateAst;
- this.usedPipes = usedPipes;
- this.errors = errors;
- }
- return TemplateParseResult;
- }());
- var TemplateParser = /** @class */ (function () {
- function TemplateParser(_config, _reflector, _exprParser, _schemaRegistry, _htmlParser, _console, transforms) {
- this._config = _config;
- this._reflector = _reflector;
- this._exprParser = _exprParser;
- this._schemaRegistry = _schemaRegistry;
- this._htmlParser = _htmlParser;
- this._console = _console;
- this.transforms = transforms;
- }
- Object.defineProperty(TemplateParser.prototype, "expressionParser", {
- get: function () { return this._exprParser; },
- enumerable: true,
- configurable: true
- });
- TemplateParser.prototype.parse = function (component, template, directives, pipes, schemas, templateUrl, preserveWhitespaces) {
- var result = this.tryParse(component, template, directives, pipes, schemas, templateUrl, preserveWhitespaces);
- var warnings = result.errors.filter(function (error) { return error.level === ParseErrorLevel.WARNING; });
- var errors = result.errors.filter(function (error) { return error.level === ParseErrorLevel.ERROR; });
- if (warnings.length > 0) {
- this._console.warn("Template parse warnings:\n" + warnings.join('\n'));
- }
- if (errors.length > 0) {
- var errorString = errors.join('\n');
- throw syntaxError("Template parse errors:\n" + errorString, errors);
- }
- return { template: result.templateAst, pipes: result.usedPipes };
- };
- TemplateParser.prototype.tryParse = function (component, template, directives, pipes, schemas, templateUrl, preserveWhitespaces) {
- var htmlParseResult = typeof template === 'string' ?
- this._htmlParser.parse(template, templateUrl, {
- tokenizeExpansionForms: true,
- interpolationConfig: this.getInterpolationConfig(component)
- }) :
- template;
- if (!preserveWhitespaces) {
- htmlParseResult = removeWhitespaces(htmlParseResult);
- }
- return this.tryParseHtml(this.expandHtml(htmlParseResult), component, directives, pipes, schemas);
- };
- TemplateParser.prototype.tryParseHtml = function (htmlAstWithErrors, component, directives, pipes, schemas) {
- var result;
- var errors = htmlAstWithErrors.errors;
- var usedPipes = [];
- if (htmlAstWithErrors.rootNodes.length > 0) {
- var uniqDirectives = removeSummaryDuplicates(directives);
- var uniqPipes = removeSummaryDuplicates(pipes);
- var providerViewContext = new ProviderViewContext(this._reflector, component);
- var interpolationConfig = undefined;
- if (component.template && component.template.interpolation) {
- interpolationConfig = {
- start: component.template.interpolation[0],
- end: component.template.interpolation[1]
- };
- }
- var bindingParser = new BindingParser(this._exprParser, interpolationConfig, this._schemaRegistry, uniqPipes, errors);
- var parseVisitor = new TemplateParseVisitor(this._reflector, this._config, providerViewContext, uniqDirectives, bindingParser, this._schemaRegistry, schemas, errors);
- result = visitAll$1(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_ELEMENT_CONTEXT);
- errors.push.apply(errors, __spread(providerViewContext.errors));
- usedPipes.push.apply(usedPipes, __spread(bindingParser.getUsedPipes()));
- }
- else {
- result = [];
- }
- this._assertNoReferenceDuplicationOnTemplate(result, errors);
- if (errors.length > 0) {
- return new TemplateParseResult(result, usedPipes, errors);
- }
- if (this.transforms) {
- this.transforms.forEach(function (transform) { result = templateVisitAll(transform, result); });
- }
- return new TemplateParseResult(result, usedPipes, errors);
- };
- TemplateParser.prototype.expandHtml = function (htmlAstWithErrors, forced) {
- if (forced === void 0) { forced = false; }
- var errors = htmlAstWithErrors.errors;
- if (errors.length == 0 || forced) {
- // Transform ICU messages to angular directives
- var expandedHtmlAst = expandNodes(htmlAstWithErrors.rootNodes);
- errors.push.apply(errors, __spread(expandedHtmlAst.errors));
- htmlAstWithErrors = new ParseTreeResult(expandedHtmlAst.nodes, errors);
- }
- return htmlAstWithErrors;
- };
- TemplateParser.prototype.getInterpolationConfig = function (component) {
- if (component.template) {
- return InterpolationConfig.fromArray(component.template.interpolation);
- }
- return undefined;
- };
- /** @internal */
- TemplateParser.prototype._assertNoReferenceDuplicationOnTemplate = function (result, errors) {
- var existingReferences = [];
- result.filter(function (element) { return !!element.references; })
- .forEach(function (element) { return element.references.forEach(function (reference) {
- var name = reference.name;
- if (existingReferences.indexOf(name) < 0) {
- existingReferences.push(name);
- }
- else {
- var error = new TemplateParseError("Reference \"#" + name + "\" is defined several times", reference.sourceSpan, ParseErrorLevel.ERROR);
- errors.push(error);
- }
- }); });
- };
- return TemplateParser;
- }());
- var TemplateParseVisitor = /** @class */ (function () {
- function TemplateParseVisitor(reflector, config, providerViewContext, directives, _bindingParser, _schemaRegistry, _schemas, _targetErrors) {
- var _this = this;
- this.reflector = reflector;
- this.config = config;
- this.providerViewContext = providerViewContext;
- this._bindingParser = _bindingParser;
- this._schemaRegistry = _schemaRegistry;
- this._schemas = _schemas;
- this._targetErrors = _targetErrors;
- this.selectorMatcher = new SelectorMatcher();
- this.directivesIndex = new Map();
- this.ngContentCount = 0;
- // Note: queries start with id 1 so we can use the number in a Bloom filter!
- this.contentQueryStartId = providerViewContext.component.viewQueries.length + 1;
- directives.forEach(function (directive, index) {
- var selector = CssSelector.parse(directive.selector);
- _this.selectorMatcher.addSelectables(selector, directive);
- _this.directivesIndex.set(directive, index);
- });
- }
- TemplateParseVisitor.prototype.visitExpansion = function (expansion, context) { return null; };
- TemplateParseVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return null; };
- TemplateParseVisitor.prototype.visitText = function (text, parent) {
- var ngContentIndex = parent.findNgContentIndex(TEXT_CSS_SELECTOR());
- var valueNoNgsp = replaceNgsp(text.value);
- var expr = this._bindingParser.parseInterpolation(valueNoNgsp, text.sourceSpan);
- return expr ? new BoundTextAst(expr, ngContentIndex, text.sourceSpan) :
- new TextAst(valueNoNgsp, ngContentIndex, text.sourceSpan);
- };
- TemplateParseVisitor.prototype.visitAttribute = function (attribute, context) {
- return new AttrAst(attribute.name, attribute.value, attribute.sourceSpan);
- };
- TemplateParseVisitor.prototype.visitComment = function (comment, context) { return null; };
- TemplateParseVisitor.prototype.visitElement = function (element, parent) {
- var _this = this;
- var queryStartIndex = this.contentQueryStartId;
- var elName = element.name;
- var preparsedElement = preparseElement(element);
- if (preparsedElement.type === PreparsedElementType.SCRIPT ||
- preparsedElement.type === PreparsedElementType.STYLE) {
- // Skipping <script> for security reasons
- // Skipping <style> as we already processed them
- // in the StyleCompiler
- return null;
- }
- if (preparsedElement.type === PreparsedElementType.STYLESHEET &&
- isStyleUrlResolvable(preparsedElement.hrefAttr)) {
- // Skipping stylesheets with either relative urls or package scheme as we already processed
- // them in the StyleCompiler
- return null;
- }
- var matchableAttrs = [];
- var elementOrDirectiveProps = [];
- var elementOrDirectiveRefs = [];
- var elementVars = [];
- var events = [];
- var templateElementOrDirectiveProps = [];
- var templateMatchableAttrs = [];
- var templateElementVars = [];
- var hasInlineTemplates = false;
- var attrs = [];
- var isTemplateElement = isNgTemplate(element.name);
- element.attrs.forEach(function (attr) {
- var parsedVariables = [];
- var hasBinding = _this._parseAttr(isTemplateElement, attr, matchableAttrs, elementOrDirectiveProps, events, elementOrDirectiveRefs, elementVars);
- elementVars.push.apply(elementVars, __spread(parsedVariables.map(function (v) { return VariableAst.fromParsedVariable(v); })));
- var templateValue;
- var templateKey;
- var normalizedName = _this._normalizeAttributeName(attr.name);
- if (normalizedName.startsWith(TEMPLATE_ATTR_PREFIX)) {
- templateValue = attr.value;
- templateKey = normalizedName.substring(TEMPLATE_ATTR_PREFIX.length);
- }
- var hasTemplateBinding = templateValue != null;
- if (hasTemplateBinding) {
- if (hasInlineTemplates) {
- _this._reportError("Can't have multiple template bindings on one element. Use only one attribute prefixed with *", attr.sourceSpan);
- }
- hasInlineTemplates = true;
- var parsedVariables_1 = [];
- _this._bindingParser.parseInlineTemplateBinding(templateKey, templateValue, attr.sourceSpan, templateMatchableAttrs, templateElementOrDirectiveProps, parsedVariables_1);
- templateElementVars.push.apply(templateElementVars, __spread(parsedVariables_1.map(function (v) { return VariableAst.fromParsedVariable(v); })));
- }
- if (!hasBinding && !hasTemplateBinding) {
- // don't include the bindings as attributes as well in the AST
- attrs.push(_this.visitAttribute(attr, null));
- matchableAttrs.push([attr.name, attr.value]);
- }
- });
- var elementCssSelector = createElementCssSelector(elName, matchableAttrs);
- var _a = this._parseDirectives(this.selectorMatcher, elementCssSelector), directiveMetas = _a.directives, matchElement = _a.matchElement;
- var references = [];
- var boundDirectivePropNames = new Set();
- var directiveAsts = this._createDirectiveAsts(isTemplateElement, element.name, directiveMetas, elementOrDirectiveProps, elementOrDirectiveRefs, element.sourceSpan, references, boundDirectivePropNames);
- var elementProps = this._createElementPropertyAsts(element.name, elementOrDirectiveProps, boundDirectivePropNames);
- var isViewRoot = parent.isTemplateElement || hasInlineTemplates;
- var providerContext = new ProviderElementContext(this.providerViewContext, parent.providerContext, isViewRoot, directiveAsts, attrs, references, isTemplateElement, queryStartIndex, element.sourceSpan);
- var children = visitAll$1(preparsedElement.nonBindable ? NON_BINDABLE_VISITOR : this, element.children, ElementContext.create(isTemplateElement, directiveAsts, isTemplateElement ? parent.providerContext : providerContext));
- providerContext.afterElement();
- // Override the actual selector when the `ngProjectAs` attribute is provided
- var projectionSelector = preparsedElement.projectAs != '' ?
- CssSelector.parse(preparsedElement.projectAs)[0] :
- elementCssSelector;
- var ngContentIndex = parent.findNgContentIndex(projectionSelector);
- var parsedElement;
- if (preparsedElement.type === PreparsedElementType.NG_CONTENT) {
- // `<ng-content>` element
- if (element.children && !element.children.every(_isEmptyTextNode)) {
- this._reportError("<ng-content> element cannot have content.", element.sourceSpan);
- }
- parsedElement = new NgContentAst(this.ngContentCount++, hasInlineTemplates ? null : ngContentIndex, element.sourceSpan);
- }
- else if (isTemplateElement) {
- // `<ng-template>` element
- this._assertAllEventsPublishedByDirectives(directiveAsts, events);
- this._assertNoComponentsNorElementBindingsOnTemplate(directiveAsts, elementProps, element.sourceSpan);
- parsedElement = new EmbeddedTemplateAst(attrs, events, references, elementVars, providerContext.transformedDirectiveAsts, providerContext.transformProviders, providerContext.transformedHasViewContainer, providerContext.queryMatches, children, hasInlineTemplates ? null : ngContentIndex, element.sourceSpan);
- }
- else {
- // element other than `<ng-content>` and `<ng-template>`
- this._assertElementExists(matchElement, element);
- this._assertOnlyOneComponent(directiveAsts, element.sourceSpan);
- var ngContentIndex_1 = hasInlineTemplates ? null : parent.findNgContentIndex(projectionSelector);
- parsedElement = new ElementAst(elName, attrs, elementProps, events, references, providerContext.transformedDirectiveAsts, providerContext.transformProviders, providerContext.transformedHasViewContainer, providerContext.queryMatches, children, hasInlineTemplates ? null : ngContentIndex_1, element.sourceSpan, element.endSourceSpan || null);
- }
- if (hasInlineTemplates) {
- // The element as a *-attribute
- var templateQueryStartIndex = this.contentQueryStartId;
- var templateSelector = createElementCssSelector('ng-template', templateMatchableAttrs);
- var directives = this._parseDirectives(this.selectorMatcher, templateSelector).directives;
- var templateBoundDirectivePropNames = new Set();
- var templateDirectiveAsts = this._createDirectiveAsts(true, elName, directives, templateElementOrDirectiveProps, [], element.sourceSpan, [], templateBoundDirectivePropNames);
- var templateElementProps = this._createElementPropertyAsts(elName, templateElementOrDirectiveProps, templateBoundDirectivePropNames);
- this._assertNoComponentsNorElementBindingsOnTemplate(templateDirectiveAsts, templateElementProps, element.sourceSpan);
- var templateProviderContext = new ProviderElementContext(this.providerViewContext, parent.providerContext, parent.isTemplateElement, templateDirectiveAsts, [], [], true, templateQueryStartIndex, element.sourceSpan);
- templateProviderContext.afterElement();
- parsedElement = new EmbeddedTemplateAst([], [], [], templateElementVars, templateProviderContext.transformedDirectiveAsts, templateProviderContext.transformProviders, templateProviderContext.transformedHasViewContainer, templateProviderContext.queryMatches, [parsedElement], ngContentIndex, element.sourceSpan);
- }
- return parsedElement;
- };
- TemplateParseVisitor.prototype._parseAttr = function (isTemplateElement, attr, targetMatchableAttrs, targetProps, targetEvents, targetRefs, targetVars) {
- var name = this._normalizeAttributeName(attr.name);
- var value = attr.value;
- var srcSpan = attr.sourceSpan;
- var boundEvents = [];
- var bindParts = name.match(BIND_NAME_REGEXP);
- var hasBinding = false;
- if (bindParts !== null) {
- hasBinding = true;
- if (bindParts[KW_BIND_IDX] != null) {
- this._bindingParser.parsePropertyBinding(bindParts[IDENT_KW_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);
- }
- else if (bindParts[KW_LET_IDX]) {
- if (isTemplateElement) {
- var identifier = bindParts[IDENT_KW_IDX];
- this._parseVariable(identifier, value, srcSpan, targetVars);
- }
- else {
- this._reportError("\"let-\" is only supported on ng-template elements.", srcSpan);
- }
- }
- else if (bindParts[KW_REF_IDX]) {
- var identifier = bindParts[IDENT_KW_IDX];
- this._parseReference(identifier, value, srcSpan, targetRefs);
- }
- else if (bindParts[KW_ON_IDX]) {
- this._bindingParser.parseEvent(bindParts[IDENT_KW_IDX], value, srcSpan, attr.valueSpan || srcSpan, targetMatchableAttrs, boundEvents);
- }
- else if (bindParts[KW_BINDON_IDX]) {
- this._bindingParser.parsePropertyBinding(bindParts[IDENT_KW_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);
- this._parseAssignmentEvent(bindParts[IDENT_KW_IDX], value, srcSpan, attr.valueSpan || srcSpan, targetMatchableAttrs, boundEvents);
- }
- else if (bindParts[KW_AT_IDX]) {
- this._bindingParser.parseLiteralAttr(name, value, srcSpan, targetMatchableAttrs, targetProps);
- }
- else if (bindParts[IDENT_BANANA_BOX_IDX]) {
- this._bindingParser.parsePropertyBinding(bindParts[IDENT_BANANA_BOX_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);
- this._parseAssignmentEvent(bindParts[IDENT_BANANA_BOX_IDX], value, srcSpan, attr.valueSpan || srcSpan, targetMatchableAttrs, boundEvents);
- }
- else if (bindParts[IDENT_PROPERTY_IDX]) {
- this._bindingParser.parsePropertyBinding(bindParts[IDENT_PROPERTY_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);
- }
- else if (bindParts[IDENT_EVENT_IDX]) {
- this._bindingParser.parseEvent(bindParts[IDENT_EVENT_IDX], value, srcSpan, attr.valueSpan || srcSpan, targetMatchableAttrs, boundEvents);
- }
- }
- else {
- hasBinding = this._bindingParser.parsePropertyInterpolation(name, value, srcSpan, targetMatchableAttrs, targetProps);
- }
- if (!hasBinding) {
- this._bindingParser.parseLiteralAttr(name, value, srcSpan, targetMatchableAttrs, targetProps);
- }
- targetEvents.push.apply(targetEvents, __spread(boundEvents.map(function (e) { return BoundEventAst.fromParsedEvent(e); })));
- return hasBinding;
- };
- TemplateParseVisitor.prototype._normalizeAttributeName = function (attrName) {
- return /^data-/i.test(attrName) ? attrName.substring(5) : attrName;
- };
- TemplateParseVisitor.prototype._parseVariable = function (identifier, value, sourceSpan, targetVars) {
- if (identifier.indexOf('-') > -1) {
- this._reportError("\"-\" is not allowed in variable names", sourceSpan);
- }
- targetVars.push(new VariableAst(identifier, value, sourceSpan));
- };
- TemplateParseVisitor.prototype._parseReference = function (identifier, value, sourceSpan, targetRefs) {
- if (identifier.indexOf('-') > -1) {
- this._reportError("\"-\" is not allowed in reference names", sourceSpan);
- }
- targetRefs.push(new ElementOrDirectiveRef(identifier, value, sourceSpan));
- };
- TemplateParseVisitor.prototype._parseAssignmentEvent = function (name, expression, sourceSpan, valueSpan, targetMatchableAttrs, targetEvents) {
- this._bindingParser.parseEvent(name + "Change", expression + "=$event", sourceSpan, valueSpan, targetMatchableAttrs, targetEvents);
- };
- TemplateParseVisitor.prototype._parseDirectives = function (selectorMatcher, elementCssSelector) {
- var _this = this;
- // Need to sort the directives so that we get consistent results throughout,
- // as selectorMatcher uses Maps inside.
- // Also deduplicate directives as they might match more than one time!
- var directives = new Array(this.directivesIndex.size);
- // Whether any directive selector matches on the element name
- var matchElement = false;
- selectorMatcher.match(elementCssSelector, function (selector, directive) {
- directives[_this.directivesIndex.get(directive)] = directive;
- matchElement = matchElement || selector.hasElementSelector();
- });
- return {
- directives: directives.filter(function (dir) { return !!dir; }),
- matchElement: matchElement,
- };
- };
- TemplateParseVisitor.prototype._createDirectiveAsts = function (isTemplateElement, elementName, directives, props, elementOrDirectiveRefs, elementSourceSpan, targetReferences, targetBoundDirectivePropNames) {
- var _this = this;
- var matchedReferences = new Set();
- var component = null;
- var directiveAsts = directives.map(function (directive) {
- var sourceSpan = new ParseSourceSpan(elementSourceSpan.start, elementSourceSpan.end, "Directive " + identifierName(directive.type));
- if (directive.isComponent) {
- component = directive;
- }
- var directiveProperties = [];
- var boundProperties = _this._bindingParser.createDirectiveHostPropertyAsts(directive, elementName, sourceSpan);
- var hostProperties = boundProperties.map(function (prop) { return BoundElementPropertyAst.fromBoundProperty(prop); });
- // Note: We need to check the host properties here as well,
- // as we don't know the element name in the DirectiveWrapperCompiler yet.
- hostProperties = _this._checkPropertiesInSchema(elementName, hostProperties);
- var parsedEvents = _this._bindingParser.createDirectiveHostEventAsts(directive, sourceSpan);
- _this._createDirectivePropertyAsts(directive.inputs, props, directiveProperties, targetBoundDirectivePropNames);
- elementOrDirectiveRefs.forEach(function (elOrDirRef) {
- if ((elOrDirRef.value.length === 0 && directive.isComponent) ||
- (elOrDirRef.isReferenceToDirective(directive))) {
- targetReferences.push(new ReferenceAst(elOrDirRef.name, createTokenForReference(directive.type.reference), elOrDirRef.value, elOrDirRef.sourceSpan));
- matchedReferences.add(elOrDirRef.name);
- }
- });
- var hostEvents = parsedEvents.map(function (e) { return BoundEventAst.fromParsedEvent(e); });
- var contentQueryStartId = _this.contentQueryStartId;
- _this.contentQueryStartId += directive.queries.length;
- return new DirectiveAst(directive, directiveProperties, hostProperties, hostEvents, contentQueryStartId, sourceSpan);
- });
- elementOrDirectiveRefs.forEach(function (elOrDirRef) {
- if (elOrDirRef.value.length > 0) {
- if (!matchedReferences.has(elOrDirRef.name)) {
- _this._reportError("There is no directive with \"exportAs\" set to \"" + elOrDirRef.value + "\"", elOrDirRef.sourceSpan);
- }
- }
- else if (!component) {
- var refToken = null;
- if (isTemplateElement) {
- refToken = createTokenForExternalReference(_this.reflector, Identifiers.TemplateRef);
- }
- targetReferences.push(new ReferenceAst(elOrDirRef.name, refToken, elOrDirRef.value, elOrDirRef.sourceSpan));
- }
- });
- return directiveAsts;
- };
- TemplateParseVisitor.prototype._createDirectivePropertyAsts = function (directiveProperties, boundProps, targetBoundDirectiveProps, targetBoundDirectivePropNames) {
- if (directiveProperties) {
- var boundPropsByName_1 = new Map();
- boundProps.forEach(function (boundProp) {
- var prevValue = boundPropsByName_1.get(boundProp.name);
- if (!prevValue || prevValue.isLiteral) {
- // give [a]="b" a higher precedence than a="b" on the same element
- boundPropsByName_1.set(boundProp.name, boundProp);
- }
- });
- Object.keys(directiveProperties).forEach(function (dirProp) {
- var elProp = directiveProperties[dirProp];
- var boundProp = boundPropsByName_1.get(elProp);
- // Bindings are optional, so this binding only needs to be set up if an expression is given.
- if (boundProp) {
- targetBoundDirectivePropNames.add(boundProp.name);
- if (!isEmptyExpression(boundProp.expression)) {
- targetBoundDirectiveProps.push(new BoundDirectivePropertyAst(dirProp, boundProp.name, boundProp.expression, boundProp.sourceSpan));
- }
- }
- });
- }
- };
- TemplateParseVisitor.prototype._createElementPropertyAsts = function (elementName, props, boundDirectivePropNames) {
- var _this = this;
- var boundElementProps = [];
- props.forEach(function (prop) {
- if (!prop.isLiteral && !boundDirectivePropNames.has(prop.name)) {
- var boundProp = _this._bindingParser.createBoundElementProperty(elementName, prop);
- boundElementProps.push(BoundElementPropertyAst.fromBoundProperty(boundProp));
- }
- });
- return this._checkPropertiesInSchema(elementName, boundElementProps);
- };
- TemplateParseVisitor.prototype._findComponentDirectives = function (directives) {
- return directives.filter(function (directive) { return directive.directive.isComponent; });
- };
- TemplateParseVisitor.prototype._findComponentDirectiveNames = function (directives) {
- return this._findComponentDirectives(directives)
- .map(function (directive) { return identifierName(directive.directive.type); });
- };
- TemplateParseVisitor.prototype._assertOnlyOneComponent = function (directives, sourceSpan) {
- var componentTypeNames = this._findComponentDirectiveNames(directives);
- if (componentTypeNames.length > 1) {
- this._reportError("More than one component matched on this element.\n" +
- "Make sure that only one component's selector can match a given element.\n" +
- ("Conflicting components: " + componentTypeNames.join(',')), sourceSpan);
- }
- };
- /**
- * Make sure that non-angular tags conform to the schemas.
- *
- * Note: An element is considered an angular tag when at least one directive selector matches the
- * tag name.
- *
- * @param matchElement Whether any directive has matched on the tag name
- * @param element the html element
- */
- TemplateParseVisitor.prototype._assertElementExists = function (matchElement, element) {
- var elName = element.name.replace(/^:xhtml:/, '');
- if (!matchElement && !this._schemaRegistry.hasElement(elName, this._schemas)) {
- var errorMsg = "'" + elName + "' is not a known element:\n";
- errorMsg +=
- "1. If '" + elName + "' is an Angular component, then verify that it is part of this module.\n";
- if (elName.indexOf('-') > -1) {
- errorMsg +=
- "2. If '" + elName + "' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.";
- }
- else {
- errorMsg +=
- "2. To allow any element add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.";
- }
- this._reportError(errorMsg, element.sourceSpan);
- }
- };
- TemplateParseVisitor.prototype._assertNoComponentsNorElementBindingsOnTemplate = function (directives, elementProps, sourceSpan) {
- var _this = this;
- var componentTypeNames = this._findComponentDirectiveNames(directives);
- if (componentTypeNames.length > 0) {
- this._reportError("Components on an embedded template: " + componentTypeNames.join(','), sourceSpan);
- }
- elementProps.forEach(function (prop) {
- _this._reportError("Property binding " + prop.name + " not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the \"@NgModule.declarations\".", sourceSpan);
- });
- };
- TemplateParseVisitor.prototype._assertAllEventsPublishedByDirectives = function (directives, events) {
- var _this = this;
- var allDirectiveEvents = new Set();
- directives.forEach(function (directive) {
- Object.keys(directive.directive.outputs).forEach(function (k) {
- var eventName = directive.directive.outputs[k];
- allDirectiveEvents.add(eventName);
- });
- });
- events.forEach(function (event) {
- if (event.target != null || !allDirectiveEvents.has(event.name)) {
- _this._reportError("Event binding " + event.fullName + " not emitted by any directive on an embedded template. Make sure that the event name is spelled correctly and all directives are listed in the \"@NgModule.declarations\".", event.sourceSpan);
- }
- });
- };
- TemplateParseVisitor.prototype._checkPropertiesInSchema = function (elementName, boundProps) {
- var _this = this;
- // Note: We can't filter out empty expressions before this method,
- // as we still want to validate them!
- return boundProps.filter(function (boundProp) {
- if (boundProp.type === 0 /* Property */ &&
- !_this._schemaRegistry.hasProperty(elementName, boundProp.name, _this._schemas)) {
- var errorMsg = "Can't bind to '" + boundProp.name + "' since it isn't a known property of '" + elementName + "'.";
- if (elementName.startsWith('ng-')) {
- errorMsg +=
- "\n1. If '" + boundProp.name + "' is an Angular directive, then add 'CommonModule' to the '@NgModule.imports' of this component." +
- "\n2. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.";
- }
- else if (elementName.indexOf('-') > -1) {
- errorMsg +=
- "\n1. If '" + elementName + "' is an Angular component and it has '" + boundProp.name + "' input, then verify that it is part of this module." +
- ("\n2. If '" + elementName + "' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.") +
- "\n3. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.";
- }
- _this._reportError(errorMsg, boundProp.sourceSpan);
- }
- return !isEmptyExpression(boundProp.value);
- });
- };
- TemplateParseVisitor.prototype._reportError = function (message, sourceSpan, level) {
- if (level === void 0) { level = ParseErrorLevel.ERROR; }
- this._targetErrors.push(new ParseError(sourceSpan, message, level));
- };
- return TemplateParseVisitor;
- }());
- var NonBindableVisitor = /** @class */ (function () {
- function NonBindableVisitor() {
- }
- NonBindableVisitor.prototype.visitElement = function (ast, parent) {
- var preparsedElement = preparseElement(ast);
- if (preparsedElement.type === PreparsedElementType.SCRIPT ||
- preparsedElement.type === PreparsedElementType.STYLE ||
- preparsedElement.type === PreparsedElementType.STYLESHEET) {
- // Skipping <script> for security reasons
- // Skipping <style> and stylesheets as we already processed them
- // in the StyleCompiler
- return null;
- }
- var attrNameAndValues = ast.attrs.map(function (attr) { return [attr.name, attr.value]; });
- var selector = createElementCssSelector(ast.name, attrNameAndValues);
- var ngContentIndex = parent.findNgContentIndex(selector);
- var children = visitAll$1(this, ast.children, EMPTY_ELEMENT_CONTEXT);
- return new ElementAst(ast.name, visitAll$1(this, ast.attrs), [], [], [], [], [], false, [], children, ngContentIndex, ast.sourceSpan, ast.endSourceSpan);
- };
- NonBindableVisitor.prototype.visitComment = function (comment, context) { return null; };
- NonBindableVisitor.prototype.visitAttribute = function (attribute, context) {
- return new AttrAst(attribute.name, attribute.value, attribute.sourceSpan);
- };
- NonBindableVisitor.prototype.visitText = function (text, parent) {
- var ngContentIndex = parent.findNgContentIndex(TEXT_CSS_SELECTOR());
- return new TextAst(text.value, ngContentIndex, text.sourceSpan);
- };
- NonBindableVisitor.prototype.visitExpansion = function (expansion, context) { return expansion; };
- NonBindableVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return expansionCase; };
- return NonBindableVisitor;
- }());
- /**
- * A reference to an element or directive in a template. E.g., the reference in this template:
- *
- * <div #myMenu="coolMenu">
- *
- * would be {name: 'myMenu', value: 'coolMenu', sourceSpan: ...}
- */
- var ElementOrDirectiveRef = /** @class */ (function () {
- function ElementOrDirectiveRef(name, value, sourceSpan) {
- this.name = name;
- this.value = value;
- this.sourceSpan = sourceSpan;
- }
- /** Gets whether this is a reference to the given directive. */
- ElementOrDirectiveRef.prototype.isReferenceToDirective = function (directive) {
- return splitExportAs(directive.exportAs).indexOf(this.value) !== -1;
- };
- return ElementOrDirectiveRef;
- }());
- /** Splits a raw, potentially comma-delimited `exportAs` value into an array of names. */
- function splitExportAs(exportAs) {
- return exportAs ? exportAs.split(',').map(function (e) { return e.trim(); }) : [];
- }
- function splitClasses(classAttrValue) {
- return classAttrValue.trim().split(/\s+/g);
- }
- var ElementContext = /** @class */ (function () {
- function ElementContext(isTemplateElement, _ngContentIndexMatcher, _wildcardNgContentIndex, providerContext) {
- this.isTemplateElement = isTemplateElement;
- this._ngContentIndexMatcher = _ngContentIndexMatcher;
- this._wildcardNgContentIndex = _wildcardNgContentIndex;
- this.providerContext = providerContext;
- }
- ElementContext.create = function (isTemplateElement, directives, providerContext) {
- var matcher = new SelectorMatcher();
- var wildcardNgContentIndex = null;
- var component = directives.find(function (directive) { return directive.directive.isComponent; });
- if (component) {
- var ngContentSelectors = component.directive.template.ngContentSelectors;
- for (var i = 0; i < ngContentSelectors.length; i++) {
- var selector = ngContentSelectors[i];
- if (selector === '*') {
- wildcardNgContentIndex = i;
- }
- else {
- matcher.addSelectables(CssSelector.parse(ngContentSelectors[i]), i);
- }
- }
- }
- return new ElementContext(isTemplateElement, matcher, wildcardNgContentIndex, providerContext);
- };
- ElementContext.prototype.findNgContentIndex = function (selector) {
- var ngContentIndices = [];
- this._ngContentIndexMatcher.match(selector, function (selector, ngContentIndex) { ngContentIndices.push(ngContentIndex); });
- ngContentIndices.sort();
- if (this._wildcardNgContentIndex != null) {
- ngContentIndices.push(this._wildcardNgContentIndex);
- }
- return ngContentIndices.length > 0 ? ngContentIndices[0] : null;
- };
- return ElementContext;
- }());
- function createElementCssSelector(elementName, attributes) {
- var cssSelector = new CssSelector();
- var elNameNoNs = splitNsName(elementName)[1];
- cssSelector.setElement(elNameNoNs);
- for (var i = 0; i < attributes.length; i++) {
- var attrName = attributes[i][0];
- var attrNameNoNs = splitNsName(attrName)[1];
- var attrValue = attributes[i][1];
- cssSelector.addAttribute(attrNameNoNs, attrValue);
- if (attrName.toLowerCase() == CLASS_ATTR) {
- var classes = splitClasses(attrValue);
- classes.forEach(function (className) { return cssSelector.addClassName(className); });
- }
- }
- return cssSelector;
- }
- var EMPTY_ELEMENT_CONTEXT = new ElementContext(true, new SelectorMatcher(), null, null);
- var NON_BINDABLE_VISITOR = new NonBindableVisitor();
- function _isEmptyTextNode(node) {
- return node instanceof Text$3 && node.value.trim().length == 0;
- }
- function removeSummaryDuplicates(items) {
- var map = new Map();
- items.forEach(function (item) {
- if (!map.get(item.type.reference)) {
- map.set(item.type.reference, item);
- }
- });
- return Array.from(map.values());
- }
- function isEmptyExpression(ast) {
- if (ast instanceof ASTWithSource) {
- ast = ast.ast;
- }
- return ast instanceof EmptyExpr;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Parses string representation of a style and converts it into object literal.
- *
- * @param value string representation of style as used in the `style` attribute in HTML.
- * Example: `color: red; height: auto`.
- * @returns An array of style property name and value pairs, e.g. `['color', 'red', 'height',
- * 'auto']`
- */
- function parse(value) {
- // we use a string array here instead of a string map
- // because a string-map is not guaranteed to retain the
- // order of the entries whereas a string array can be
- // construted in a [key, value, key, value] format.
- var styles = [];
- var i = 0;
- var parenDepth = 0;
- var quote = 0 /* QuoteNone */;
- var valueStart = 0;
- var propStart = 0;
- var currentProp = null;
- var valueHasQuotes = false;
- while (i < value.length) {
- var token = value.charCodeAt(i++);
- switch (token) {
- case 40 /* OpenParen */:
- parenDepth++;
- break;
- case 41 /* CloseParen */:
- parenDepth--;
- break;
- case 39 /* QuoteSingle */:
- // valueStart needs to be there since prop values don't
- // have quotes in CSS
- valueHasQuotes = valueHasQuotes || valueStart > 0;
- if (quote === 0 /* QuoteNone */) {
- quote = 39 /* QuoteSingle */;
- }
- else if (quote === 39 /* QuoteSingle */ && value.charCodeAt(i - 1) !== 92 /* BackSlash */) {
- quote = 0 /* QuoteNone */;
- }
- break;
- case 34 /* QuoteDouble */:
- // same logic as above
- valueHasQuotes = valueHasQuotes || valueStart > 0;
- if (quote === 0 /* QuoteNone */) {
- quote = 34 /* QuoteDouble */;
- }
- else if (quote === 34 /* QuoteDouble */ && value.charCodeAt(i - 1) !== 92 /* BackSlash */) {
- quote = 0 /* QuoteNone */;
- }
- break;
- case 58 /* Colon */:
- if (!currentProp && parenDepth === 0 && quote === 0 /* QuoteNone */) {
- currentProp = hyphenate(value.substring(propStart, i - 1).trim());
- valueStart = i;
- }
- break;
- case 59 /* Semicolon */:
- if (currentProp && valueStart > 0 && parenDepth === 0 && quote === 0 /* QuoteNone */) {
- var styleVal = value.substring(valueStart, i - 1).trim();
- styles.push(currentProp, valueHasQuotes ? stripUnnecessaryQuotes(styleVal) : styleVal);
- propStart = i;
- valueStart = 0;
- currentProp = null;
- valueHasQuotes = false;
- }
- break;
- }
- }
- if (currentProp && valueStart) {
- var styleVal = value.substr(valueStart).trim();
- styles.push(currentProp, valueHasQuotes ? stripUnnecessaryQuotes(styleVal) : styleVal);
- }
- return styles;
- }
- function stripUnnecessaryQuotes(value) {
- var qS = value.charCodeAt(0);
- var qE = value.charCodeAt(value.length - 1);
- if (qS == qE && (qS == 39 /* QuoteSingle */ || qS == 34 /* QuoteDouble */)) {
- var tempValue = value.substring(1, value.length - 1);
- // special case to avoid using a multi-quoted string that was just chomped
- // (e.g. `font-family: "Verdana", "sans-serif"`)
- if (tempValue.indexOf('\'') == -1 && tempValue.indexOf('"') == -1) {
- value = tempValue;
- }
- }
- return value;
- }
- function hyphenate(value) {
- return value.replace(/[a-z][A-Z]/g, function (v) {
- return v.charAt(0) + '-' + v.charAt(1);
- }).toLowerCase();
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _stylingMode = 0;
- function compilerIsNewStylingInUse() {
- return _stylingMode > 0 /* UseOld */;
- }
- var IMPORTANT_FLAG = '!important';
- /**
- * Produces creation/update instructions for all styling bindings (class and style)
- *
- * It also produces the creation instruction to register all initial styling values
- * (which are all the static class="..." and style="..." attribute values that exist
- * on an element within a template).
- *
- * The builder class below handles producing instructions for the following cases:
- *
- * - Static style/class attributes (style="..." and class="...")
- * - Dynamic style/class map bindings ([style]="map" and [class]="map|string")
- * - Dynamic style/class property bindings ([style.prop]="exp" and [class.name]="exp")
- *
- * Due to the complex relationship of all of these cases, the instructions generated
- * for these attributes/properties/bindings must be done so in the correct order. The
- * order which these must be generated is as follows:
- *
- * if (createMode) {
- * styling(...)
- * }
- * if (updateMode) {
- * styleMap(...)
- * classMap(...)
- * styleProp(...)
- * classProp(...)
- * stylingApp(...)
- * }
- *
- * The creation/update methods within the builder class produce these instructions.
- */
- var StylingBuilder = /** @class */ (function () {
- function StylingBuilder(_elementIndexExpr, _directiveExpr) {
- this._elementIndexExpr = _elementIndexExpr;
- this._directiveExpr = _directiveExpr;
- /** Whether or not there are any static styling values present */
- this._hasInitialValues = false;
- /**
- * Whether or not there are any styling bindings present
- * (i.e. `[style]`, `[class]`, `[style.prop]` or `[class.name]`)
- */
- this.hasBindings = false;
- /** the input for [class] (if it exists) */
- this._classMapInput = null;
- /** the input for [style] (if it exists) */
- this._styleMapInput = null;
- /** an array of each [style.prop] input */
- this._singleStyleInputs = null;
- /** an array of each [class.name] input */
- this._singleClassInputs = null;
- this._lastStylingInput = null;
- this._firstStylingInput = null;
- // maps are used instead of hash maps because a Map will
- // retain the ordering of the keys
- /**
- * Represents the location of each style binding in the template
- * (e.g. `<div [style.width]="w" [style.height]="h">` implies
- * that `width=0` and `height=1`)
- */
- this._stylesIndex = new Map();
- /**
- * Represents the location of each class binding in the template
- * (e.g. `<div [class.big]="b" [class.hidden]="h">` implies
- * that `big=0` and `hidden=1`)
- */
- this._classesIndex = new Map();
- this._initialStyleValues = [];
- this._initialClassValues = [];
- // certain style properties ALWAYS need sanitization
- // this is checked each time new styles are encountered
- this._useDefaultSanitizer = false;
- }
- /**
- * Registers a given input to the styling builder to be later used when producing AOT code.
- *
- * The code below will only accept the input if it is somehow tied to styling (whether it be
- * style/class bindings or static style/class attributes).
- */
- StylingBuilder.prototype.registerBoundInput = function (input) {
- // [attr.style] or [attr.class] are skipped in the code below,
- // they should not be treated as styling-based bindings since
- // they are intended to be written directly to the attr and
- // will therefore skip all style/class resolution that is present
- // with style="", [style]="" and [style.prop]="", class="",
- // [class.prop]="". [class]="" assignments
- var binding = null;
- var name = input.name;
- switch (input.type) {
- case 0 /* Property */:
- binding = this.registerInputBasedOnName(name, input.value, input.sourceSpan);
- break;
- case 3 /* Style */:
- binding = this.registerStyleInput(name, false, input.value, input.sourceSpan, input.unit);
- break;
- case 2 /* Class */:
- binding = this.registerClassInput(name, false, input.value, input.sourceSpan);
- break;
- }
- return binding ? true : false;
- };
- StylingBuilder.prototype.registerInputBasedOnName = function (name, expression, sourceSpan) {
- var binding = null;
- var nameToMatch = name.substring(0, 5); // class | style
- var isStyle = nameToMatch === 'style';
- var isClass = isStyle ? false : (nameToMatch === 'class');
- if (isStyle || isClass) {
- var isMapBased = name.charAt(5) !== '.'; // style.prop or class.prop makes this a no
- var property = name.substr(isMapBased ? 5 : 6); // the dot explains why there's a +1
- if (isStyle) {
- binding = this.registerStyleInput(property, isMapBased, expression, sourceSpan);
- }
- else {
- binding = this.registerClassInput(property, isMapBased, expression, sourceSpan);
- }
- }
- return binding;
- };
- StylingBuilder.prototype.registerStyleInput = function (name, isMapBased, value, sourceSpan, unit) {
- if (isEmptyExpression(value)) {
- return null;
- }
- var _a = parseProperty(name), property = _a.property, hasOverrideFlag = _a.hasOverrideFlag, bindingUnit = _a.unit;
- var entry = {
- name: property,
- unit: unit || bindingUnit, value: value, sourceSpan: sourceSpan, hasOverrideFlag: hasOverrideFlag
- };
- if (isMapBased) {
- this._useDefaultSanitizer = true;
- this._styleMapInput = entry;
- }
- else {
- (this._singleStyleInputs = this._singleStyleInputs || []).push(entry);
- this._useDefaultSanitizer = this._useDefaultSanitizer || isStyleSanitizable(name);
- registerIntoMap(this._stylesIndex, property);
- }
- this._lastStylingInput = entry;
- this._firstStylingInput = this._firstStylingInput || entry;
- this.hasBindings = true;
- return entry;
- };
- StylingBuilder.prototype.registerClassInput = function (name, isMapBased, value, sourceSpan) {
- if (isEmptyExpression(value)) {
- return null;
- }
- var _a = parseProperty(name), property = _a.property, hasOverrideFlag = _a.hasOverrideFlag;
- var entry = { name: property, value: value, sourceSpan: sourceSpan, hasOverrideFlag: hasOverrideFlag, unit: null };
- if (isMapBased) {
- this._classMapInput = entry;
- }
- else {
- (this._singleClassInputs = this._singleClassInputs || []).push(entry);
- registerIntoMap(this._classesIndex, property);
- }
- this._lastStylingInput = entry;
- this._firstStylingInput = this._firstStylingInput || entry;
- this.hasBindings = true;
- return entry;
- };
- /**
- * Registers the element's static style string value to the builder.
- *
- * @param value the style string (e.g. `width:100px; height:200px;`)
- */
- StylingBuilder.prototype.registerStyleAttr = function (value) {
- this._initialStyleValues = parse(value);
- this._hasInitialValues = true;
- };
- /**
- * Registers the element's static class string value to the builder.
- *
- * @param value the className string (e.g. `disabled gold zoom`)
- */
- StylingBuilder.prototype.registerClassAttr = function (value) {
- this._initialClassValues = value.trim().split(/\s+/g);
- this._hasInitialValues = true;
- };
- /**
- * Appends all styling-related expressions to the provided attrs array.
- *
- * @param attrs an existing array where each of the styling expressions
- * will be inserted into.
- */
- StylingBuilder.prototype.populateInitialStylingAttrs = function (attrs) {
- // [CLASS_MARKER, 'foo', 'bar', 'baz' ...]
- if (this._initialClassValues.length) {
- attrs.push(literal(1 /* Classes */));
- for (var i = 0; i < this._initialClassValues.length; i++) {
- attrs.push(literal(this._initialClassValues[i]));
- }
- }
- // [STYLE_MARKER, 'width', '200px', 'height', '100px', ...]
- if (this._initialStyleValues.length) {
- attrs.push(literal(2 /* Styles */));
- for (var i = 0; i < this._initialStyleValues.length; i += 2) {
- attrs.push(literal(this._initialStyleValues[i]), literal(this._initialStyleValues[i + 1]));
- }
- }
- };
- /**
- * Builds an instruction with all the expressions and parameters for `elementHostAttrs`.
- *
- * The instruction generation code below is used for producing the AOT statement code which is
- * responsible for registering initial styles (within a directive hostBindings' creation block),
- * as well as any of the provided attribute values, to the directive host element.
- */
- StylingBuilder.prototype.buildHostAttrsInstruction = function (sourceSpan, attrs, constantPool) {
- var _this = this;
- if (this._directiveExpr && (attrs.length || this._hasInitialValues)) {
- return {
- sourceSpan: sourceSpan,
- reference: Identifiers$1.elementHostAttrs,
- allocateBindingSlots: 0,
- buildParams: function () {
- // params => elementHostAttrs(attrs)
- _this.populateInitialStylingAttrs(attrs);
- var attrArray = !attrs.some(function (attr) { return attr instanceof WrappedNodeExpr; }) ?
- getConstantLiteralFromArray(constantPool, attrs) :
- literalArr(attrs);
- return [attrArray];
- }
- };
- }
- return null;
- };
- /**
- * Builds an instruction with all the expressions and parameters for `styling`.
- *
- * The instruction generation code below is used for producing the AOT statement code which is
- * responsible for registering style/class bindings to an element.
- */
- StylingBuilder.prototype.buildStylingInstruction = function (sourceSpan, constantPool) {
- var _this = this;
- if (this.hasBindings) {
- return {
- sourceSpan: sourceSpan,
- allocateBindingSlots: 0,
- reference: Identifiers$1.styling,
- buildParams: function () {
- // a string array of every style-based binding
- var styleBindingProps = _this._singleStyleInputs ? _this._singleStyleInputs.map(function (i) { return literal(i.name); }) : [];
- // a string array of every class-based binding
- var classBindingNames = _this._singleClassInputs ? _this._singleClassInputs.map(function (i) { return literal(i.name); }) : [];
- // to salvage space in the AOT generated code, there is no point in passing
- // in `null` into a param if any follow-up params are not used. Therefore,
- // only when a trailing param is used then it will be filled with nulls in between
- // (otherwise a shorter amount of params will be filled). The code below helps
- // determine how many params are required in the expression code.
- //
- // min params => styling()
- // max params => styling(classBindings, styleBindings, sanitizer)
- //
- var params = [];
- var expectedNumberOfArgs = 0;
- if (_this._useDefaultSanitizer) {
- expectedNumberOfArgs = 3;
- }
- else if (styleBindingProps.length) {
- expectedNumberOfArgs = 2;
- }
- else if (classBindingNames.length) {
- expectedNumberOfArgs = 1;
- }
- addParam(params, classBindingNames.length > 0, getConstantLiteralFromArray(constantPool, classBindingNames), 1, expectedNumberOfArgs);
- addParam(params, styleBindingProps.length > 0, getConstantLiteralFromArray(constantPool, styleBindingProps), 2, expectedNumberOfArgs);
- addParam(params, _this._useDefaultSanitizer, importExpr(Identifiers$1.defaultStyleSanitizer), 3, expectedNumberOfArgs);
- return params;
- }
- };
- }
- return null;
- };
- /**
- * Builds an instruction with all the expressions and parameters for `classMap`.
- *
- * The instruction data will contain all expressions for `classMap` to function
- * which includes the `[class]` expression params.
- */
- StylingBuilder.prototype.buildClassMapInstruction = function (valueConverter) {
- if (this._classMapInput) {
- return this._buildMapBasedInstruction(valueConverter, true, this._classMapInput);
- }
- return null;
- };
- /**
- * Builds an instruction with all the expressions and parameters for `styleMap`.
- *
- * The instruction data will contain all expressions for `styleMap` to function
- * which includes the `[style]` expression params.
- */
- StylingBuilder.prototype.buildStyleMapInstruction = function (valueConverter) {
- if (this._styleMapInput) {
- return this._buildMapBasedInstruction(valueConverter, false, this._styleMapInput);
- }
- return null;
- };
- StylingBuilder.prototype._buildMapBasedInstruction = function (valueConverter, isClassBased, stylingInput) {
- var totalBindingSlotsRequired = 0;
- if (compilerIsNewStylingInUse()) {
- // the old implementation does not reserve slot values for
- // binding entries. The new one does.
- totalBindingSlotsRequired++;
- }
- // these values must be outside of the update block so that they can
- // be evaluated (the AST visit call) during creation time so that any
- // pipes can be picked up in time before the template is built
- var mapValue = stylingInput.value.visit(valueConverter);
- if (mapValue instanceof Interpolation) {
- totalBindingSlotsRequired += mapValue.expressions.length;
- }
- var reference = isClassBased ? Identifiers$1.classMap : Identifiers$1.styleMap;
- return {
- sourceSpan: stylingInput.sourceSpan,
- reference: reference,
- allocateBindingSlots: totalBindingSlotsRequired,
- buildParams: function (convertFn) { return [convertFn(mapValue)]; }
- };
- };
- StylingBuilder.prototype._buildSingleInputs = function (reference, inputs, mapIndex, allowUnits, valueConverter) {
- var totalBindingSlotsRequired = 0;
- return inputs.map(function (input) {
- var bindingIndex = mapIndex.get(input.name);
- var value = input.value.visit(valueConverter);
- totalBindingSlotsRequired += (value instanceof Interpolation) ? value.expressions.length : 0;
- if (compilerIsNewStylingInUse()) {
- // the old implementation does not reserve slot values for
- // binding entries. The new one does.
- totalBindingSlotsRequired++;
- }
- return {
- sourceSpan: input.sourceSpan,
- allocateBindingSlots: totalBindingSlotsRequired, reference: reference,
- buildParams: function (convertFn) {
- // min params => stylingProp(elmIndex, bindingIndex, value)
- // max params => stylingProp(elmIndex, bindingIndex, value, overrideFlag)
- var params = [];
- params.push(literal(bindingIndex));
- params.push(convertFn(value));
- if (allowUnits) {
- if (input.unit) {
- params.push(literal(input.unit));
- }
- else if (input.hasOverrideFlag) {
- params.push(NULL_EXPR);
- }
- }
- if (input.hasOverrideFlag) {
- params.push(literal(true));
- }
- return params;
- }
- };
- });
- };
- StylingBuilder.prototype._buildClassInputs = function (valueConverter) {
- if (this._singleClassInputs) {
- return this._buildSingleInputs(Identifiers$1.classProp, this._singleClassInputs, this._classesIndex, false, valueConverter);
- }
- return [];
- };
- StylingBuilder.prototype._buildStyleInputs = function (valueConverter) {
- if (this._singleStyleInputs) {
- return this._buildSingleInputs(Identifiers$1.styleProp, this._singleStyleInputs, this._stylesIndex, true, valueConverter);
- }
- return [];
- };
- StylingBuilder.prototype._buildApplyFn = function () {
- return {
- sourceSpan: this._lastStylingInput ? this._lastStylingInput.sourceSpan : null,
- reference: Identifiers$1.stylingApply,
- allocateBindingSlots: 0,
- buildParams: function () { return []; }
- };
- };
- StylingBuilder.prototype._buildSanitizerFn = function () {
- return {
- sourceSpan: this._firstStylingInput ? this._firstStylingInput.sourceSpan : null,
- reference: Identifiers$1.styleSanitizer,
- allocateBindingSlots: 0,
- buildParams: function () { return [importExpr(Identifiers$1.defaultStyleSanitizer)]; }
- };
- };
- /**
- * Constructs all instructions which contain the expressions that will be placed
- * into the update block of a template function or a directive hostBindings function.
- */
- StylingBuilder.prototype.buildUpdateLevelInstructions = function (valueConverter) {
- var instructions = [];
- if (this.hasBindings) {
- if (compilerIsNewStylingInUse() && this._useDefaultSanitizer) {
- instructions.push(this._buildSanitizerFn());
- }
- var styleMapInstruction = this.buildStyleMapInstruction(valueConverter);
- if (styleMapInstruction) {
- instructions.push(styleMapInstruction);
- }
- var classMapInstruction = this.buildClassMapInstruction(valueConverter);
- if (classMapInstruction) {
- instructions.push(classMapInstruction);
- }
- instructions.push.apply(instructions, __spread(this._buildStyleInputs(valueConverter)));
- instructions.push.apply(instructions, __spread(this._buildClassInputs(valueConverter)));
- instructions.push(this._buildApplyFn());
- }
- return instructions;
- };
- return StylingBuilder;
- }());
- function registerIntoMap(map, key) {
- if (!map.has(key)) {
- map.set(key, map.size);
- }
- }
- function isStyleSanitizable(prop) {
- // Note that browsers support both the dash case and
- // camel case property names when setting through JS.
- return prop === 'background-image' || prop === 'backgroundImage' || prop === 'background' ||
- prop === 'border-image' || prop === 'borderImage' || prop === 'filter' ||
- prop === 'list-style' || prop === 'listStyle' || prop === 'list-style-image' ||
- prop === 'listStyleImage' || prop === 'clip-path' || prop === 'clipPath';
- }
- /**
- * Simple helper function to either provide the constant literal that will house the value
- * here or a null value if the provided values are empty.
- */
- function getConstantLiteralFromArray(constantPool, values) {
- return values.length ? constantPool.getConstLiteral(literalArr(values), true) : NULL_EXPR;
- }
- /**
- * Simple helper function that adds a parameter or does nothing at all depending on the provided
- * predicate and totalExpectedArgs values
- */
- function addParam(params, predicate, value, argNumber, totalExpectedArgs) {
- if (predicate && value) {
- params.push(value);
- }
- else if (argNumber < totalExpectedArgs) {
- params.push(NULL_EXPR);
- }
- }
- function parseProperty(name) {
- var hasOverrideFlag = false;
- var overrideIndex = name.indexOf(IMPORTANT_FLAG);
- if (overrideIndex !== -1) {
- name = overrideIndex > 0 ? name.substring(0, overrideIndex) : '';
- hasOverrideFlag = true;
- }
- var unit = '';
- var property = name;
- var unitIndex = name.lastIndexOf('.');
- if (unitIndex > 0) {
- unit = name.substr(unitIndex + 1);
- property = name.substring(0, unitIndex);
- }
- return { property: property, unit: unit, hasOverrideFlag: hasOverrideFlag };
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TokenType$1;
- (function (TokenType) {
- TokenType[TokenType["Character"] = 0] = "Character";
- TokenType[TokenType["Identifier"] = 1] = "Identifier";
- TokenType[TokenType["Keyword"] = 2] = "Keyword";
- TokenType[TokenType["String"] = 3] = "String";
- TokenType[TokenType["Operator"] = 4] = "Operator";
- TokenType[TokenType["Number"] = 5] = "Number";
- TokenType[TokenType["Error"] = 6] = "Error";
- })(TokenType$1 || (TokenType$1 = {}));
- var KEYWORDS = ['var', 'let', 'as', 'null', 'undefined', 'true', 'false', 'if', 'else', 'this'];
- var Lexer = /** @class */ (function () {
- function Lexer() {
- }
- Lexer.prototype.tokenize = function (text) {
- var scanner = new _Scanner(text);
- var tokens = [];
- var token = scanner.scanToken();
- while (token != null) {
- tokens.push(token);
- token = scanner.scanToken();
- }
- return tokens;
- };
- return Lexer;
- }());
- var Token$1 = /** @class */ (function () {
- function Token(index, type, numValue, strValue) {
- this.index = index;
- this.type = type;
- this.numValue = numValue;
- this.strValue = strValue;
- }
- Token.prototype.isCharacter = function (code) {
- return this.type == TokenType$1.Character && this.numValue == code;
- };
- Token.prototype.isNumber = function () { return this.type == TokenType$1.Number; };
- Token.prototype.isString = function () { return this.type == TokenType$1.String; };
- Token.prototype.isOperator = function (operator) {
- return this.type == TokenType$1.Operator && this.strValue == operator;
- };
- Token.prototype.isIdentifier = function () { return this.type == TokenType$1.Identifier; };
- Token.prototype.isKeyword = function () { return this.type == TokenType$1.Keyword; };
- Token.prototype.isKeywordLet = function () { return this.type == TokenType$1.Keyword && this.strValue == 'let'; };
- Token.prototype.isKeywordAs = function () { return this.type == TokenType$1.Keyword && this.strValue == 'as'; };
- Token.prototype.isKeywordNull = function () { return this.type == TokenType$1.Keyword && this.strValue == 'null'; };
- Token.prototype.isKeywordUndefined = function () {
- return this.type == TokenType$1.Keyword && this.strValue == 'undefined';
- };
- Token.prototype.isKeywordTrue = function () { return this.type == TokenType$1.Keyword && this.strValue == 'true'; };
- Token.prototype.isKeywordFalse = function () { return this.type == TokenType$1.Keyword && this.strValue == 'false'; };
- Token.prototype.isKeywordThis = function () { return this.type == TokenType$1.Keyword && this.strValue == 'this'; };
- Token.prototype.isError = function () { return this.type == TokenType$1.Error; };
- Token.prototype.toNumber = function () { return this.type == TokenType$1.Number ? this.numValue : -1; };
- Token.prototype.toString = function () {
- switch (this.type) {
- case TokenType$1.Character:
- case TokenType$1.Identifier:
- case TokenType$1.Keyword:
- case TokenType$1.Operator:
- case TokenType$1.String:
- case TokenType$1.Error:
- return this.strValue;
- case TokenType$1.Number:
- return this.numValue.toString();
- default:
- return null;
- }
- };
- return Token;
- }());
- function newCharacterToken(index, code) {
- return new Token$1(index, TokenType$1.Character, code, String.fromCharCode(code));
- }
- function newIdentifierToken(index, text) {
- return new Token$1(index, TokenType$1.Identifier, 0, text);
- }
- function newKeywordToken(index, text) {
- return new Token$1(index, TokenType$1.Keyword, 0, text);
- }
- function newOperatorToken(index, text) {
- return new Token$1(index, TokenType$1.Operator, 0, text);
- }
- function newStringToken(index, text) {
- return new Token$1(index, TokenType$1.String, 0, text);
- }
- function newNumberToken(index, n) {
- return new Token$1(index, TokenType$1.Number, n, '');
- }
- function newErrorToken(index, message) {
- return new Token$1(index, TokenType$1.Error, 0, message);
- }
- var EOF = new Token$1(-1, TokenType$1.Character, 0, '');
- var _Scanner = /** @class */ (function () {
- function _Scanner(input) {
- this.input = input;
- this.peek = 0;
- this.index = -1;
- this.length = input.length;
- this.advance();
- }
- _Scanner.prototype.advance = function () {
- this.peek = ++this.index >= this.length ? $EOF : this.input.charCodeAt(this.index);
- };
- _Scanner.prototype.scanToken = function () {
- var input = this.input, length = this.length;
- var peek = this.peek, index = this.index;
- // Skip whitespace.
- while (peek <= $SPACE) {
- if (++index >= length) {
- peek = $EOF;
- break;
- }
- else {
- peek = input.charCodeAt(index);
- }
- }
- this.peek = peek;
- this.index = index;
- if (index >= length) {
- return null;
- }
- // Handle identifiers and numbers.
- if (isIdentifierStart(peek))
- return this.scanIdentifier();
- if (isDigit(peek))
- return this.scanNumber(index);
- var start = index;
- switch (peek) {
- case $PERIOD:
- this.advance();
- return isDigit(this.peek) ? this.scanNumber(start) :
- newCharacterToken(start, $PERIOD);
- case $LPAREN:
- case $RPAREN:
- case $LBRACE:
- case $RBRACE:
- case $LBRACKET:
- case $RBRACKET:
- case $COMMA:
- case $COLON:
- case $SEMICOLON:
- return this.scanCharacter(start, peek);
- case $SQ:
- case $DQ:
- return this.scanString();
- case $HASH:
- case $PLUS:
- case $MINUS:
- case $STAR:
- case $SLASH:
- case $PERCENT:
- case $CARET:
- return this.scanOperator(start, String.fromCharCode(peek));
- case $QUESTION:
- return this.scanComplexOperator(start, '?', $PERIOD, '.');
- case $LT:
- case $GT:
- return this.scanComplexOperator(start, String.fromCharCode(peek), $EQ, '=');
- case $BANG:
- case $EQ:
- return this.scanComplexOperator(start, String.fromCharCode(peek), $EQ, '=', $EQ, '=');
- case $AMPERSAND:
- return this.scanComplexOperator(start, '&', $AMPERSAND, '&');
- case $BAR:
- return this.scanComplexOperator(start, '|', $BAR, '|');
- case $NBSP:
- while (isWhitespace(this.peek))
- this.advance();
- return this.scanToken();
- }
- this.advance();
- return this.error("Unexpected character [" + String.fromCharCode(peek) + "]", 0);
- };
- _Scanner.prototype.scanCharacter = function (start, code) {
- this.advance();
- return newCharacterToken(start, code);
- };
- _Scanner.prototype.scanOperator = function (start, str) {
- this.advance();
- return newOperatorToken(start, str);
- };
- /**
- * Tokenize a 2/3 char long operator
- *
- * @param start start index in the expression
- * @param one first symbol (always part of the operator)
- * @param twoCode code point for the second symbol
- * @param two second symbol (part of the operator when the second code point matches)
- * @param threeCode code point for the third symbol
- * @param three third symbol (part of the operator when provided and matches source expression)
- */
- _Scanner.prototype.scanComplexOperator = function (start, one, twoCode, two, threeCode, three) {
- this.advance();
- var str = one;
- if (this.peek == twoCode) {
- this.advance();
- str += two;
- }
- if (threeCode != null && this.peek == threeCode) {
- this.advance();
- str += three;
- }
- return newOperatorToken(start, str);
- };
- _Scanner.prototype.scanIdentifier = function () {
- var start = this.index;
- this.advance();
- while (isIdentifierPart(this.peek))
- this.advance();
- var str = this.input.substring(start, this.index);
- return KEYWORDS.indexOf(str) > -1 ? newKeywordToken(start, str) :
- newIdentifierToken(start, str);
- };
- _Scanner.prototype.scanNumber = function (start) {
- var simple = (this.index === start);
- this.advance(); // Skip initial digit.
- while (true) {
- if (isDigit(this.peek)) ;
- else if (this.peek == $PERIOD) {
- simple = false;
- }
- else if (isExponentStart(this.peek)) {
- this.advance();
- if (isExponentSign(this.peek))
- this.advance();
- if (!isDigit(this.peek))
- return this.error('Invalid exponent', -1);
- simple = false;
- }
- else {
- break;
- }
- this.advance();
- }
- var str = this.input.substring(start, this.index);
- var value = simple ? parseIntAutoRadix(str) : parseFloat(str);
- return newNumberToken(start, value);
- };
- _Scanner.prototype.scanString = function () {
- var start = this.index;
- var quote = this.peek;
- this.advance(); // Skip initial quote.
- var buffer = '';
- var marker = this.index;
- var input = this.input;
- while (this.peek != quote) {
- if (this.peek == $BACKSLASH) {
- buffer += input.substring(marker, this.index);
- this.advance();
- var unescapedCode = void 0;
- // Workaround for TS2.1-introduced type strictness
- this.peek = this.peek;
- if (this.peek == $u) {
- // 4 character hex code for unicode character.
- var hex = input.substring(this.index + 1, this.index + 5);
- if (/^[0-9a-f]+$/i.test(hex)) {
- unescapedCode = parseInt(hex, 16);
- }
- else {
- return this.error("Invalid unicode escape [\\u" + hex + "]", 0);
- }
- for (var i = 0; i < 5; i++) {
- this.advance();
- }
- }
- else {
- unescapedCode = unescape(this.peek);
- this.advance();
- }
- buffer += String.fromCharCode(unescapedCode);
- marker = this.index;
- }
- else if (this.peek == $EOF) {
- return this.error('Unterminated quote', 0);
- }
- else {
- this.advance();
- }
- }
- var last = input.substring(marker, this.index);
- this.advance(); // Skip terminating quote.
- return newStringToken(start, buffer + last);
- };
- _Scanner.prototype.error = function (message, offset) {
- var position = this.index + offset;
- return newErrorToken(position, "Lexer Error: " + message + " at column " + position + " in expression [" + this.input + "]");
- };
- return _Scanner;
- }());
- function isIdentifierStart(code) {
- return ($a <= code && code <= $z) || ($A <= code && code <= $Z) ||
- (code == $_) || (code == $$);
- }
- function isIdentifier(input) {
- if (input.length == 0)
- return false;
- var scanner = new _Scanner(input);
- if (!isIdentifierStart(scanner.peek))
- return false;
- scanner.advance();
- while (scanner.peek !== $EOF) {
- if (!isIdentifierPart(scanner.peek))
- return false;
- scanner.advance();
- }
- return true;
- }
- function isIdentifierPart(code) {
- return isAsciiLetter(code) || isDigit(code) || (code == $_) ||
- (code == $$);
- }
- function isExponentStart(code) {
- return code == $e || code == $E;
- }
- function isExponentSign(code) {
- return code == $MINUS || code == $PLUS;
- }
- function isQuote(code) {
- return code === $SQ || code === $DQ || code === $BT;
- }
- function unescape(code) {
- switch (code) {
- case $n:
- return $LF;
- case $f:
- return $FF;
- case $r:
- return $CR;
- case $t:
- return $TAB;
- case $v:
- return $VTAB;
- default:
- return code;
- }
- }
- function parseIntAutoRadix(text) {
- var result = parseInt(text);
- if (isNaN(result)) {
- throw new Error('Invalid integer literal when parsing ' + text);
- }
- return result;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var SplitInterpolation = /** @class */ (function () {
- function SplitInterpolation(strings, expressions, offsets) {
- this.strings = strings;
- this.expressions = expressions;
- this.offsets = offsets;
- }
- return SplitInterpolation;
- }());
- var TemplateBindingParseResult = /** @class */ (function () {
- function TemplateBindingParseResult(templateBindings, warnings, errors) {
- this.templateBindings = templateBindings;
- this.warnings = warnings;
- this.errors = errors;
- }
- return TemplateBindingParseResult;
- }());
- function _createInterpolateRegExp(config) {
- var pattern = escapeRegExp(config.start) + '([\\s\\S]*?)' + escapeRegExp(config.end);
- return new RegExp(pattern, 'g');
- }
- var Parser$1 = /** @class */ (function () {
- function Parser(_lexer) {
- this._lexer = _lexer;
- this.errors = [];
- }
- Parser.prototype.parseAction = function (input, location, interpolationConfig) {
- if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }
- this._checkNoInterpolation(input, location, interpolationConfig);
- var sourceToLex = this._stripComments(input);
- var tokens = this._lexer.tokenize(this._stripComments(input));
- var ast = new _ParseAST(input, location, tokens, sourceToLex.length, true, this.errors, input.length - sourceToLex.length)
- .parseChain();
- return new ASTWithSource(ast, input, location, this.errors);
- };
- Parser.prototype.parseBinding = function (input, location, interpolationConfig) {
- if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }
- var ast = this._parseBindingAst(input, location, interpolationConfig);
- return new ASTWithSource(ast, input, location, this.errors);
- };
- Parser.prototype.parseSimpleBinding = function (input, location, interpolationConfig) {
- if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }
- var ast = this._parseBindingAst(input, location, interpolationConfig);
- var errors = SimpleExpressionChecker.check(ast);
- if (errors.length > 0) {
- this._reportError("Host binding expression cannot contain " + errors.join(' '), input, location);
- }
- return new ASTWithSource(ast, input, location, this.errors);
- };
- Parser.prototype._reportError = function (message, input, errLocation, ctxLocation) {
- this.errors.push(new ParserError(message, input, errLocation, ctxLocation));
- };
- Parser.prototype._parseBindingAst = function (input, location, interpolationConfig) {
- // Quotes expressions use 3rd-party expression language. We don't want to use
- // our lexer or parser for that, so we check for that ahead of time.
- var quote = this._parseQuote(input, location);
- if (quote != null) {
- return quote;
- }
- this._checkNoInterpolation(input, location, interpolationConfig);
- var sourceToLex = this._stripComments(input);
- var tokens = this._lexer.tokenize(sourceToLex);
- return new _ParseAST(input, location, tokens, sourceToLex.length, false, this.errors, input.length - sourceToLex.length)
- .parseChain();
- };
- Parser.prototype._parseQuote = function (input, location) {
- if (input == null)
- return null;
- var prefixSeparatorIndex = input.indexOf(':');
- if (prefixSeparatorIndex == -1)
- return null;
- var prefix = input.substring(0, prefixSeparatorIndex).trim();
- if (!isIdentifier(prefix))
- return null;
- var uninterpretedExpression = input.substring(prefixSeparatorIndex + 1);
- return new Quote(new ParseSpan(0, input.length), prefix, uninterpretedExpression, location);
- };
- Parser.prototype.parseTemplateBindings = function (tplKey, tplValue, location) {
- var tokens = this._lexer.tokenize(tplValue);
- return new _ParseAST(tplValue, location, tokens, tplValue.length, false, this.errors, 0)
- .parseTemplateBindings(tplKey);
- };
- Parser.prototype.parseInterpolation = function (input, location, interpolationConfig) {
- if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }
- var split = this.splitInterpolation(input, location, interpolationConfig);
- if (split == null)
- return null;
- var expressions = [];
- for (var i = 0; i < split.expressions.length; ++i) {
- var expressionText = split.expressions[i];
- var sourceToLex = this._stripComments(expressionText);
- var tokens = this._lexer.tokenize(sourceToLex);
- var ast = new _ParseAST(input, location, tokens, sourceToLex.length, false, this.errors, split.offsets[i] + (expressionText.length - sourceToLex.length))
- .parseChain();
- expressions.push(ast);
- }
- return new ASTWithSource(new Interpolation(new ParseSpan(0, input == null ? 0 : input.length), split.strings, expressions), input, location, this.errors);
- };
- Parser.prototype.splitInterpolation = function (input, location, interpolationConfig) {
- if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }
- var regexp = _createInterpolateRegExp(interpolationConfig);
- var parts = input.split(regexp);
- if (parts.length <= 1) {
- return null;
- }
- var strings = [];
- var expressions = [];
- var offsets = [];
- var offset = 0;
- for (var i = 0; i < parts.length; i++) {
- var part = parts[i];
- if (i % 2 === 0) {
- // fixed string
- strings.push(part);
- offset += part.length;
- }
- else if (part.trim().length > 0) {
- offset += interpolationConfig.start.length;
- expressions.push(part);
- offsets.push(offset);
- offset += part.length + interpolationConfig.end.length;
- }
- else {
- this._reportError('Blank expressions are not allowed in interpolated strings', input, "at column " + this._findInterpolationErrorColumn(parts, i, interpolationConfig) + " in", location);
- expressions.push('$implict');
- offsets.push(offset);
- }
- }
- return new SplitInterpolation(strings, expressions, offsets);
- };
- Parser.prototype.wrapLiteralPrimitive = function (input, location) {
- return new ASTWithSource(new LiteralPrimitive(new ParseSpan(0, input == null ? 0 : input.length), input), input, location, this.errors);
- };
- Parser.prototype._stripComments = function (input) {
- var i = this._commentStart(input);
- return i != null ? input.substring(0, i).trim() : input;
- };
- Parser.prototype._commentStart = function (input) {
- var outerQuote = null;
- for (var i = 0; i < input.length - 1; i++) {
- var char = input.charCodeAt(i);
- var nextChar = input.charCodeAt(i + 1);
- if (char === $SLASH && nextChar == $SLASH && outerQuote == null)
- return i;
- if (outerQuote === char) {
- outerQuote = null;
- }
- else if (outerQuote == null && isQuote(char)) {
- outerQuote = char;
- }
- }
- return null;
- };
- Parser.prototype._checkNoInterpolation = function (input, location, interpolationConfig) {
- var regexp = _createInterpolateRegExp(interpolationConfig);
- var parts = input.split(regexp);
- if (parts.length > 1) {
- this._reportError("Got interpolation (" + interpolationConfig.start + interpolationConfig.end + ") where expression was expected", input, "at column " + this._findInterpolationErrorColumn(parts, 1, interpolationConfig) + " in", location);
- }
- };
- Parser.prototype._findInterpolationErrorColumn = function (parts, partInErrIdx, interpolationConfig) {
- var errLocation = '';
- for (var j = 0; j < partInErrIdx; j++) {
- errLocation += j % 2 === 0 ?
- parts[j] :
- "" + interpolationConfig.start + parts[j] + interpolationConfig.end;
- }
- return errLocation.length;
- };
- return Parser;
- }());
- var _ParseAST = /** @class */ (function () {
- function _ParseAST(input, location, tokens, inputLength, parseAction, errors, offset) {
- this.input = input;
- this.location = location;
- this.tokens = tokens;
- this.inputLength = inputLength;
- this.parseAction = parseAction;
- this.errors = errors;
- this.offset = offset;
- this.rparensExpected = 0;
- this.rbracketsExpected = 0;
- this.rbracesExpected = 0;
- this.index = 0;
- }
- _ParseAST.prototype.peek = function (offset) {
- var i = this.index + offset;
- return i < this.tokens.length ? this.tokens[i] : EOF;
- };
- Object.defineProperty(_ParseAST.prototype, "next", {
- get: function () { return this.peek(0); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(_ParseAST.prototype, "inputIndex", {
- get: function () {
- return (this.index < this.tokens.length) ? this.next.index + this.offset :
- this.inputLength + this.offset;
- },
- enumerable: true,
- configurable: true
- });
- _ParseAST.prototype.span = function (start) { return new ParseSpan(start, this.inputIndex); };
- _ParseAST.prototype.advance = function () { this.index++; };
- _ParseAST.prototype.optionalCharacter = function (code) {
- if (this.next.isCharacter(code)) {
- this.advance();
- return true;
- }
- else {
- return false;
- }
- };
- _ParseAST.prototype.peekKeywordLet = function () { return this.next.isKeywordLet(); };
- _ParseAST.prototype.peekKeywordAs = function () { return this.next.isKeywordAs(); };
- _ParseAST.prototype.expectCharacter = function (code) {
- if (this.optionalCharacter(code))
- return;
- this.error("Missing expected " + String.fromCharCode(code));
- };
- _ParseAST.prototype.optionalOperator = function (op) {
- if (this.next.isOperator(op)) {
- this.advance();
- return true;
- }
- else {
- return false;
- }
- };
- _ParseAST.prototype.expectOperator = function (operator) {
- if (this.optionalOperator(operator))
- return;
- this.error("Missing expected operator " + operator);
- };
- _ParseAST.prototype.expectIdentifierOrKeyword = function () {
- var n = this.next;
- if (!n.isIdentifier() && !n.isKeyword()) {
- this.error("Unexpected token " + n + ", expected identifier or keyword");
- return '';
- }
- this.advance();
- return n.toString();
- };
- _ParseAST.prototype.expectIdentifierOrKeywordOrString = function () {
- var n = this.next;
- if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) {
- this.error("Unexpected token " + n + ", expected identifier, keyword, or string");
- return '';
- }
- this.advance();
- return n.toString();
- };
- _ParseAST.prototype.parseChain = function () {
- var exprs = [];
- var start = this.inputIndex;
- while (this.index < this.tokens.length) {
- var expr = this.parsePipe();
- exprs.push(expr);
- if (this.optionalCharacter($SEMICOLON)) {
- if (!this.parseAction) {
- this.error('Binding expression cannot contain chained expression');
- }
- while (this.optionalCharacter($SEMICOLON)) {
- } // read all semicolons
- }
- else if (this.index < this.tokens.length) {
- this.error("Unexpected token '" + this.next + "'");
- }
- }
- if (exprs.length == 0)
- return new EmptyExpr(this.span(start));
- if (exprs.length == 1)
- return exprs[0];
- return new Chain(this.span(start), exprs);
- };
- _ParseAST.prototype.parsePipe = function () {
- var result = this.parseExpression();
- if (this.optionalOperator('|')) {
- if (this.parseAction) {
- this.error('Cannot have a pipe in an action expression');
- }
- do {
- var name_1 = this.expectIdentifierOrKeyword();
- var args = [];
- while (this.optionalCharacter($COLON)) {
- args.push(this.parseExpression());
- }
- result = new BindingPipe(this.span(result.span.start), result, name_1, args);
- } while (this.optionalOperator('|'));
- }
- return result;
- };
- _ParseAST.prototype.parseExpression = function () { return this.parseConditional(); };
- _ParseAST.prototype.parseConditional = function () {
- var start = this.inputIndex;
- var result = this.parseLogicalOr();
- if (this.optionalOperator('?')) {
- var yes = this.parsePipe();
- var no = void 0;
- if (!this.optionalCharacter($COLON)) {
- var end = this.inputIndex;
- var expression = this.input.substring(start, end);
- this.error("Conditional expression " + expression + " requires all 3 expressions");
- no = new EmptyExpr(this.span(start));
- }
- else {
- no = this.parsePipe();
- }
- return new Conditional(this.span(start), result, yes, no);
- }
- else {
- return result;
- }
- };
- _ParseAST.prototype.parseLogicalOr = function () {
- // '||'
- var result = this.parseLogicalAnd();
- while (this.optionalOperator('||')) {
- var right = this.parseLogicalAnd();
- result = new Binary(this.span(result.span.start), '||', result, right);
- }
- return result;
- };
- _ParseAST.prototype.parseLogicalAnd = function () {
- // '&&'
- var result = this.parseEquality();
- while (this.optionalOperator('&&')) {
- var right = this.parseEquality();
- result = new Binary(this.span(result.span.start), '&&', result, right);
- }
- return result;
- };
- _ParseAST.prototype.parseEquality = function () {
- // '==','!=','===','!=='
- var result = this.parseRelational();
- while (this.next.type == TokenType$1.Operator) {
- var operator = this.next.strValue;
- switch (operator) {
- case '==':
- case '===':
- case '!=':
- case '!==':
- this.advance();
- var right = this.parseRelational();
- result = new Binary(this.span(result.span.start), operator, result, right);
- continue;
- }
- break;
- }
- return result;
- };
- _ParseAST.prototype.parseRelational = function () {
- // '<', '>', '<=', '>='
- var result = this.parseAdditive();
- while (this.next.type == TokenType$1.Operator) {
- var operator = this.next.strValue;
- switch (operator) {
- case '<':
- case '>':
- case '<=':
- case '>=':
- this.advance();
- var right = this.parseAdditive();
- result = new Binary(this.span(result.span.start), operator, result, right);
- continue;
- }
- break;
- }
- return result;
- };
- _ParseAST.prototype.parseAdditive = function () {
- // '+', '-'
- var result = this.parseMultiplicative();
- while (this.next.type == TokenType$1.Operator) {
- var operator = this.next.strValue;
- switch (operator) {
- case '+':
- case '-':
- this.advance();
- var right = this.parseMultiplicative();
- result = new Binary(this.span(result.span.start), operator, result, right);
- continue;
- }
- break;
- }
- return result;
- };
- _ParseAST.prototype.parseMultiplicative = function () {
- // '*', '%', '/'
- var result = this.parsePrefix();
- while (this.next.type == TokenType$1.Operator) {
- var operator = this.next.strValue;
- switch (operator) {
- case '*':
- case '%':
- case '/':
- this.advance();
- var right = this.parsePrefix();
- result = new Binary(this.span(result.span.start), operator, result, right);
- continue;
- }
- break;
- }
- return result;
- };
- _ParseAST.prototype.parsePrefix = function () {
- if (this.next.type == TokenType$1.Operator) {
- var start = this.inputIndex;
- var operator = this.next.strValue;
- var result = void 0;
- switch (operator) {
- case '+':
- this.advance();
- result = this.parsePrefix();
- return new Binary(this.span(start), '-', result, new LiteralPrimitive(new ParseSpan(start, start), 0));
- case '-':
- this.advance();
- result = this.parsePrefix();
- return new Binary(this.span(start), operator, new LiteralPrimitive(new ParseSpan(start, start), 0), result);
- case '!':
- this.advance();
- result = this.parsePrefix();
- return new PrefixNot(this.span(start), result);
- }
- }
- return this.parseCallChain();
- };
- _ParseAST.prototype.parseCallChain = function () {
- var result = this.parsePrimary();
- while (true) {
- if (this.optionalCharacter($PERIOD)) {
- result = this.parseAccessMemberOrMethodCall(result, false);
- }
- else if (this.optionalOperator('?.')) {
- result = this.parseAccessMemberOrMethodCall(result, true);
- }
- else if (this.optionalCharacter($LBRACKET)) {
- this.rbracketsExpected++;
- var key = this.parsePipe();
- this.rbracketsExpected--;
- this.expectCharacter($RBRACKET);
- if (this.optionalOperator('=')) {
- var value = this.parseConditional();
- result = new KeyedWrite(this.span(result.span.start), result, key, value);
- }
- else {
- result = new KeyedRead(this.span(result.span.start), result, key);
- }
- }
- else if (this.optionalCharacter($LPAREN)) {
- this.rparensExpected++;
- var args = this.parseCallArguments();
- this.rparensExpected--;
- this.expectCharacter($RPAREN);
- result = new FunctionCall(this.span(result.span.start), result, args);
- }
- else if (this.optionalOperator('!')) {
- result = new NonNullAssert(this.span(result.span.start), result);
- }
- else {
- return result;
- }
- }
- };
- _ParseAST.prototype.parsePrimary = function () {
- var start = this.inputIndex;
- if (this.optionalCharacter($LPAREN)) {
- this.rparensExpected++;
- var result = this.parsePipe();
- this.rparensExpected--;
- this.expectCharacter($RPAREN);
- return result;
- }
- else if (this.next.isKeywordNull()) {
- this.advance();
- return new LiteralPrimitive(this.span(start), null);
- }
- else if (this.next.isKeywordUndefined()) {
- this.advance();
- return new LiteralPrimitive(this.span(start), void 0);
- }
- else if (this.next.isKeywordTrue()) {
- this.advance();
- return new LiteralPrimitive(this.span(start), true);
- }
- else if (this.next.isKeywordFalse()) {
- this.advance();
- return new LiteralPrimitive(this.span(start), false);
- }
- else if (this.next.isKeywordThis()) {
- this.advance();
- return new ImplicitReceiver(this.span(start));
- }
- else if (this.optionalCharacter($LBRACKET)) {
- this.rbracketsExpected++;
- var elements = this.parseExpressionList($RBRACKET);
- this.rbracketsExpected--;
- this.expectCharacter($RBRACKET);
- return new LiteralArray(this.span(start), elements);
- }
- else if (this.next.isCharacter($LBRACE)) {
- return this.parseLiteralMap();
- }
- else if (this.next.isIdentifier()) {
- return this.parseAccessMemberOrMethodCall(new ImplicitReceiver(this.span(start)), false);
- }
- else if (this.next.isNumber()) {
- var value = this.next.toNumber();
- this.advance();
- return new LiteralPrimitive(this.span(start), value);
- }
- else if (this.next.isString()) {
- var literalValue = this.next.toString();
- this.advance();
- return new LiteralPrimitive(this.span(start), literalValue);
- }
- else if (this.index >= this.tokens.length) {
- this.error("Unexpected end of expression: " + this.input);
- return new EmptyExpr(this.span(start));
- }
- else {
- this.error("Unexpected token " + this.next);
- return new EmptyExpr(this.span(start));
- }
- };
- _ParseAST.prototype.parseExpressionList = function (terminator) {
- var result = [];
- if (!this.next.isCharacter(terminator)) {
- do {
- result.push(this.parsePipe());
- } while (this.optionalCharacter($COMMA));
- }
- return result;
- };
- _ParseAST.prototype.parseLiteralMap = function () {
- var keys = [];
- var values = [];
- var start = this.inputIndex;
- this.expectCharacter($LBRACE);
- if (!this.optionalCharacter($RBRACE)) {
- this.rbracesExpected++;
- do {
- var quoted = this.next.isString();
- var key = this.expectIdentifierOrKeywordOrString();
- keys.push({ key: key, quoted: quoted });
- this.expectCharacter($COLON);
- values.push(this.parsePipe());
- } while (this.optionalCharacter($COMMA));
- this.rbracesExpected--;
- this.expectCharacter($RBRACE);
- }
- return new LiteralMap(this.span(start), keys, values);
- };
- _ParseAST.prototype.parseAccessMemberOrMethodCall = function (receiver, isSafe) {
- if (isSafe === void 0) { isSafe = false; }
- var start = receiver.span.start;
- var id = this.expectIdentifierOrKeyword();
- if (this.optionalCharacter($LPAREN)) {
- this.rparensExpected++;
- var args = this.parseCallArguments();
- this.expectCharacter($RPAREN);
- this.rparensExpected--;
- var span = this.span(start);
- return isSafe ? new SafeMethodCall(span, receiver, id, args) :
- new MethodCall(span, receiver, id, args);
- }
- else {
- if (isSafe) {
- if (this.optionalOperator('=')) {
- this.error('The \'?.\' operator cannot be used in the assignment');
- return new EmptyExpr(this.span(start));
- }
- else {
- return new SafePropertyRead(this.span(start), receiver, id);
- }
- }
- else {
- if (this.optionalOperator('=')) {
- if (!this.parseAction) {
- this.error('Bindings cannot contain assignments');
- return new EmptyExpr(this.span(start));
- }
- var value = this.parseConditional();
- return new PropertyWrite(this.span(start), receiver, id, value);
- }
- else {
- return new PropertyRead(this.span(start), receiver, id);
- }
- }
- }
- };
- _ParseAST.prototype.parseCallArguments = function () {
- if (this.next.isCharacter($RPAREN))
- return [];
- var positionals = [];
- do {
- positionals.push(this.parsePipe());
- } while (this.optionalCharacter($COMMA));
- return positionals;
- };
- /**
- * An identifier, a keyword, a string with an optional `-` in between.
- */
- _ParseAST.prototype.expectTemplateBindingKey = function () {
- var result = '';
- var operatorFound = false;
- do {
- result += this.expectIdentifierOrKeywordOrString();
- operatorFound = this.optionalOperator('-');
- if (operatorFound) {
- result += '-';
- }
- } while (operatorFound);
- return result.toString();
- };
- // Parses the AST for `<some-tag *tplKey=AST>`
- _ParseAST.prototype.parseTemplateBindings = function (tplKey) {
- var firstBinding = true;
- var bindings = [];
- var warnings = [];
- do {
- var start = this.inputIndex;
- var rawKey = void 0;
- var key = void 0;
- var isVar = false;
- if (firstBinding) {
- rawKey = key = tplKey;
- firstBinding = false;
- }
- else {
- isVar = this.peekKeywordLet();
- if (isVar)
- this.advance();
- rawKey = this.expectTemplateBindingKey();
- key = isVar ? rawKey : tplKey + rawKey[0].toUpperCase() + rawKey.substring(1);
- this.optionalCharacter($COLON);
- }
- var name_2 = null;
- var expression = null;
- if (isVar) {
- if (this.optionalOperator('=')) {
- name_2 = this.expectTemplateBindingKey();
- }
- else {
- name_2 = '\$implicit';
- }
- }
- else if (this.peekKeywordAs()) {
- this.advance(); // consume `as`
- name_2 = rawKey;
- key = this.expectTemplateBindingKey(); // read local var name
- isVar = true;
- }
- else if (this.next !== EOF && !this.peekKeywordLet()) {
- var start_1 = this.inputIndex;
- var ast = this.parsePipe();
- var source = this.input.substring(start_1 - this.offset, this.inputIndex - this.offset);
- expression = new ASTWithSource(ast, source, this.location, this.errors);
- }
- bindings.push(new TemplateBinding(this.span(start), key, isVar, name_2, expression));
- if (this.peekKeywordAs() && !isVar) {
- var letStart = this.inputIndex;
- this.advance(); // consume `as`
- var letName = this.expectTemplateBindingKey(); // read local var name
- bindings.push(new TemplateBinding(this.span(letStart), letName, true, key, null));
- }
- if (!this.optionalCharacter($SEMICOLON)) {
- this.optionalCharacter($COMMA);
- }
- } while (this.index < this.tokens.length);
- return new TemplateBindingParseResult(bindings, warnings, this.errors);
- };
- _ParseAST.prototype.error = function (message, index) {
- if (index === void 0) { index = null; }
- this.errors.push(new ParserError(message, this.input, this.locationText(index), this.location));
- this.skip();
- };
- _ParseAST.prototype.locationText = function (index) {
- if (index === void 0) { index = null; }
- if (index == null)
- index = this.index;
- return (index < this.tokens.length) ? "at column " + (this.tokens[index].index + 1) + " in" :
- "at the end of the expression";
- };
- // Error recovery should skip tokens until it encounters a recovery point. skip() treats
- // the end of input and a ';' as unconditionally a recovery point. It also treats ')',
- // '}' and ']' as conditional recovery points if one of calling productions is expecting
- // one of these symbols. This allows skip() to recover from errors such as '(a.) + 1' allowing
- // more of the AST to be retained (it doesn't skip any tokens as the ')' is retained because
- // of the '(' begins an '(' <expr> ')' production). The recovery points of grouping symbols
- // must be conditional as they must be skipped if none of the calling productions are not
- // expecting the closing token else we will never make progress in the case of an
- // extraneous group closing symbol (such as a stray ')'). This is not the case for ';' because
- // parseChain() is always the root production and it expects a ';'.
- // If a production expects one of these token it increments the corresponding nesting count,
- // and then decrements it just prior to checking if the token is in the input.
- _ParseAST.prototype.skip = function () {
- var n = this.next;
- while (this.index < this.tokens.length && !n.isCharacter($SEMICOLON) &&
- (this.rparensExpected <= 0 || !n.isCharacter($RPAREN)) &&
- (this.rbracesExpected <= 0 || !n.isCharacter($RBRACE)) &&
- (this.rbracketsExpected <= 0 || !n.isCharacter($RBRACKET))) {
- if (this.next.isError()) {
- this.errors.push(new ParserError(this.next.toString(), this.input, this.locationText(), this.location));
- }
- this.advance();
- n = this.next;
- }
- };
- return _ParseAST;
- }());
- var SimpleExpressionChecker = /** @class */ (function () {
- function SimpleExpressionChecker() {
- this.errors = [];
- }
- SimpleExpressionChecker.check = function (ast) {
- var s = new SimpleExpressionChecker();
- ast.visit(s);
- return s.errors;
- };
- SimpleExpressionChecker.prototype.visitImplicitReceiver = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitInterpolation = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitLiteralPrimitive = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitPropertyRead = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitPropertyWrite = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitSafePropertyRead = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitMethodCall = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitSafeMethodCall = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitFunctionCall = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitLiteralArray = function (ast, context) { this.visitAll(ast.expressions); };
- SimpleExpressionChecker.prototype.visitLiteralMap = function (ast, context) { this.visitAll(ast.values); };
- SimpleExpressionChecker.prototype.visitBinary = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitPrefixNot = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitNonNullAssert = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitConditional = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitPipe = function (ast, context) { this.errors.push('pipes'); };
- SimpleExpressionChecker.prototype.visitKeyedRead = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitKeyedWrite = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitAll = function (asts) {
- var _this = this;
- return asts.map(function (node) { return node.visit(_this); });
- };
- SimpleExpressionChecker.prototype.visitChain = function (ast, context) { };
- SimpleExpressionChecker.prototype.visitQuote = function (ast, context) { };
- return SimpleExpressionChecker;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // =================================================================================================
- // =================================================================================================
- // =========== S T O P - S T O P - S T O P - S T O P - S T O P - S T O P ===========
- // =================================================================================================
- // =================================================================================================
- //
- // DO NOT EDIT THIS LIST OF SECURITY SENSITIVE PROPERTIES WITHOUT A SECURITY REVIEW!
- // Reach out to mprobst for details.
- //
- // =================================================================================================
- /** Map from tagName|propertyName SecurityContext. Properties applying to all tags use '*'. */
- var _SECURITY_SCHEMA;
- function SECURITY_SCHEMA() {
- if (!_SECURITY_SCHEMA) {
- _SECURITY_SCHEMA = {};
- // Case is insignificant below, all element and attribute names are lower-cased for lookup.
- registerContext(SecurityContext.HTML, [
- 'iframe|srcdoc',
- '*|innerHTML',
- '*|outerHTML',
- ]);
- registerContext(SecurityContext.STYLE, ['*|style']);
- // NB: no SCRIPT contexts here, they are never allowed due to the parser stripping them.
- registerContext(SecurityContext.URL, [
- '*|formAction', 'area|href', 'area|ping', 'audio|src', 'a|href',
- 'a|ping', 'blockquote|cite', 'body|background', 'del|cite', 'form|action',
- 'img|src', 'img|srcset', 'input|src', 'ins|cite', 'q|cite',
- 'source|src', 'source|srcset', 'track|src', 'video|poster', 'video|src',
- ]);
- registerContext(SecurityContext.RESOURCE_URL, [
- 'applet|code',
- 'applet|codebase',
- 'base|href',
- 'embed|src',
- 'frame|src',
- 'head|profile',
- 'html|manifest',
- 'iframe|src',
- 'link|href',
- 'media|src',
- 'object|codebase',
- 'object|data',
- 'script|src',
- ]);
- }
- return _SECURITY_SCHEMA;
- }
- function registerContext(ctx, specs) {
- var e_1, _a;
- try {
- for (var specs_1 = __values(specs), specs_1_1 = specs_1.next(); !specs_1_1.done; specs_1_1 = specs_1.next()) {
- var spec = specs_1_1.value;
- _SECURITY_SCHEMA[spec.toLowerCase()] = ctx;
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (specs_1_1 && !specs_1_1.done && (_a = specs_1.return)) _a.call(specs_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ElementSchemaRegistry = /** @class */ (function () {
- function ElementSchemaRegistry() {
- }
- return ElementSchemaRegistry;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var BOOLEAN = 'boolean';
- var NUMBER = 'number';
- var STRING = 'string';
- var OBJECT = 'object';
- /**
- * This array represents the DOM schema. It encodes inheritance, properties, and events.
- *
- * ## Overview
- *
- * Each line represents one kind of element. The `element_inheritance` and properties are joined
- * using `element_inheritance|properties` syntax.
- *
- * ## Element Inheritance
- *
- * The `element_inheritance` can be further subdivided as `element1,element2,...^parentElement`.
- * Here the individual elements are separated by `,` (commas). Every element in the list
- * has identical properties.
- *
- * An `element` may inherit additional properties from `parentElement` If no `^parentElement` is
- * specified then `""` (blank) element is assumed.
- *
- * NOTE: The blank element inherits from root `[Element]` element, the super element of all
- * elements.
- *
- * NOTE an element prefix such as `:svg:` has no special meaning to the schema.
- *
- * ## Properties
- *
- * Each element has a set of properties separated by `,` (commas). Each property can be prefixed
- * by a special character designating its type:
- *
- * - (no prefix): property is a string.
- * - `*`: property represents an event.
- * - `!`: property is a boolean.
- * - `#`: property is a number.
- * - `%`: property is an object.
- *
- * ## Query
- *
- * The class creates an internal squas representation which allows to easily answer the query of
- * if a given property exist on a given element.
- *
- * NOTE: We don't yet support querying for types or events.
- * NOTE: This schema is auto extracted from `schema_extractor.ts` located in the test folder,
- * see dom_element_schema_registry_spec.ts
- */
- // =================================================================================================
- // =================================================================================================
- // =========== S T O P - S T O P - S T O P - S T O P - S T O P - S T O P ===========
- // =================================================================================================
- // =================================================================================================
- //
- // DO NOT EDIT THIS DOM SCHEMA WITHOUT A SECURITY REVIEW!
- //
- // Newly added properties must be security reviewed and assigned an appropriate SecurityContext in
- // dom_security_schema.ts. Reach out to mprobst & rjamet for details.
- //
- // =================================================================================================
- var SCHEMA = [
- '[Element]|textContent,%classList,className,id,innerHTML,*beforecopy,*beforecut,*beforepaste,*copy,*cut,*paste,*search,*selectstart,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerHTML,#scrollLeft,#scrollTop,slot' +
- /* added manually to avoid breaking changes */
- ',*message,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored',
- '[HTMLElement]^[Element]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,outerText,!spellcheck,%style,#tabIndex,title,!translate',
- 'abbr,address,article,aside,b,bdi,bdo,cite,code,dd,dfn,dt,em,figcaption,figure,footer,header,i,kbd,main,mark,nav,noscript,rb,rp,rt,rtc,ruby,s,samp,section,small,strong,sub,sup,u,var,wbr^[HTMLElement]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,outerText,!spellcheck,%style,#tabIndex,title,!translate',
- 'media^[HTMLElement]|!autoplay,!controls,%controlsList,%crossOrigin,#currentTime,!defaultMuted,#defaultPlaybackRate,!disableRemotePlayback,!loop,!muted,*encrypted,*waitingforkey,#playbackRate,preload,src,%srcObject,#volume',
- ':svg:^[HTMLElement]|*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,%style,#tabIndex',
- ':svg:graphics^:svg:|',
- ':svg:animation^:svg:|*begin,*end,*repeat',
- ':svg:geometry^:svg:|',
- ':svg:componentTransferFunction^:svg:|',
- ':svg:gradient^:svg:|',
- ':svg:textContent^:svg:graphics|',
- ':svg:textPositioning^:svg:textContent|',
- 'a^[HTMLElement]|charset,coords,download,hash,host,hostname,href,hreflang,name,password,pathname,ping,port,protocol,referrerPolicy,rel,rev,search,shape,target,text,type,username',
- 'area^[HTMLElement]|alt,coords,download,hash,host,hostname,href,!noHref,password,pathname,ping,port,protocol,referrerPolicy,rel,search,shape,target,username',
- 'audio^media|',
- 'br^[HTMLElement]|clear',
- 'base^[HTMLElement]|href,target',
- 'body^[HTMLElement]|aLink,background,bgColor,link,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,text,vLink',
- 'button^[HTMLElement]|!autofocus,!disabled,formAction,formEnctype,formMethod,!formNoValidate,formTarget,name,type,value',
- 'canvas^[HTMLElement]|#height,#width',
- 'content^[HTMLElement]|select',
- 'dl^[HTMLElement]|!compact',
- 'datalist^[HTMLElement]|',
- 'details^[HTMLElement]|!open',
- 'dialog^[HTMLElement]|!open,returnValue',
- 'dir^[HTMLElement]|!compact',
- 'div^[HTMLElement]|align',
- 'embed^[HTMLElement]|align,height,name,src,type,width',
- 'fieldset^[HTMLElement]|!disabled,name',
- 'font^[HTMLElement]|color,face,size',
- 'form^[HTMLElement]|acceptCharset,action,autocomplete,encoding,enctype,method,name,!noValidate,target',
- 'frame^[HTMLElement]|frameBorder,longDesc,marginHeight,marginWidth,name,!noResize,scrolling,src',
- 'frameset^[HTMLElement]|cols,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,rows',
- 'hr^[HTMLElement]|align,color,!noShade,size,width',
- 'head^[HTMLElement]|',
- 'h1,h2,h3,h4,h5,h6^[HTMLElement]|align',
- 'html^[HTMLElement]|version',
- 'iframe^[HTMLElement]|align,!allowFullscreen,frameBorder,height,longDesc,marginHeight,marginWidth,name,referrerPolicy,%sandbox,scrolling,src,srcdoc,width',
- 'img^[HTMLElement]|align,alt,border,%crossOrigin,#height,#hspace,!isMap,longDesc,lowsrc,name,referrerPolicy,sizes,src,srcset,useMap,#vspace,#width',
- 'input^[HTMLElement]|accept,align,alt,autocapitalize,autocomplete,!autofocus,!checked,!defaultChecked,defaultValue,dirName,!disabled,%files,formAction,formEnctype,formMethod,!formNoValidate,formTarget,#height,!incremental,!indeterminate,max,#maxLength,min,#minLength,!multiple,name,pattern,placeholder,!readOnly,!required,selectionDirection,#selectionEnd,#selectionStart,#size,src,step,type,useMap,value,%valueAsDate,#valueAsNumber,#width',
- 'li^[HTMLElement]|type,#value',
- 'label^[HTMLElement]|htmlFor',
- 'legend^[HTMLElement]|align',
- 'link^[HTMLElement]|as,charset,%crossOrigin,!disabled,href,hreflang,integrity,media,referrerPolicy,rel,%relList,rev,%sizes,target,type',
- 'map^[HTMLElement]|name',
- 'marquee^[HTMLElement]|behavior,bgColor,direction,height,#hspace,#loop,#scrollAmount,#scrollDelay,!trueSpeed,#vspace,width',
- 'menu^[HTMLElement]|!compact',
- 'meta^[HTMLElement]|content,httpEquiv,name,scheme',
- 'meter^[HTMLElement]|#high,#low,#max,#min,#optimum,#value',
- 'ins,del^[HTMLElement]|cite,dateTime',
- 'ol^[HTMLElement]|!compact,!reversed,#start,type',
- 'object^[HTMLElement]|align,archive,border,code,codeBase,codeType,data,!declare,height,#hspace,name,standby,type,useMap,#vspace,width',
- 'optgroup^[HTMLElement]|!disabled,label',
- 'option^[HTMLElement]|!defaultSelected,!disabled,label,!selected,text,value',
- 'output^[HTMLElement]|defaultValue,%htmlFor,name,value',
- 'p^[HTMLElement]|align',
- 'param^[HTMLElement]|name,type,value,valueType',
- 'picture^[HTMLElement]|',
- 'pre^[HTMLElement]|#width',
- 'progress^[HTMLElement]|#max,#value',
- 'q,blockquote,cite^[HTMLElement]|',
- 'script^[HTMLElement]|!async,charset,%crossOrigin,!defer,event,htmlFor,integrity,src,text,type',
- 'select^[HTMLElement]|!autofocus,!disabled,#length,!multiple,name,!required,#selectedIndex,#size,value',
- 'shadow^[HTMLElement]|',
- 'slot^[HTMLElement]|name',
- 'source^[HTMLElement]|media,sizes,src,srcset,type',
- 'span^[HTMLElement]|',
- 'style^[HTMLElement]|!disabled,media,type',
- 'caption^[HTMLElement]|align',
- 'th,td^[HTMLElement]|abbr,align,axis,bgColor,ch,chOff,#colSpan,headers,height,!noWrap,#rowSpan,scope,vAlign,width',
- 'col,colgroup^[HTMLElement]|align,ch,chOff,#span,vAlign,width',
- 'table^[HTMLElement]|align,bgColor,border,%caption,cellPadding,cellSpacing,frame,rules,summary,%tFoot,%tHead,width',
- 'tr^[HTMLElement]|align,bgColor,ch,chOff,vAlign',
- 'tfoot,thead,tbody^[HTMLElement]|align,ch,chOff,vAlign',
- 'template^[HTMLElement]|',
- 'textarea^[HTMLElement]|autocapitalize,!autofocus,#cols,defaultValue,dirName,!disabled,#maxLength,#minLength,name,placeholder,!readOnly,!required,#rows,selectionDirection,#selectionEnd,#selectionStart,value,wrap',
- 'title^[HTMLElement]|text',
- 'track^[HTMLElement]|!default,kind,label,src,srclang',
- 'ul^[HTMLElement]|!compact,type',
- 'unknown^[HTMLElement]|',
- 'video^media|#height,poster,#width',
- ':svg:a^:svg:graphics|',
- ':svg:animate^:svg:animation|',
- ':svg:animateMotion^:svg:animation|',
- ':svg:animateTransform^:svg:animation|',
- ':svg:circle^:svg:geometry|',
- ':svg:clipPath^:svg:graphics|',
- ':svg:defs^:svg:graphics|',
- ':svg:desc^:svg:|',
- ':svg:discard^:svg:|',
- ':svg:ellipse^:svg:geometry|',
- ':svg:feBlend^:svg:|',
- ':svg:feColorMatrix^:svg:|',
- ':svg:feComponentTransfer^:svg:|',
- ':svg:feComposite^:svg:|',
- ':svg:feConvolveMatrix^:svg:|',
- ':svg:feDiffuseLighting^:svg:|',
- ':svg:feDisplacementMap^:svg:|',
- ':svg:feDistantLight^:svg:|',
- ':svg:feDropShadow^:svg:|',
- ':svg:feFlood^:svg:|',
- ':svg:feFuncA^:svg:componentTransferFunction|',
- ':svg:feFuncB^:svg:componentTransferFunction|',
- ':svg:feFuncG^:svg:componentTransferFunction|',
- ':svg:feFuncR^:svg:componentTransferFunction|',
- ':svg:feGaussianBlur^:svg:|',
- ':svg:feImage^:svg:|',
- ':svg:feMerge^:svg:|',
- ':svg:feMergeNode^:svg:|',
- ':svg:feMorphology^:svg:|',
- ':svg:feOffset^:svg:|',
- ':svg:fePointLight^:svg:|',
- ':svg:feSpecularLighting^:svg:|',
- ':svg:feSpotLight^:svg:|',
- ':svg:feTile^:svg:|',
- ':svg:feTurbulence^:svg:|',
- ':svg:filter^:svg:|',
- ':svg:foreignObject^:svg:graphics|',
- ':svg:g^:svg:graphics|',
- ':svg:image^:svg:graphics|',
- ':svg:line^:svg:geometry|',
- ':svg:linearGradient^:svg:gradient|',
- ':svg:mpath^:svg:|',
- ':svg:marker^:svg:|',
- ':svg:mask^:svg:|',
- ':svg:metadata^:svg:|',
- ':svg:path^:svg:geometry|',
- ':svg:pattern^:svg:|',
- ':svg:polygon^:svg:geometry|',
- ':svg:polyline^:svg:geometry|',
- ':svg:radialGradient^:svg:gradient|',
- ':svg:rect^:svg:geometry|',
- ':svg:svg^:svg:graphics|#currentScale,#zoomAndPan',
- ':svg:script^:svg:|type',
- ':svg:set^:svg:animation|',
- ':svg:stop^:svg:|',
- ':svg:style^:svg:|!disabled,media,title,type',
- ':svg:switch^:svg:graphics|',
- ':svg:symbol^:svg:|',
- ':svg:tspan^:svg:textPositioning|',
- ':svg:text^:svg:textPositioning|',
- ':svg:textPath^:svg:textContent|',
- ':svg:title^:svg:|',
- ':svg:use^:svg:graphics|',
- ':svg:view^:svg:|#zoomAndPan',
- 'data^[HTMLElement]|value',
- 'keygen^[HTMLElement]|!autofocus,challenge,!disabled,form,keytype,name',
- 'menuitem^[HTMLElement]|type,label,icon,!disabled,!checked,radiogroup,!default',
- 'summary^[HTMLElement]|',
- 'time^[HTMLElement]|dateTime',
- ':svg:cursor^:svg:|',
- ];
- var _ATTR_TO_PROP = {
- 'class': 'className',
- 'for': 'htmlFor',
- 'formaction': 'formAction',
- 'innerHtml': 'innerHTML',
- 'readonly': 'readOnly',
- 'tabindex': 'tabIndex',
- };
- var DomElementSchemaRegistry = /** @class */ (function (_super) {
- __extends(DomElementSchemaRegistry, _super);
- function DomElementSchemaRegistry() {
- var _this = _super.call(this) || this;
- _this._schema = {};
- SCHEMA.forEach(function (encodedType) {
- var type = {};
- var _a = __read(encodedType.split('|'), 2), strType = _a[0], strProperties = _a[1];
- var properties = strProperties.split(',');
- var _b = __read(strType.split('^'), 2), typeNames = _b[0], superName = _b[1];
- typeNames.split(',').forEach(function (tag) { return _this._schema[tag.toLowerCase()] = type; });
- var superType = superName && _this._schema[superName.toLowerCase()];
- if (superType) {
- Object.keys(superType).forEach(function (prop) { type[prop] = superType[prop]; });
- }
- properties.forEach(function (property) {
- if (property.length > 0) {
- switch (property[0]) {
- case '*':
- // We don't yet support events.
- // If ever allowing to bind to events, GO THROUGH A SECURITY REVIEW, allowing events
- // will
- // almost certainly introduce bad XSS vulnerabilities.
- // type[property.substring(1)] = EVENT;
- break;
- case '!':
- type[property.substring(1)] = BOOLEAN;
- break;
- case '#':
- type[property.substring(1)] = NUMBER;
- break;
- case '%':
- type[property.substring(1)] = OBJECT;
- break;
- default:
- type[property] = STRING;
- }
- }
- });
- });
- return _this;
- }
- DomElementSchemaRegistry.prototype.hasProperty = function (tagName, propName, schemaMetas) {
- if (schemaMetas.some(function (schema) { return schema.name === NO_ERRORS_SCHEMA.name; })) {
- return true;
- }
- if (tagName.indexOf('-') > -1) {
- if (isNgContainer(tagName) || isNgContent(tagName)) {
- return false;
- }
- if (schemaMetas.some(function (schema) { return schema.name === CUSTOM_ELEMENTS_SCHEMA.name; })) {
- // Can't tell now as we don't know which properties a custom element will get
- // once it is instantiated
- return true;
- }
- }
- var elementProperties = this._schema[tagName.toLowerCase()] || this._schema['unknown'];
- return !!elementProperties[propName];
- };
- DomElementSchemaRegistry.prototype.hasElement = function (tagName, schemaMetas) {
- if (schemaMetas.some(function (schema) { return schema.name === NO_ERRORS_SCHEMA.name; })) {
- return true;
- }
- if (tagName.indexOf('-') > -1) {
- if (isNgContainer(tagName) || isNgContent(tagName)) {
- return true;
- }
- if (schemaMetas.some(function (schema) { return schema.name === CUSTOM_ELEMENTS_SCHEMA.name; })) {
- // Allow any custom elements
- return true;
- }
- }
- return !!this._schema[tagName.toLowerCase()];
- };
- /**
- * securityContext returns the security context for the given property on the given DOM tag.
- *
- * Tag and property name are statically known and cannot change at runtime, i.e. it is not
- * possible to bind a value into a changing attribute or tag name.
- *
- * The filtering is based on a list of allowed tags|attributes. All attributes in the schema
- * above are assumed to have the 'NONE' security context, i.e. that they are safe inert
- * string values. Only specific well known attack vectors are assigned their appropriate context.
- */
- DomElementSchemaRegistry.prototype.securityContext = function (tagName, propName, isAttribute) {
- if (isAttribute) {
- // NB: For security purposes, use the mapped property name, not the attribute name.
- propName = this.getMappedPropName(propName);
- }
- // Make sure comparisons are case insensitive, so that case differences between attribute and
- // property names do not have a security impact.
- tagName = tagName.toLowerCase();
- propName = propName.toLowerCase();
- var ctx = SECURITY_SCHEMA()[tagName + '|' + propName];
- if (ctx) {
- return ctx;
- }
- ctx = SECURITY_SCHEMA()['*|' + propName];
- return ctx ? ctx : SecurityContext.NONE;
- };
- DomElementSchemaRegistry.prototype.getMappedPropName = function (propName) { return _ATTR_TO_PROP[propName] || propName; };
- DomElementSchemaRegistry.prototype.getDefaultComponentElementName = function () { return 'ng-component'; };
- DomElementSchemaRegistry.prototype.validateProperty = function (name) {
- if (name.toLowerCase().startsWith('on')) {
- var msg = "Binding to event property '" + name + "' is disallowed for security reasons, " +
- ("please use (" + name.slice(2) + ")=...") +
- ("\nIf '" + name + "' is a directive input, make sure the directive is imported by the") +
- " current module.";
- return { error: true, msg: msg };
- }
- else {
- return { error: false };
- }
- };
- DomElementSchemaRegistry.prototype.validateAttribute = function (name) {
- if (name.toLowerCase().startsWith('on')) {
- var msg = "Binding to event attribute '" + name + "' is disallowed for security reasons, " +
- ("please use (" + name.slice(2) + ")=...");
- return { error: true, msg: msg };
- }
- else {
- return { error: false };
- }
- };
- DomElementSchemaRegistry.prototype.allKnownElementNames = function () { return Object.keys(this._schema); };
- DomElementSchemaRegistry.prototype.normalizeAnimationStyleProperty = function (propName) {
- return dashCaseToCamelCase(propName);
- };
- DomElementSchemaRegistry.prototype.normalizeAnimationStyleValue = function (camelCaseProp, userProvidedProp, val) {
- var unit = '';
- var strVal = val.toString().trim();
- var errorMsg = null;
- if (_isPixelDimensionStyle(camelCaseProp) && val !== 0 && val !== '0') {
- if (typeof val === 'number') {
- unit = 'px';
- }
- else {
- var valAndSuffixMatch = val.match(/^[+-]?[\d\.]+([a-z]*)$/);
- if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {
- errorMsg = "Please provide a CSS unit value for " + userProvidedProp + ":" + val;
- }
- }
- }
- return { error: errorMsg, value: strVal + unit };
- };
- return DomElementSchemaRegistry;
- }(ElementSchemaRegistry));
- function _isPixelDimensionStyle(prop) {
- switch (prop) {
- case 'width':
- case 'height':
- case 'minWidth':
- case 'minHeight':
- case 'maxWidth':
- case 'maxHeight':
- case 'left':
- case 'top':
- case 'bottom':
- case 'right':
- case 'fontSize':
- case 'outlineWidth':
- case 'outlineOffset':
- case 'paddingTop':
- case 'paddingLeft':
- case 'paddingBottom':
- case 'paddingRight':
- case 'marginTop':
- case 'marginLeft':
- case 'marginBottom':
- case 'marginRight':
- case 'borderRadius':
- case 'borderWidth':
- case 'borderTopWidth':
- case 'borderLeftWidth':
- case 'borderRightWidth':
- case 'borderBottomWidth':
- case 'textIndent':
- return true;
- default:
- return false;
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var BIND_NAME_REGEXP$1 = /^(?:(?:(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/;
- // Group 1 = "bind-"
- var KW_BIND_IDX$1 = 1;
- // Group 2 = "let-"
- var KW_LET_IDX$1 = 2;
- // Group 3 = "ref-/#"
- var KW_REF_IDX$1 = 3;
- // Group 4 = "on-"
- var KW_ON_IDX$1 = 4;
- // Group 5 = "bindon-"
- var KW_BINDON_IDX$1 = 5;
- // Group 6 = "@"
- var KW_AT_IDX$1 = 6;
- // Group 7 = the identifier after "bind-", "let-", "ref-/#", "on-", "bindon-" or "@"
- var IDENT_KW_IDX$1 = 7;
- // Group 8 = identifier inside [()]
- var IDENT_BANANA_BOX_IDX$1 = 8;
- // Group 9 = identifier inside []
- var IDENT_PROPERTY_IDX$1 = 9;
- // Group 10 = identifier inside ()
- var IDENT_EVENT_IDX$1 = 10;
- var TEMPLATE_ATTR_PREFIX$1 = '*';
- function htmlAstToRender3Ast(htmlNodes, bindingParser) {
- var transformer = new HtmlAstToIvyAst(bindingParser);
- var ivyNodes = visitAll$1(transformer, htmlNodes);
- // Errors might originate in either the binding parser or the html to ivy transformer
- var allErrors = bindingParser.errors.concat(transformer.errors);
- var errors = allErrors.filter(function (e) { return e.level === ParseErrorLevel.ERROR; });
- if (errors.length > 0) {
- var errorString = errors.join('\n');
- throw syntaxError("Template parse errors:\n" + errorString, errors);
- }
- return {
- nodes: ivyNodes,
- errors: allErrors,
- styleUrls: transformer.styleUrls,
- styles: transformer.styles,
- };
- }
- var HtmlAstToIvyAst = /** @class */ (function () {
- function HtmlAstToIvyAst(bindingParser) {
- this.bindingParser = bindingParser;
- this.errors = [];
- this.styles = [];
- this.styleUrls = [];
- }
- // HTML visitor
- HtmlAstToIvyAst.prototype.visitElement = function (element) {
- var _this = this;
- var e_1, _a;
- var preparsedElement = preparseElement(element);
- if (preparsedElement.type === PreparsedElementType.SCRIPT) {
- return null;
- }
- else if (preparsedElement.type === PreparsedElementType.STYLE) {
- var contents = textContents(element);
- if (contents !== null) {
- this.styles.push(contents);
- }
- return null;
- }
- else if (preparsedElement.type === PreparsedElementType.STYLESHEET &&
- isStyleUrlResolvable(preparsedElement.hrefAttr)) {
- this.styleUrls.push(preparsedElement.hrefAttr);
- return null;
- }
- // Whether the element is a `<ng-template>`
- var isTemplateElement = isNgTemplate(element.name);
- var parsedProperties = [];
- var boundEvents = [];
- var variables = [];
- var references = [];
- var attributes = [];
- var i18nAttrsMeta = {};
- var templateParsedProperties = [];
- var templateVariables = [];
- // Whether the element has any *-attribute
- var elementHasInlineTemplate = false;
- try {
- for (var _b = __values(element.attrs), _c = _b.next(); !_c.done; _c = _b.next()) {
- var attribute = _c.value;
- var hasBinding = false;
- var normalizedName = normalizeAttributeName(attribute.name);
- // `*attr` defines template bindings
- var isTemplateBinding = false;
- if (attribute.i18n) {
- i18nAttrsMeta[attribute.name] = attribute.i18n;
- }
- if (normalizedName.startsWith(TEMPLATE_ATTR_PREFIX$1)) {
- // *-attributes
- if (elementHasInlineTemplate) {
- this.reportError("Can't have multiple template bindings on one element. Use only one attribute prefixed with *", attribute.sourceSpan);
- }
- isTemplateBinding = true;
- elementHasInlineTemplate = true;
- var templateValue = attribute.value;
- var templateKey = normalizedName.substring(TEMPLATE_ATTR_PREFIX$1.length);
- var parsedVariables = [];
- this.bindingParser.parseInlineTemplateBinding(templateKey, templateValue, attribute.sourceSpan, [], templateParsedProperties, parsedVariables);
- templateVariables.push.apply(templateVariables, __spread(parsedVariables.map(function (v) { return new Variable(v.name, v.value, v.sourceSpan); })));
- }
- else {
- // Check for variables, events, property bindings, interpolation
- hasBinding = this.parseAttribute(isTemplateElement, attribute, [], parsedProperties, boundEvents, variables, references);
- }
- if (!hasBinding && !isTemplateBinding) {
- // don't include the bindings as attributes as well in the AST
- attributes.push(this.visitAttribute(attribute));
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- var children = visitAll$1(preparsedElement.nonBindable ? NON_BINDABLE_VISITOR$1 : this, element.children);
- var parsedElement;
- if (preparsedElement.type === PreparsedElementType.NG_CONTENT) {
- // `<ng-content>`
- if (element.children &&
- !element.children.every(function (node) { return isEmptyTextNode(node) || isCommentNode(node); })) {
- this.reportError("<ng-content> element cannot have content.", element.sourceSpan);
- }
- var selector = preparsedElement.selectAttr;
- var attrs = element.attrs.map(function (attr) { return _this.visitAttribute(attr); });
- parsedElement = new Content(selector, attrs, element.sourceSpan, element.i18n);
- }
- else if (isTemplateElement) {
- // `<ng-template>`
- var attrs = this.extractAttributes(element.name, parsedProperties, i18nAttrsMeta);
- parsedElement = new Template(element.name, attributes, attrs.bound, boundEvents, [ /* no template attributes */], children, references, variables, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
- }
- else {
- var attrs = this.extractAttributes(element.name, parsedProperties, i18nAttrsMeta);
- parsedElement = new Element(element.name, attributes, attrs.bound, boundEvents, children, references, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
- }
- if (elementHasInlineTemplate) {
- // If this node is an inline-template (e.g. has *ngFor) then we need to create a template
- // node that contains this node.
- // Moreover, if the node is an element, then we need to hoist its attributes to the template
- // node for matching against content projection selectors.
- var attrs = this.extractAttributes('ng-template', templateParsedProperties, i18nAttrsMeta);
- var templateAttrs_1 = [];
- attrs.literal.forEach(function (attr) { return templateAttrs_1.push(attr); });
- attrs.bound.forEach(function (attr) { return templateAttrs_1.push(attr); });
- var hoistedAttrs = parsedElement instanceof Element ?
- {
- attributes: parsedElement.attributes,
- inputs: parsedElement.inputs,
- outputs: parsedElement.outputs,
- } :
- { attributes: [], inputs: [], outputs: [] };
- // TODO(pk): test for this case
- parsedElement = new Template(parsedElement.name, hoistedAttrs.attributes, hoistedAttrs.inputs, hoistedAttrs.outputs, templateAttrs_1, [parsedElement], [ /* no references */], templateVariables, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n);
- }
- return parsedElement;
- };
- HtmlAstToIvyAst.prototype.visitAttribute = function (attribute) {
- return new TextAttribute(attribute.name, attribute.value, attribute.sourceSpan, attribute.valueSpan, attribute.i18n);
- };
- HtmlAstToIvyAst.prototype.visitText = function (text) {
- return this._visitTextWithInterpolation(text.value, text.sourceSpan, text.i18n);
- };
- HtmlAstToIvyAst.prototype.visitExpansion = function (expansion) {
- var _this = this;
- var meta = expansion.i18n;
- // do not generate Icu in case it was created
- // outside of i18n block in a template
- if (!meta) {
- return null;
- }
- var vars = {};
- var placeholders = {};
- // extract VARs from ICUs - we process them separately while
- // assembling resulting message via goog.getMsg function, since
- // we need to pass them to top-level goog.getMsg call
- Object.keys(meta.placeholders).forEach(function (key) {
- var value = meta.placeholders[key];
- if (key.startsWith(I18N_ICU_VAR_PREFIX)) {
- var config = _this.bindingParser.interpolationConfig;
- // ICU expression is a plain string, not wrapped into start
- // and end tags, so we wrap it before passing to binding parser
- var wrapped = "" + config.start + value + config.end;
- vars[key] = _this._visitTextWithInterpolation(wrapped, expansion.sourceSpan);
- }
- else {
- placeholders[key] = _this._visitTextWithInterpolation(value, expansion.sourceSpan);
- }
- });
- return new Icu(vars, placeholders, expansion.sourceSpan, meta);
- };
- HtmlAstToIvyAst.prototype.visitExpansionCase = function (expansionCase) { return null; };
- HtmlAstToIvyAst.prototype.visitComment = function (comment) { return null; };
- // convert view engine `ParsedProperty` to a format suitable for IVY
- HtmlAstToIvyAst.prototype.extractAttributes = function (elementName, properties, i18nPropsMeta) {
- var _this = this;
- var bound = [];
- var literal = [];
- properties.forEach(function (prop) {
- var i18n = i18nPropsMeta[prop.name];
- if (prop.isLiteral) {
- literal.push(new TextAttribute(prop.name, prop.expression.source || '', prop.sourceSpan, undefined, i18n));
- }
- else {
- // Note that validation is skipped and property mapping is disabled
- // due to the fact that we need to make sure a given prop is not an
- // input of a directive and directive matching happens at runtime.
- var bep = _this.bindingParser.createBoundElementProperty(elementName, prop, /* skipValidation */ true, /* mapPropertyName */ false);
- bound.push(BoundAttribute.fromBoundElementProperty(bep, i18n));
- }
- });
- return { bound: bound, literal: literal };
- };
- HtmlAstToIvyAst.prototype.parseAttribute = function (isTemplateElement, attribute, matchableAttributes, parsedProperties, boundEvents, variables, references) {
- var name = normalizeAttributeName(attribute.name);
- var value = attribute.value;
- var srcSpan = attribute.sourceSpan;
- var bindParts = name.match(BIND_NAME_REGEXP$1);
- var hasBinding = false;
- if (bindParts) {
- hasBinding = true;
- if (bindParts[KW_BIND_IDX$1] != null) {
- this.bindingParser.parsePropertyBinding(bindParts[IDENT_KW_IDX$1], value, false, srcSpan, matchableAttributes, parsedProperties);
- }
- else if (bindParts[KW_LET_IDX$1]) {
- if (isTemplateElement) {
- var identifier = bindParts[IDENT_KW_IDX$1];
- this.parseVariable(identifier, value, srcSpan, variables);
- }
- else {
- this.reportError("\"let-\" is only supported on ng-template elements.", srcSpan);
- }
- }
- else if (bindParts[KW_REF_IDX$1]) {
- var identifier = bindParts[IDENT_KW_IDX$1];
- this.parseReference(identifier, value, srcSpan, references);
- }
- else if (bindParts[KW_ON_IDX$1]) {
- var events = [];
- this.bindingParser.parseEvent(bindParts[IDENT_KW_IDX$1], value, srcSpan, attribute.valueSpan || srcSpan, matchableAttributes, events);
- addEvents(events, boundEvents);
- }
- else if (bindParts[KW_BINDON_IDX$1]) {
- this.bindingParser.parsePropertyBinding(bindParts[IDENT_KW_IDX$1], value, false, srcSpan, matchableAttributes, parsedProperties);
- this.parseAssignmentEvent(bindParts[IDENT_KW_IDX$1], value, srcSpan, attribute.valueSpan, matchableAttributes, boundEvents);
- }
- else if (bindParts[KW_AT_IDX$1]) {
- this.bindingParser.parseLiteralAttr(name, value, srcSpan, matchableAttributes, parsedProperties);
- }
- else if (bindParts[IDENT_BANANA_BOX_IDX$1]) {
- this.bindingParser.parsePropertyBinding(bindParts[IDENT_BANANA_BOX_IDX$1], value, false, srcSpan, matchableAttributes, parsedProperties);
- this.parseAssignmentEvent(bindParts[IDENT_BANANA_BOX_IDX$1], value, srcSpan, attribute.valueSpan, matchableAttributes, boundEvents);
- }
- else if (bindParts[IDENT_PROPERTY_IDX$1]) {
- this.bindingParser.parsePropertyBinding(bindParts[IDENT_PROPERTY_IDX$1], value, false, srcSpan, matchableAttributes, parsedProperties);
- }
- else if (bindParts[IDENT_EVENT_IDX$1]) {
- var events = [];
- this.bindingParser.parseEvent(bindParts[IDENT_EVENT_IDX$1], value, srcSpan, attribute.valueSpan || srcSpan, matchableAttributes, events);
- addEvents(events, boundEvents);
- }
- }
- else {
- hasBinding = this.bindingParser.parsePropertyInterpolation(name, value, srcSpan, matchableAttributes, parsedProperties);
- }
- return hasBinding;
- };
- HtmlAstToIvyAst.prototype._visitTextWithInterpolation = function (value, sourceSpan, i18n) {
- var valueNoNgsp = replaceNgsp(value);
- var expr = this.bindingParser.parseInterpolation(valueNoNgsp, sourceSpan);
- return expr ? new BoundText(expr, sourceSpan, i18n) : new Text(valueNoNgsp, sourceSpan);
- };
- HtmlAstToIvyAst.prototype.parseVariable = function (identifier, value, sourceSpan, variables) {
- if (identifier.indexOf('-') > -1) {
- this.reportError("\"-\" is not allowed in variable names", sourceSpan);
- }
- variables.push(new Variable(identifier, value, sourceSpan));
- };
- HtmlAstToIvyAst.prototype.parseReference = function (identifier, value, sourceSpan, references) {
- if (identifier.indexOf('-') > -1) {
- this.reportError("\"-\" is not allowed in reference names", sourceSpan);
- }
- references.push(new Reference(identifier, value, sourceSpan));
- };
- HtmlAstToIvyAst.prototype.parseAssignmentEvent = function (name, expression, sourceSpan, valueSpan, targetMatchableAttrs, boundEvents) {
- var events = [];
- this.bindingParser.parseEvent(name + "Change", expression + "=$event", sourceSpan, valueSpan || sourceSpan, targetMatchableAttrs, events);
- addEvents(events, boundEvents);
- };
- HtmlAstToIvyAst.prototype.reportError = function (message, sourceSpan, level) {
- if (level === void 0) { level = ParseErrorLevel.ERROR; }
- this.errors.push(new ParseError(sourceSpan, message, level));
- };
- return HtmlAstToIvyAst;
- }());
- var NonBindableVisitor$1 = /** @class */ (function () {
- function NonBindableVisitor() {
- }
- NonBindableVisitor.prototype.visitElement = function (ast) {
- var preparsedElement = preparseElement(ast);
- if (preparsedElement.type === PreparsedElementType.SCRIPT ||
- preparsedElement.type === PreparsedElementType.STYLE ||
- preparsedElement.type === PreparsedElementType.STYLESHEET) {
- // Skipping <script> for security reasons
- // Skipping <style> and stylesheets as we already processed them
- // in the StyleCompiler
- return null;
- }
- var children = visitAll$1(this, ast.children, null);
- return new Element(ast.name, visitAll$1(this, ast.attrs),
- /* inputs */ [], /* outputs */ [], children, /* references */ [], ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan);
- };
- NonBindableVisitor.prototype.visitComment = function (comment) { return null; };
- NonBindableVisitor.prototype.visitAttribute = function (attribute) {
- return new TextAttribute(attribute.name, attribute.value, attribute.sourceSpan, undefined, attribute.i18n);
- };
- NonBindableVisitor.prototype.visitText = function (text) { return new Text(text.value, text.sourceSpan); };
- NonBindableVisitor.prototype.visitExpansion = function (expansion) { return null; };
- NonBindableVisitor.prototype.visitExpansionCase = function (expansionCase) { return null; };
- return NonBindableVisitor;
- }());
- var NON_BINDABLE_VISITOR$1 = new NonBindableVisitor$1();
- function normalizeAttributeName(attrName) {
- return /^data-/i.test(attrName) ? attrName.substring(5) : attrName;
- }
- function addEvents(events, boundEvents) {
- boundEvents.push.apply(boundEvents, __spread(events.map(function (e) { return BoundEvent.fromParsedEvent(e); })));
- }
- function isEmptyTextNode(node) {
- return node instanceof Text$3 && node.value.trim().length == 0;
- }
- function isCommentNode(node) {
- return node instanceof Comment;
- }
- function textContents(node) {
- if (node.children.length !== 1 || !(node.children[0] instanceof Text$3)) {
- return null;
- }
- else {
- return node.children[0].value;
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TagType;
- (function (TagType) {
- TagType[TagType["ELEMENT"] = 0] = "ELEMENT";
- TagType[TagType["TEMPLATE"] = 1] = "TEMPLATE";
- TagType[TagType["PROJECTION"] = 2] = "PROJECTION";
- })(TagType || (TagType = {}));
- /**
- * Generates an object that is used as a shared state between parent and all child contexts.
- */
- function setupRegistry() {
- return { getUniqueId: getSeqNumberGenerator(), icus: new Map() };
- }
- /**
- * I18nContext is a helper class which keeps track of all i18n-related aspects
- * (accumulates placeholders, bindings, etc) between i18nStart and i18nEnd instructions.
- *
- * When we enter a nested template, the top-level context is being passed down
- * to the nested component, which uses this context to generate a child instance
- * of I18nContext class (to handle nested template) and at the end, reconciles it back
- * with the parent context.
- *
- * @param index Instruction index of i18nStart, which initiates this context
- * @param ref Reference to a translation const that represents the content if thus context
- * @param level Nestng level defined for child contexts
- * @param templateIndex Instruction index of a template which this context belongs to
- * @param meta Meta information (id, meaning, description, etc) associated with this context
- */
- var I18nContext = /** @class */ (function () {
- function I18nContext(index, ref, level, templateIndex, meta, registry) {
- if (level === void 0) { level = 0; }
- if (templateIndex === void 0) { templateIndex = null; }
- this.index = index;
- this.ref = ref;
- this.level = level;
- this.templateIndex = templateIndex;
- this.meta = meta;
- this.registry = registry;
- this.bindings = new Set();
- this.placeholders = new Map();
- this.isEmitted = false;
- this._unresolvedCtxCount = 0;
- this._registry = registry || setupRegistry();
- this.id = this._registry.getUniqueId();
- }
- I18nContext.prototype.appendTag = function (type, node, index, closed) {
- if (node.isVoid && closed) {
- return; // ignore "close" for void tags
- }
- var ph = node.isVoid || !closed ? node.startName : node.closeName;
- var content = { type: type, index: index, ctx: this.id, isVoid: node.isVoid, closed: closed };
- updatePlaceholderMap(this.placeholders, ph, content);
- };
- Object.defineProperty(I18nContext.prototype, "icus", {
- get: function () { return this._registry.icus; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(I18nContext.prototype, "isRoot", {
- get: function () { return this.level === 0; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(I18nContext.prototype, "isResolved", {
- get: function () { return this._unresolvedCtxCount === 0; },
- enumerable: true,
- configurable: true
- });
- I18nContext.prototype.getSerializedPlaceholders = function () {
- var result = new Map();
- this.placeholders.forEach(function (values, key) { return result.set(key, values.map(serializePlaceholderValue)); });
- return result;
- };
- // public API to accumulate i18n-related content
- I18nContext.prototype.appendBinding = function (binding) { this.bindings.add(binding); };
- I18nContext.prototype.appendIcu = function (name, ref) {
- updatePlaceholderMap(this._registry.icus, name, ref);
- };
- I18nContext.prototype.appendBoundText = function (node) {
- var _this = this;
- var phs = assembleBoundTextPlaceholders(node, this.bindings.size, this.id);
- phs.forEach(function (values, key) { return updatePlaceholderMap.apply(void 0, __spread([_this.placeholders, key], values)); });
- };
- I18nContext.prototype.appendTemplate = function (node, index) {
- // add open and close tags at the same time,
- // since we process nested templates separately
- this.appendTag(TagType.TEMPLATE, node, index, false);
- this.appendTag(TagType.TEMPLATE, node, index, true);
- this._unresolvedCtxCount++;
- };
- I18nContext.prototype.appendElement = function (node, index, closed) {
- this.appendTag(TagType.ELEMENT, node, index, closed);
- };
- I18nContext.prototype.appendProjection = function (node, index) {
- // add open and close tags at the same time,
- // since we process projected content separately
- this.appendTag(TagType.PROJECTION, node, index, false);
- this.appendTag(TagType.PROJECTION, node, index, true);
- };
- /**
- * Generates an instance of a child context based on the root one,
- * when we enter a nested template within I18n section.
- *
- * @param index Instruction index of corresponding i18nStart, which initiates this context
- * @param templateIndex Instruction index of a template which this context belongs to
- * @param meta Meta information (id, meaning, description, etc) associated with this context
- *
- * @returns I18nContext instance
- */
- I18nContext.prototype.forkChildContext = function (index, templateIndex, meta) {
- return new I18nContext(index, this.ref, this.level + 1, templateIndex, meta, this._registry);
- };
- /**
- * Reconciles child context into parent one once the end of the i18n block is reached (i18nEnd).
- *
- * @param context Child I18nContext instance to be reconciled with parent context.
- */
- I18nContext.prototype.reconcileChildContext = function (context) {
- var _this = this;
- // set the right context id for open and close
- // template tags, so we can use it as sub-block ids
- ['start', 'close'].forEach(function (op) {
- var key = context.meta[op + "Name"];
- var phs = _this.placeholders.get(key) || [];
- var tag = phs.find(findTemplateFn(_this.id, context.templateIndex));
- if (tag) {
- tag.ctx = context.id;
- }
- });
- // reconcile placeholders
- var childPhs = context.placeholders;
- childPhs.forEach(function (values, key) {
- var phs = _this.placeholders.get(key);
- if (!phs) {
- _this.placeholders.set(key, values);
- return;
- }
- // try to find matching template...
- var tmplIdx = findIndex(phs, findTemplateFn(context.id, context.templateIndex));
- if (tmplIdx >= 0) {
- // ... if found - replace it with nested template content
- var isCloseTag = key.startsWith('CLOSE');
- var isTemplateTag = key.endsWith('NG-TEMPLATE');
- if (isTemplateTag) {
- // current template's content is placed before or after
- // parent template tag, depending on the open/close atrribute
- phs.splice.apply(phs, __spread([tmplIdx + (isCloseTag ? 0 : 1), 0], values));
- }
- else {
- var idx = isCloseTag ? values.length - 1 : 0;
- values[idx].tmpl = phs[tmplIdx];
- phs.splice.apply(phs, __spread([tmplIdx, 1], values));
- }
- }
- else {
- // ... otherwise just append content to placeholder value
- phs.push.apply(phs, __spread(values));
- }
- _this.placeholders.set(key, phs);
- });
- this._unresolvedCtxCount--;
- };
- return I18nContext;
- }());
- //
- // Helper methods
- //
- function wrap(symbol, index, contextId, closed) {
- var state = closed ? '/' : '';
- return wrapI18nPlaceholder("" + state + symbol + index, contextId);
- }
- function wrapTag(symbol, _a, closed) {
- var index = _a.index, ctx = _a.ctx, isVoid = _a.isVoid;
- return isVoid ? wrap(symbol, index, ctx) + wrap(symbol, index, ctx, true) :
- wrap(symbol, index, ctx, closed);
- }
- function findTemplateFn(ctx, templateIndex) {
- return function (token) { return typeof token === 'object' && token.type === TagType.TEMPLATE &&
- token.index === templateIndex && token.ctx === ctx; };
- }
- function serializePlaceholderValue(value) {
- var element = function (data, closed) { return wrapTag('#', data, closed); };
- var template = function (data, closed) { return wrapTag('*', data, closed); };
- var projection = function (data, closed) { return wrapTag('!', data, closed); };
- switch (value.type) {
- case TagType.ELEMENT:
- // close element tag
- if (value.closed) {
- return element(value, true) + (value.tmpl ? template(value.tmpl, true) : '');
- }
- // open element tag that also initiates a template
- if (value.tmpl) {
- return template(value.tmpl) + element(value) +
- (value.isVoid ? template(value.tmpl, true) : '');
- }
- return element(value);
- case TagType.TEMPLATE:
- return template(value, value.closed);
- case TagType.PROJECTION:
- return projection(value, value.closed);
- default:
- return value;
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TAG_TO_PLACEHOLDER_NAMES = {
- 'A': 'LINK',
- 'B': 'BOLD_TEXT',
- 'BR': 'LINE_BREAK',
- 'EM': 'EMPHASISED_TEXT',
- 'H1': 'HEADING_LEVEL1',
- 'H2': 'HEADING_LEVEL2',
- 'H3': 'HEADING_LEVEL3',
- 'H4': 'HEADING_LEVEL4',
- 'H5': 'HEADING_LEVEL5',
- 'H6': 'HEADING_LEVEL6',
- 'HR': 'HORIZONTAL_RULE',
- 'I': 'ITALIC_TEXT',
- 'LI': 'LIST_ITEM',
- 'LINK': 'MEDIA_LINK',
- 'OL': 'ORDERED_LIST',
- 'P': 'PARAGRAPH',
- 'Q': 'QUOTATION',
- 'S': 'STRIKETHROUGH_TEXT',
- 'SMALL': 'SMALL_TEXT',
- 'SUB': 'SUBSTRIPT',
- 'SUP': 'SUPERSCRIPT',
- 'TBODY': 'TABLE_BODY',
- 'TD': 'TABLE_CELL',
- 'TFOOT': 'TABLE_FOOTER',
- 'TH': 'TABLE_HEADER_CELL',
- 'THEAD': 'TABLE_HEADER',
- 'TR': 'TABLE_ROW',
- 'TT': 'MONOSPACED_TEXT',
- 'U': 'UNDERLINED_TEXT',
- 'UL': 'UNORDERED_LIST',
- };
- /**
- * Creates unique names for placeholder with different content.
- *
- * Returns the same placeholder name when the content is identical.
- */
- var PlaceholderRegistry = /** @class */ (function () {
- function PlaceholderRegistry() {
- // Count the occurrence of the base name top generate a unique name
- this._placeHolderNameCounts = {};
- // Maps signature to placeholder names
- this._signatureToName = {};
- }
- PlaceholderRegistry.prototype.getStartTagPlaceholderName = function (tag, attrs, isVoid) {
- var signature = this._hashTag(tag, attrs, isVoid);
- if (this._signatureToName[signature]) {
- return this._signatureToName[signature];
- }
- var upperTag = tag.toUpperCase();
- var baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || "TAG_" + upperTag;
- var name = this._generateUniqueName(isVoid ? baseName : "START_" + baseName);
- this._signatureToName[signature] = name;
- return name;
- };
- PlaceholderRegistry.prototype.getCloseTagPlaceholderName = function (tag) {
- var signature = this._hashClosingTag(tag);
- if (this._signatureToName[signature]) {
- return this._signatureToName[signature];
- }
- var upperTag = tag.toUpperCase();
- var baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || "TAG_" + upperTag;
- var name = this._generateUniqueName("CLOSE_" + baseName);
- this._signatureToName[signature] = name;
- return name;
- };
- PlaceholderRegistry.prototype.getPlaceholderName = function (name, content) {
- var upperName = name.toUpperCase();
- var signature = "PH: " + upperName + "=" + content;
- if (this._signatureToName[signature]) {
- return this._signatureToName[signature];
- }
- var uniqueName = this._generateUniqueName(upperName);
- this._signatureToName[signature] = uniqueName;
- return uniqueName;
- };
- PlaceholderRegistry.prototype.getUniquePlaceholder = function (name) {
- return this._generateUniqueName(name.toUpperCase());
- };
- // Generate a hash for a tag - does not take attribute order into account
- PlaceholderRegistry.prototype._hashTag = function (tag, attrs, isVoid) {
- var start = "<" + tag;
- var strAttrs = Object.keys(attrs).sort().map(function (name) { return " " + name + "=" + attrs[name]; }).join('');
- var end = isVoid ? '/>' : "></" + tag + ">";
- return start + strAttrs + end;
- };
- PlaceholderRegistry.prototype._hashClosingTag = function (tag) { return this._hashTag("/" + tag, {}, false); };
- PlaceholderRegistry.prototype._generateUniqueName = function (base) {
- var seen = this._placeHolderNameCounts.hasOwnProperty(base);
- if (!seen) {
- this._placeHolderNameCounts[base] = 1;
- return base;
- }
- var id = this._placeHolderNameCounts[base];
- this._placeHolderNameCounts[base] = id + 1;
- return base + "_" + id;
- };
- return PlaceholderRegistry;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _expParser = new Parser$1(new Lexer());
- /**
- * Returns a function converting html nodes to an i18n Message given an interpolationConfig
- */
- function createI18nMessageFactory(interpolationConfig) {
- var visitor = new _I18nVisitor(_expParser, interpolationConfig);
- return function (nodes, meaning, description, id, visitNodeFn) {
- return visitor.toI18nMessage(nodes, meaning, description, id, visitNodeFn);
- };
- }
- var _I18nVisitor = /** @class */ (function () {
- function _I18nVisitor(_expressionParser, _interpolationConfig) {
- this._expressionParser = _expressionParser;
- this._interpolationConfig = _interpolationConfig;
- }
- _I18nVisitor.prototype.toI18nMessage = function (nodes, meaning, description, id, visitNodeFn) {
- this._isIcu = nodes.length == 1 && nodes[0] instanceof Expansion;
- this._icuDepth = 0;
- this._placeholderRegistry = new PlaceholderRegistry();
- this._placeholderToContent = {};
- this._placeholderToMessage = {};
- this._visitNodeFn = visitNodeFn;
- var i18nodes = visitAll$1(this, nodes, {});
- return new Message(i18nodes, this._placeholderToContent, this._placeholderToMessage, meaning, description, id);
- };
- _I18nVisitor.prototype._visitNode = function (html, i18n) {
- if (this._visitNodeFn) {
- this._visitNodeFn(html, i18n);
- }
- return i18n;
- };
- _I18nVisitor.prototype.visitElement = function (el, context) {
- var children = visitAll$1(this, el.children);
- var attrs = {};
- el.attrs.forEach(function (attr) {
- // Do not visit the attributes, translatable ones are top-level ASTs
- attrs[attr.name] = attr.value;
- });
- var isVoid = getHtmlTagDefinition(el.name).isVoid;
- var startPhName = this._placeholderRegistry.getStartTagPlaceholderName(el.name, attrs, isVoid);
- this._placeholderToContent[startPhName] = el.sourceSpan.toString();
- var closePhName = '';
- if (!isVoid) {
- closePhName = this._placeholderRegistry.getCloseTagPlaceholderName(el.name);
- this._placeholderToContent[closePhName] = "</" + el.name + ">";
- }
- var node = new TagPlaceholder(el.name, attrs, startPhName, closePhName, children, isVoid, el.sourceSpan);
- return this._visitNode(el, node);
- };
- _I18nVisitor.prototype.visitAttribute = function (attribute, context) {
- var node = this._visitTextWithInterpolation(attribute.value, attribute.sourceSpan);
- return this._visitNode(attribute, node);
- };
- _I18nVisitor.prototype.visitText = function (text, context) {
- var node = this._visitTextWithInterpolation(text.value, text.sourceSpan);
- return this._visitNode(text, node);
- };
- _I18nVisitor.prototype.visitComment = function (comment, context) { return null; };
- _I18nVisitor.prototype.visitExpansion = function (icu, context) {
- var _this = this;
- this._icuDepth++;
- var i18nIcuCases = {};
- var i18nIcu = new Icu$1(icu.switchValue, icu.type, i18nIcuCases, icu.sourceSpan);
- icu.cases.forEach(function (caze) {
- i18nIcuCases[caze.value] = new Container(caze.expression.map(function (node) { return node.visit(_this, {}); }), caze.expSourceSpan);
- });
- this._icuDepth--;
- if (this._isIcu || this._icuDepth > 0) {
- // Returns an ICU node when:
- // - the message (vs a part of the message) is an ICU message, or
- // - the ICU message is nested.
- var expPh = this._placeholderRegistry.getUniquePlaceholder("VAR_" + icu.type);
- i18nIcu.expressionPlaceholder = expPh;
- this._placeholderToContent[expPh] = icu.switchValue;
- return this._visitNode(icu, i18nIcu);
- }
- // Else returns a placeholder
- // ICU placeholders should not be replaced with their original content but with the their
- // translations. We need to create a new visitor (they are not re-entrant) to compute the
- // message id.
- // TODO(vicb): add a html.Node -> i18n.Message cache to avoid having to re-create the msg
- var phName = this._placeholderRegistry.getPlaceholderName('ICU', icu.sourceSpan.toString());
- var visitor = new _I18nVisitor(this._expressionParser, this._interpolationConfig);
- this._placeholderToMessage[phName] = visitor.toI18nMessage([icu], '', '', '');
- var node = new IcuPlaceholder(i18nIcu, phName, icu.sourceSpan);
- return this._visitNode(icu, node);
- };
- _I18nVisitor.prototype.visitExpansionCase = function (icuCase, context) {
- throw new Error('Unreachable code');
- };
- _I18nVisitor.prototype._visitTextWithInterpolation = function (text, sourceSpan) {
- var splitInterpolation = this._expressionParser.splitInterpolation(text, sourceSpan.start.toString(), this._interpolationConfig);
- if (!splitInterpolation) {
- // No expression, return a single text
- return new Text$1(text, sourceSpan);
- }
- // Return a group of text + expressions
- var nodes = [];
- var container = new Container(nodes, sourceSpan);
- var _a = this._interpolationConfig, sDelimiter = _a.start, eDelimiter = _a.end;
- for (var i = 0; i < splitInterpolation.strings.length - 1; i++) {
- var expression = splitInterpolation.expressions[i];
- var baseName = _extractPlaceholderName(expression) || 'INTERPOLATION';
- var phName = this._placeholderRegistry.getPlaceholderName(baseName, expression);
- if (splitInterpolation.strings[i].length) {
- // No need to add empty strings
- nodes.push(new Text$1(splitInterpolation.strings[i], sourceSpan));
- }
- nodes.push(new Placeholder(expression, phName, sourceSpan));
- this._placeholderToContent[phName] = sDelimiter + expression + eDelimiter;
- }
- // The last index contains no expression
- var lastStringIdx = splitInterpolation.strings.length - 1;
- if (splitInterpolation.strings[lastStringIdx].length) {
- nodes.push(new Text$1(splitInterpolation.strings[lastStringIdx], sourceSpan));
- }
- return container;
- };
- return _I18nVisitor;
- }());
- var _CUSTOM_PH_EXP = /\/\/[\s\S]*i18n[\s\S]*\([\s\S]*ph[\s\S]*=[\s\S]*("|')([\s\S]*?)\1[\s\S]*\)/g;
- function _extractPlaceholderName(input) {
- return input.split(_CUSTOM_PH_EXP)[2];
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function setI18nRefs(html, i18n) {
- html.i18n = i18n;
- }
- /**
- * This visitor walks over HTML parse tree and converts information stored in
- * i18n-related attributes ("i18n" and "i18n-*") into i18n meta object that is
- * stored with other element's and attribute's information.
- */
- var I18nMetaVisitor = /** @class */ (function () {
- function I18nMetaVisitor(interpolationConfig, keepI18nAttrs) {
- if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }
- if (keepI18nAttrs === void 0) { keepI18nAttrs = false; }
- this.interpolationConfig = interpolationConfig;
- this.keepI18nAttrs = keepI18nAttrs;
- // i18n message generation factory
- this._createI18nMessage = createI18nMessageFactory(interpolationConfig);
- }
- I18nMetaVisitor.prototype._generateI18nMessage = function (nodes, meta, visitNodeFn) {
- if (meta === void 0) { meta = ''; }
- var parsed = typeof meta === 'string' ? parseI18nMeta(meta) : metaFromI18nMessage(meta);
- var message = this._createI18nMessage(nodes, parsed.meaning || '', parsed.description || '', parsed.id || '', visitNodeFn);
- if (!message.id) {
- // generate (or restore) message id if not specified in template
- message.id = typeof meta !== 'string' && meta.id || decimalDigest(message);
- }
- return message;
- };
- I18nMetaVisitor.prototype.visitElement = function (element, context) {
- var e_1, _a, e_2, _b;
- if (hasI18nAttrs(element)) {
- var attrs = [];
- var attrsMeta = {};
- try {
- for (var _c = __values(element.attrs), _d = _c.next(); !_d.done; _d = _c.next()) {
- var attr = _d.value;
- if (attr.name === I18N_ATTR) {
- // root 'i18n' node attribute
- var i18n_1 = element.i18n || attr.value;
- var message = this._generateI18nMessage(element.children, i18n_1, setI18nRefs);
- // do not assign empty i18n meta
- if (message.nodes.length) {
- element.i18n = message;
- }
- }
- else if (attr.name.startsWith(I18N_ATTR_PREFIX)) {
- // 'i18n-*' attributes
- var key = attr.name.slice(I18N_ATTR_PREFIX.length);
- attrsMeta[key] = attr.value;
- }
- else {
- // non-i18n attributes
- attrs.push(attr);
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_1) throw e_1.error; }
- }
- // set i18n meta for attributes
- if (Object.keys(attrsMeta).length) {
- try {
- for (var attrs_1 = __values(attrs), attrs_1_1 = attrs_1.next(); !attrs_1_1.done; attrs_1_1 = attrs_1.next()) {
- var attr = attrs_1_1.value;
- var meta = attrsMeta[attr.name];
- // do not create translation for empty attributes
- if (meta !== undefined && attr.value) {
- attr.i18n = this._generateI18nMessage([attr], attr.i18n || meta);
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (attrs_1_1 && !attrs_1_1.done && (_b = attrs_1.return)) _b.call(attrs_1);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- if (!this.keepI18nAttrs) {
- // update element's attributes,
- // keeping only non-i18n related ones
- element.attrs = attrs;
- }
- }
- visitAll$1(this, element.children);
- return element;
- };
- I18nMetaVisitor.prototype.visitExpansion = function (expansion, context) {
- var message;
- var meta = expansion.i18n;
- if (meta instanceof IcuPlaceholder) {
- // set ICU placeholder name (e.g. "ICU_1"),
- // generated while processing root element contents,
- // so we can reference it when we output translation
- var name_1 = meta.name;
- message = this._generateI18nMessage([expansion], meta);
- var icu = icuFromI18nMessage(message);
- icu.name = name_1;
- }
- else {
- // when ICU is a root level translation
- message = this._generateI18nMessage([expansion], meta);
- }
- expansion.i18n = message;
- return expansion;
- };
- I18nMetaVisitor.prototype.visitText = function (text, context) { return text; };
- I18nMetaVisitor.prototype.visitAttribute = function (attribute, context) { return attribute; };
- I18nMetaVisitor.prototype.visitComment = function (comment, context) { return comment; };
- I18nMetaVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return expansionCase; };
- return I18nMetaVisitor;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var formatPh = function (value) { return "{$" + formatI18nPlaceholderName(value) + "}"; };
- /**
- * This visitor walks over i18n tree and generates its string representation,
- * including ICUs and placeholders in {$PLACEHOLDER} format.
- */
- var SerializerVisitor = /** @class */ (function () {
- function SerializerVisitor() {
- }
- SerializerVisitor.prototype.visitText = function (text, context) { return text.value; };
- SerializerVisitor.prototype.visitContainer = function (container, context) {
- var _this = this;
- return container.children.map(function (child) { return child.visit(_this); }).join('');
- };
- SerializerVisitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- var strCases = Object.keys(icu.cases).map(function (k) { return k + " {" + icu.cases[k].visit(_this) + "}"; });
- return "{" + icu.expressionPlaceholder + ", " + icu.type + ", " + strCases.join(' ') + "}";
- };
- SerializerVisitor.prototype.visitTagPlaceholder = function (ph, context) {
- var _this = this;
- return ph.isVoid ?
- formatPh(ph.startName) :
- "" + formatPh(ph.startName) + ph.children.map(function (child) { return child.visit(_this); }).join('') + formatPh(ph.closeName);
- };
- SerializerVisitor.prototype.visitPlaceholder = function (ph, context) { return formatPh(ph.name); };
- SerializerVisitor.prototype.visitIcuPlaceholder = function (ph, context) { return formatPh(ph.name); };
- return SerializerVisitor;
- }());
- var serializerVisitor$1 = new SerializerVisitor();
- function getSerializedI18nContent(message) {
- return message.nodes.map(function (node) { return node.visit(serializerVisitor$1, null); }).join('');
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // Selector attribute name of `<ng-content>`
- var NG_CONTENT_SELECT_ATTR$1 = 'select';
- // Attribute name of `ngProjectAs`.
- var NG_PROJECT_AS_ATTR_NAME = 'ngProjectAs';
- // List of supported global targets for event listeners
- var GLOBAL_TARGET_RESOLVERS = new Map([['window', Identifiers$1.resolveWindow], ['document', Identifiers$1.resolveDocument], ['body', Identifiers$1.resolveBody]]);
- var LEADING_TRIVIA_CHARS = [' ', '\n', '\r', '\t'];
- // if (rf & flags) { .. }
- function renderFlagCheckIfStmt(flags, statements) {
- return ifStmt(variable(RENDER_FLAGS).bitwiseAnd(literal(flags), null, false), statements);
- }
- function prepareEventListenerParameters(eventAst, handlerName, scope) {
- if (handlerName === void 0) { handlerName = null; }
- if (scope === void 0) { scope = null; }
- var type = eventAst.type, name = eventAst.name, target = eventAst.target, phase = eventAst.phase, handler = eventAst.handler;
- if (target && !GLOBAL_TARGET_RESOLVERS.has(target)) {
- throw new Error("Unexpected global target '" + target + "' defined for '" + name + "' event.\n Supported list of global targets: " + Array.from(GLOBAL_TARGET_RESOLVERS.keys()) + ".");
- }
- var implicitReceiverExpr = (scope === null || scope.bindingLevel === 0) ?
- variable(CONTEXT_NAME) :
- scope.getOrCreateSharedContextVar(0);
- var bindingExpr = convertActionBinding(scope, implicitReceiverExpr, handler, 'b', function () { return error('Unexpected interpolation'); }, eventAst.handlerSpan);
- var statements = [];
- if (scope) {
- statements.push.apply(statements, __spread(scope.restoreViewStatement()));
- statements.push.apply(statements, __spread(scope.variableDeclarations()));
- }
- statements.push.apply(statements, __spread(bindingExpr.render3Stmts));
- var eventName = type === 1 /* Animation */ ? prepareSyntheticListenerName(name, phase) : name;
- var fnName = handlerName && sanitizeIdentifier(handlerName);
- var fnArgs = [new FnParam('$event', DYNAMIC_TYPE)];
- var handlerFn = fn(fnArgs, statements, INFERRED_TYPE, null, fnName);
- var params = [literal(eventName), handlerFn];
- if (target) {
- params.push(literal(false), // `useCapture` flag, defaults to `false`
- importExpr(GLOBAL_TARGET_RESOLVERS.get(target)));
- }
- return params;
- }
- var TemplateDefinitionBuilder = /** @class */ (function () {
- function TemplateDefinitionBuilder(constantPool, parentBindingScope, level, contextName, i18nContext, templateIndex, templateName, directiveMatcher, directives, pipeTypeByName, pipes, _namespace, relativeContextFilePath, i18nUseExternalIds) {
- var _this = this;
- if (level === void 0) { level = 0; }
- this.constantPool = constantPool;
- this.level = level;
- this.contextName = contextName;
- this.i18nContext = i18nContext;
- this.templateIndex = templateIndex;
- this.templateName = templateName;
- this.directiveMatcher = directiveMatcher;
- this.directives = directives;
- this.pipeTypeByName = pipeTypeByName;
- this.pipes = pipes;
- this._namespace = _namespace;
- this.relativeContextFilePath = relativeContextFilePath;
- this.i18nUseExternalIds = i18nUseExternalIds;
- this._dataIndex = 0;
- this._bindingContext = 0;
- this._prefixCode = [];
- /**
- * List of callbacks to generate creation mode instructions. We store them here as we process
- * the template so bindings in listeners are resolved only once all nodes have been visited.
- * This ensures all local refs and context variables are available for matching.
- */
- this._creationCodeFns = [];
- /**
- * List of callbacks to generate update mode instructions. We store them here as we process
- * the template so bindings are resolved only once all nodes have been visited. This ensures
- * all local refs and context variables are available for matching.
- */
- this._updateCodeFns = [];
- /**
- * Memorizes the last node index for which a select instruction has been generated.
- * We're initializing this to -1 to ensure the `select(0)` instruction is generated before any
- * relevant update instructions.
- */
- this._lastNodeIndexWithFlush = -1;
- /** Temporary variable declarations generated from visiting pipes, literals, etc. */
- this._tempVariables = [];
- /**
- * List of callbacks to build nested templates. Nested templates must not be visited until
- * after the parent template has finished visiting all of its nodes. This ensures that all
- * local ref bindings in nested templates are able to find local ref values if the refs
- * are defined after the template declaration.
- */
- this._nestedTemplateFns = [];
- this._unsupported = unsupported;
- // i18n context local to this template
- this.i18n = null;
- // Number of slots to reserve for pureFunctions
- this._pureFunctionSlots = 0;
- // Number of binding slots
- this._bindingSlots = 0;
- // Projection slots found in the template. Projection slots can distribute projected
- // nodes based on a selector, or can just use the wildcard selector to match
- // all nodes which aren't matching any selector.
- this._ngContentReservedSlots = [];
- // Number of non-default selectors found in all parent templates of this template. We need to
- // track it to properly adjust projection slot index in the `projection` instruction.
- this._ngContentSelectorsOffset = 0;
- // Expression that should be used as implicit receiver when converting template
- // expressions to output AST.
- this._implicitReceiverExpr = null;
- // These should be handled in the template or element directly.
- this.visitReference = invalid$1;
- this.visitVariable = invalid$1;
- this.visitTextAttribute = invalid$1;
- this.visitBoundAttribute = invalid$1;
- this.visitBoundEvent = invalid$1;
- this._bindingScope = parentBindingScope.nestedScope(level);
- // Turn the relative context file path into an identifier by replacing non-alphanumeric
- // characters with underscores.
- this.fileBasedI18nSuffix = relativeContextFilePath.replace(/[^A-Za-z0-9]/g, '_') + '_';
- this._valueConverter = new ValueConverter(constantPool, function () { return _this.allocateDataSlot(); }, function (numSlots) { return _this.allocatePureFunctionSlots(numSlots); }, function (name, localName, slot, value) {
- var pipeType = pipeTypeByName.get(name);
- if (pipeType) {
- _this.pipes.add(pipeType);
- }
- _this._bindingScope.set(_this.level, localName, value);
- _this.creationInstruction(null, Identifiers$1.pipe, [literal(slot), literal(name)]);
- });
- }
- TemplateDefinitionBuilder.prototype.registerContextVariables = function (variable$1) {
- var scopedName = this._bindingScope.freshReferenceName();
- var retrievalLevel = this.level;
- var lhs = variable(variable$1.name + scopedName);
- this._bindingScope.set(retrievalLevel, variable$1.name, lhs, 1 /* CONTEXT */, function (scope, relativeLevel) {
- var rhs;
- if (scope.bindingLevel === retrievalLevel) {
- // e.g. ctx
- rhs = variable(CONTEXT_NAME);
- }
- else {
- var sharedCtxVar = scope.getSharedContextName(retrievalLevel);
- // e.g. ctx_r0 OR x(2);
- rhs = sharedCtxVar ? sharedCtxVar : generateNextContextExpr(relativeLevel);
- }
- // e.g. const $item$ = x(2).$implicit;
- return [lhs.set(rhs.prop(variable$1.value || IMPLICIT_REFERENCE)).toConstDecl()];
- });
- };
- TemplateDefinitionBuilder.prototype.buildTemplateFunction = function (nodes, variables, ngContentSelectorsOffset, i18n) {
- var _this = this;
- if (ngContentSelectorsOffset === void 0) { ngContentSelectorsOffset = 0; }
- this._ngContentSelectorsOffset = ngContentSelectorsOffset;
- if (this._namespace !== Identifiers$1.namespaceHTML) {
- this.creationInstruction(null, this._namespace);
- }
- // Create variable bindings
- variables.forEach(function (v) { return _this.registerContextVariables(v); });
- // Initiate i18n context in case:
- // - this template has parent i18n context
- // - or the template has i18n meta associated with it,
- // but it's not initiated by the Element (e.g. <ng-template i18n>)
- var initI18nContext = this.i18nContext || (isI18nRootNode(i18n) && !isSingleI18nIcu(i18n) &&
- !(isSingleElementTemplate(nodes) && nodes[0].i18n === i18n));
- var selfClosingI18nInstruction = hasTextChildrenOnly(nodes);
- if (initI18nContext) {
- this.i18nStart(null, i18n, selfClosingI18nInstruction);
- }
- // This is the initial pass through the nodes of this template. In this pass, we
- // queue all creation mode and update mode instructions for generation in the second
- // pass. It's necessary to separate the passes to ensure local refs are defined before
- // resolving bindings. We also count bindings in this pass as we walk bound expressions.
- visitAll(this, nodes);
- // Add total binding count to pure function count so pure function instructions are
- // generated with the correct slot offset when update instructions are processed.
- this._pureFunctionSlots += this._bindingSlots;
- // Pipes are walked in the first pass (to enqueue `pipe()` creation instructions and
- // `pipeBind` update instructions), so we have to update the slot offsets manually
- // to account for bindings.
- this._valueConverter.updatePipeSlotOffsets(this._bindingSlots);
- // Nested templates must be processed before creation instructions so template()
- // instructions can be generated with the correct internal const count.
- this._nestedTemplateFns.forEach(function (buildTemplateFn) { return buildTemplateFn(); });
- // Output the `projectionDef` instruction when some `<ng-content>` tags are present.
- // The `projectionDef` instruction is only emitted for the component template and
- // is skipped for nested templates (<ng-template> tags).
- if (this.level === 0 && this._ngContentReservedSlots.length) {
- var parameters = [];
- // By default the `projectionDef` instructions creates one slot for the wildcard
- // selector if no parameters are passed. Therefore we only want to allocate a new
- // array for the projection slots if the default projection slot is not sufficient.
- if (this._ngContentReservedSlots.length > 1 || this._ngContentReservedSlots[0] !== '*') {
- var r3ReservedSlots = this._ngContentReservedSlots.map(function (s) { return s !== '*' ? parseSelectorToR3Selector(s) : s; });
- parameters.push(this.constantPool.getConstLiteral(asLiteral(r3ReservedSlots), true));
- }
- // Since we accumulate ngContent selectors while processing template elements,
- // we *prepend* `projectionDef` to creation instructions block, to put it before
- // any `projection` instructions
- this.creationInstruction(null, Identifiers$1.projectionDef, parameters, /* prepend */ true);
- }
- if (initI18nContext) {
- this.i18nEnd(null, selfClosingI18nInstruction);
- }
- // Generate all the creation mode instructions (e.g. resolve bindings in listeners)
- var creationStatements = this._creationCodeFns.map(function (fn) { return fn(); });
- // Generate all the update mode instructions (e.g. resolve property or text bindings)
- var updateStatements = this._updateCodeFns.map(function (fn) { return fn(); });
- // Variable declaration must occur after binding resolution so we can generate context
- // instructions that build on each other.
- // e.g. const b = nextContext().$implicit(); const b = nextContext();
- var creationVariables = this._bindingScope.viewSnapshotStatements();
- var updateVariables = this._bindingScope.variableDeclarations().concat(this._tempVariables);
- var creationBlock = creationStatements.length > 0 ?
- [renderFlagCheckIfStmt(1 /* Create */, creationVariables.concat(creationStatements))] :
- [];
- var updateBlock = updateStatements.length > 0 ?
- [renderFlagCheckIfStmt(2 /* Update */, updateVariables.concat(updateStatements))] :
- [];
- return fn(
- // i.e. (rf: RenderFlags, ctx: any)
- [new FnParam(RENDER_FLAGS, NUMBER_TYPE), new FnParam(CONTEXT_NAME, null)], __spread(this._prefixCode, creationBlock, updateBlock), INFERRED_TYPE, null, this.templateName);
- };
- // LocalResolver
- TemplateDefinitionBuilder.prototype.getLocal = function (name) { return this._bindingScope.get(name); };
- // LocalResolver
- TemplateDefinitionBuilder.prototype.notifyImplicitReceiverUse = function () { this._bindingScope.notifyImplicitReceiverUse(); };
- TemplateDefinitionBuilder.prototype.i18nTranslate = function (message, params, ref, transformFn) {
- var _a;
- if (params === void 0) { params = {}; }
- var _ref = ref || variable(this.constantPool.uniqueName(TRANSLATION_PREFIX));
- // Closure Compiler requires const names to start with `MSG_` but disallows any other const to
- // start with `MSG_`. We define a variable starting with `MSG_` just for the `goog.getMsg` call
- var closureVar = this.i18nGenerateClosureVar(message.id);
- var _params = {};
- if (params && Object.keys(params).length) {
- Object.keys(params).forEach(function (key) { return _params[formatI18nPlaceholderName(key)] = params[key]; });
- }
- var meta = metaFromI18nMessage(message);
- var content = getSerializedI18nContent(message);
- var statements = getTranslationDeclStmts(_ref, closureVar, content, meta, _params, transformFn);
- (_a = this.constantPool.statements).push.apply(_a, __spread(statements));
- return _ref;
- };
- TemplateDefinitionBuilder.prototype.i18nAppendBindings = function (expressions) {
- var _this = this;
- if (expressions.length > 0) {
- expressions.forEach(function (expression) { return _this.i18n.appendBinding(expression); });
- }
- };
- TemplateDefinitionBuilder.prototype.i18nBindProps = function (props) {
- var _this = this;
- var bound = {};
- Object.keys(props).forEach(function (key) {
- var prop = props[key];
- if (prop instanceof Text) {
- bound[key] = literal(prop.value);
- }
- else {
- var value = prop.value.visit(_this._valueConverter);
- _this.allocateBindingSlots(value);
- if (value instanceof Interpolation) {
- var strings = value.strings, expressions = value.expressions;
- var _a = _this.i18n, id = _a.id, bindings = _a.bindings;
- var label = assembleI18nBoundString(strings, bindings.size, id);
- _this.i18nAppendBindings(expressions);
- bound[key] = literal(label);
- }
- }
- });
- return bound;
- };
- TemplateDefinitionBuilder.prototype.i18nGenerateClosureVar = function (messageId) {
- var name;
- var suffix = this.fileBasedI18nSuffix.toUpperCase();
- if (this.i18nUseExternalIds) {
- var prefix = getTranslationConstPrefix("EXTERNAL_");
- var uniqueSuffix = this.constantPool.uniqueName(suffix);
- name = "" + prefix + sanitizeIdentifier(messageId) + "$$" + uniqueSuffix;
- }
- else {
- var prefix = getTranslationConstPrefix(suffix);
- name = this.constantPool.uniqueName(prefix);
- }
- return variable(name);
- };
- TemplateDefinitionBuilder.prototype.i18nUpdateRef = function (context) {
- var icus = context.icus, meta = context.meta, isRoot = context.isRoot, isResolved = context.isResolved, isEmitted = context.isEmitted;
- if (isRoot && isResolved && !isEmitted && !isSingleI18nIcu(meta)) {
- context.isEmitted = true;
- var placeholders = context.getSerializedPlaceholders();
- var icuMapping_1 = {};
- var params_1 = placeholders.size ? placeholdersToParams(placeholders) : {};
- if (icus.size) {
- icus.forEach(function (refs, key) {
- if (refs.length === 1) {
- // if we have one ICU defined for a given
- // placeholder - just output its reference
- params_1[key] = refs[0];
- }
- else {
- // ... otherwise we need to activate post-processing
- // to replace ICU placeholders with proper values
- var placeholder = wrapI18nPlaceholder("" + I18N_ICU_MAPPING_PREFIX + key);
- params_1[key] = literal(placeholder);
- icuMapping_1[key] = literalArr(refs);
- }
- });
- }
- // translation requires post processing in 2 cases:
- // - if we have placeholders with multiple values (ex. `START_DIV`: [�#1�, �#2�, ...])
- // - if we have multiple ICUs that refer to the same placeholder name
- var needsPostprocessing = Array.from(placeholders.values()).some(function (value) { return value.length > 1; }) ||
- Object.keys(icuMapping_1).length;
- var transformFn = void 0;
- if (needsPostprocessing) {
- transformFn = function (raw) {
- var args = [raw];
- if (Object.keys(icuMapping_1).length) {
- args.push(mapLiteral(icuMapping_1, true));
- }
- return instruction(null, Identifiers$1.i18nPostprocess, args);
- };
- }
- this.i18nTranslate(meta, params_1, context.ref, transformFn);
- }
- };
- TemplateDefinitionBuilder.prototype.i18nStart = function (span, meta, selfClosing) {
- if (span === void 0) { span = null; }
- var index = this.allocateDataSlot();
- if (this.i18nContext) {
- this.i18n = this.i18nContext.forkChildContext(index, this.templateIndex, meta);
- }
- else {
- var ref_1 = variable(this.constantPool.uniqueName(TRANSLATION_PREFIX));
- this.i18n = new I18nContext(index, ref_1, 0, this.templateIndex, meta);
- }
- // generate i18nStart instruction
- var _a = this.i18n, id = _a.id, ref = _a.ref;
- var params = [literal(index), ref];
- if (id > 0) {
- // do not push 3rd argument (sub-block id)
- // into i18nStart call for top level i18n context
- params.push(literal(id));
- }
- this.creationInstruction(span, selfClosing ? Identifiers$1.i18n : Identifiers$1.i18nStart, params);
- };
- TemplateDefinitionBuilder.prototype.i18nEnd = function (span, selfClosing) {
- var _this = this;
- if (span === void 0) { span = null; }
- if (!this.i18n) {
- throw new Error('i18nEnd is executed with no i18n context present');
- }
- if (this.i18nContext) {
- this.i18nContext.reconcileChildContext(this.i18n);
- this.i18nUpdateRef(this.i18nContext);
- }
- else {
- this.i18nUpdateRef(this.i18n);
- }
- // setup accumulated bindings
- var _a = this.i18n, index = _a.index, bindings = _a.bindings;
- if (bindings.size) {
- var chainBindings_1 = [];
- bindings.forEach(function (binding) {
- chainBindings_1.push({ sourceSpan: span, value: function () { return _this.convertPropertyBinding(binding); } });
- });
- this.updateInstructionChain(index, Identifiers$1.i18nExp, chainBindings_1);
- this.updateInstruction(index, span, Identifiers$1.i18nApply, [literal(index)]);
- }
- if (!selfClosing) {
- this.creationInstruction(span, Identifiers$1.i18nEnd);
- }
- this.i18n = null; // reset local i18n context
- };
- TemplateDefinitionBuilder.prototype.visitContent = function (ngContent) {
- var slot = this.allocateDataSlot();
- var projectionSlotIdx = this._ngContentSelectorsOffset + this._ngContentReservedSlots.length;
- var parameters = [literal(slot)];
- var attributes = [];
- this._ngContentReservedSlots.push(ngContent.selector);
- ngContent.attributes.forEach(function (attribute) {
- var name = attribute.name, value = attribute.value;
- if (name === NG_PROJECT_AS_ATTR_NAME) {
- attributes.push.apply(attributes, __spread(getNgProjectAsLiteral(attribute)));
- }
- else if (name.toLowerCase() !== NG_CONTENT_SELECT_ATTR$1) {
- attributes.push(literal(name), literal(value));
- }
- });
- if (attributes.length > 0) {
- parameters.push(literal(projectionSlotIdx), literalArr(attributes));
- }
- else if (projectionSlotIdx !== 0) {
- parameters.push(literal(projectionSlotIdx));
- }
- this.creationInstruction(ngContent.sourceSpan, Identifiers$1.projection, parameters);
- if (this.i18n) {
- this.i18n.appendProjection(ngContent.i18n, slot);
- }
- };
- TemplateDefinitionBuilder.prototype.getNamespaceInstruction = function (namespaceKey) {
- switch (namespaceKey) {
- case 'math':
- return Identifiers$1.namespaceMathML;
- case 'svg':
- return Identifiers$1.namespaceSVG;
- default:
- return Identifiers$1.namespaceHTML;
- }
- };
- TemplateDefinitionBuilder.prototype.addNamespaceInstruction = function (nsInstruction, element) {
- this._namespace = nsInstruction;
- this.creationInstruction(element.sourceSpan, nsInstruction);
- };
- TemplateDefinitionBuilder.prototype.visitElement = function (element) {
- var _this = this;
- var e_1, _a;
- var elementIndex = this.allocateDataSlot();
- var stylingBuilder = new StylingBuilder(literal(elementIndex), null);
- var isNonBindableMode = false;
- var isI18nRootElement = isI18nRootNode(element.i18n) && !isSingleI18nIcu(element.i18n);
- if (isI18nRootElement && this.i18n) {
- throw new Error("Could not mark an element as translatable inside of a translatable section");
- }
- var i18nAttrs = [];
- var outputAttrs = [];
- var _b = __read(splitNsName(element.name), 2), namespaceKey = _b[0], elementName = _b[1];
- var isNgContainer$1 = isNgContainer(element.name);
- try {
- // Handle styling, i18n, ngNonBindable attributes
- for (var _c = __values(element.attributes), _d = _c.next(); !_d.done; _d = _c.next()) {
- var attr = _d.value;
- var name_1 = attr.name, value = attr.value;
- if (name_1 === NON_BINDABLE_ATTR) {
- isNonBindableMode = true;
- }
- else if (name_1 === 'style') {
- stylingBuilder.registerStyleAttr(value);
- }
- else if (name_1 === 'class') {
- stylingBuilder.registerClassAttr(value);
- }
- else {
- if (attr.i18n) {
- // Place attributes into a separate array for i18n processing, but also keep such
- // attributes in the main list to make them available for directive matching at runtime.
- // TODO(FW-1248): prevent attributes duplication in `i18nAttributes` and `elementStart`
- // arguments
- i18nAttrs.push(attr);
- }
- else {
- outputAttrs.push(attr);
- }
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_1) throw e_1.error; }
- }
- // Match directives on non i18n attributes
- this.matchDirectives(element.name, element);
- // Regular element or ng-container creation mode
- var parameters = [literal(elementIndex)];
- if (!isNgContainer$1) {
- parameters.push(literal(elementName));
- }
- // Add the attributes
- var attributes = [];
- var allOtherInputs = [];
- element.inputs.forEach(function (input) {
- var stylingInputWasSet = stylingBuilder.registerBoundInput(input);
- if (!stylingInputWasSet) {
- if (input.type === 0 /* Property */ && input.i18n) {
- // Place attributes into a separate array for i18n processing, but also keep such
- // attributes in the main list to make them available for directive matching at runtime.
- // TODO(FW-1248): prevent attributes duplication in `i18nAttributes` and `elementStart`
- // arguments
- i18nAttrs.push(input);
- }
- else {
- allOtherInputs.push(input);
- }
- }
- });
- outputAttrs.forEach(function (attr) {
- if (attr.name === NG_PROJECT_AS_ATTR_NAME) {
- attributes.push.apply(attributes, __spread(getNgProjectAsLiteral(attr)));
- }
- else {
- attributes.push.apply(attributes, __spread(getAttributeNameLiterals(attr.name), [literal(attr.value)]));
- }
- });
- // add attributes for directive and projection matching purposes
- attributes.push.apply(attributes, __spread(this.prepareNonRenderAttrs(allOtherInputs, element.outputs, stylingBuilder, [], i18nAttrs)));
- parameters.push(this.toAttrsParam(attributes));
- // local refs (ex.: <div #foo #bar="baz">)
- parameters.push(this.prepareRefsParameter(element.references));
- var wasInNamespace = this._namespace;
- var currentNamespace = this.getNamespaceInstruction(namespaceKey);
- // If the namespace is changing now, include an instruction to change it
- // during element creation.
- if (currentNamespace !== wasInNamespace) {
- this.addNamespaceInstruction(currentNamespace, element);
- }
- if (this.i18n) {
- this.i18n.appendElement(element.i18n, elementIndex);
- }
- var hasChildren = function () {
- if (!isI18nRootElement && _this.i18n) {
- // we do not append text node instructions and ICUs inside i18n section,
- // so we exclude them while calculating whether current element has children
- return !hasTextChildrenOnly(element.children);
- }
- return element.children.length > 0;
- };
- var createSelfClosingInstruction = !stylingBuilder.hasBindings && !isNgContainer$1 &&
- element.outputs.length === 0 && i18nAttrs.length === 0 && !hasChildren();
- var createSelfClosingI18nInstruction = !createSelfClosingInstruction &&
- !stylingBuilder.hasBindings && hasTextChildrenOnly(element.children);
- if (createSelfClosingInstruction) {
- this.creationInstruction(element.sourceSpan, Identifiers$1.element, trimTrailingNulls(parameters));
- }
- else {
- this.creationInstruction(element.sourceSpan, isNgContainer$1 ? Identifiers$1.elementContainerStart : Identifiers$1.elementStart, trimTrailingNulls(parameters));
- if (isNonBindableMode) {
- this.creationInstruction(element.sourceSpan, Identifiers$1.disableBindings);
- }
- // process i18n element attributes
- if (i18nAttrs.length) {
- var hasBindings_1 = false;
- var i18nAttrArgs_1 = [];
- var bindings_1 = [];
- i18nAttrs.forEach(function (attr) {
- var message = attr.i18n;
- if (attr instanceof TextAttribute) {
- i18nAttrArgs_1.push(literal(attr.name), _this.i18nTranslate(message));
- }
- else {
- var converted = attr.value.visit(_this._valueConverter);
- _this.allocateBindingSlots(converted);
- if (converted instanceof Interpolation) {
- var placeholders = assembleBoundTextPlaceholders(message);
- var params = placeholdersToParams(placeholders);
- i18nAttrArgs_1.push(literal(attr.name), _this.i18nTranslate(message, params));
- converted.expressions.forEach(function (expression) {
- hasBindings_1 = true;
- bindings_1.push({
- sourceSpan: element.sourceSpan,
- value: function () { return _this.convertExpressionBinding(expression); }
- });
- });
- }
- }
- });
- if (bindings_1.length) {
- this.updateInstructionChain(elementIndex, Identifiers$1.i18nExp, bindings_1);
- }
- if (i18nAttrArgs_1.length) {
- var index = literal(this.allocateDataSlot());
- var args = this.constantPool.getConstLiteral(literalArr(i18nAttrArgs_1), true);
- this.creationInstruction(element.sourceSpan, Identifiers$1.i18nAttributes, [index, args]);
- if (hasBindings_1) {
- this.updateInstruction(elementIndex, element.sourceSpan, Identifiers$1.i18nApply, [index]);
- }
- }
- }
- // The style bindings code is placed into two distinct blocks within the template function AOT
- // code: creation and update. The creation code contains the `styling` instructions
- // which will apply the collected binding values to the element. `styling` is
- // designed to run inside of `elementStart` and `elementEnd`. The update instructions
- // (things like `styleProp`, `classProp`, etc..) are applied later on in this
- // file
- this.processStylingInstruction(elementIndex, stylingBuilder.buildStylingInstruction(element.sourceSpan, this.constantPool), true);
- // Generate Listeners (outputs)
- element.outputs.forEach(function (outputAst) {
- _this.creationInstruction(outputAst.sourceSpan, Identifiers$1.listener, _this.prepareListenerParameter(element.name, outputAst, elementIndex));
- });
- // Note: it's important to keep i18n/i18nStart instructions after i18nAttributes and
- // listeners, to make sure i18nAttributes instruction targets current element at runtime.
- if (isI18nRootElement) {
- this.i18nStart(element.sourceSpan, element.i18n, createSelfClosingI18nInstruction);
- }
- }
- // the code here will collect all update-level styling instructions and add them to the
- // update block of the template function AOT code. Instructions like `styleProp`,
- // `styleMap`, `classMap`, `classProp` and `stylingApply`
- // are all generated and assigned in the code below.
- var stylingInstructions = stylingBuilder.buildUpdateLevelInstructions(this._valueConverter);
- var limit = stylingInstructions.length - 1;
- for (var i = 0; i <= limit; i++) {
- var instruction_1 = stylingInstructions[i];
- this._bindingSlots += instruction_1.allocateBindingSlots;
- this.processStylingInstruction(elementIndex, instruction_1, false);
- }
- // the reason why `undefined` is used is because the renderer understands this as a
- // special value to symbolize that there is no RHS to this binding
- // TODO (matsko): revisit this once FW-959 is approached
- var emptyValueBindInstruction = literal(undefined);
- var propertyBindings = [];
- var attributeBindings = [];
- // Generate element input bindings
- allOtherInputs.forEach(function (input) {
- var inputType = input.type;
- if (inputType === 4 /* Animation */) {
- var value_1 = input.value.visit(_this._valueConverter);
- // animation bindings can be presented in the following formats:
- // 1. [@binding]="fooExp"
- // 2. [@binding]="{value:fooExp, params:{...}}"
- // 3. [@binding]
- // 4. @binding
- // All formats will be valid for when a synthetic binding is created.
- // The reasoning for this is because the renderer should get each
- // synthetic binding value in the order of the array that they are
- // defined in...
- var hasValue_1 = value_1 instanceof LiteralPrimitive ? !!value_1.value : true;
- _this.allocateBindingSlots(value_1);
- propertyBindings.push({
- name: prepareSyntheticPropertyName(input.name),
- sourceSpan: input.sourceSpan,
- value: function () { return hasValue_1 ? _this.convertPropertyBinding(value_1) : emptyValueBindInstruction; }
- });
- }
- else {
- // we must skip attributes with associated i18n context, since these attributes are handled
- // separately and corresponding `i18nExp` and `i18nApply` instructions will be generated
- if (input.i18n)
- return;
- var value_2 = input.value.visit(_this._valueConverter);
- if (value_2 !== undefined) {
- var params_2 = [];
- var _a = __read(splitNsName(input.name), 2), attrNamespace = _a[0], attrName_1 = _a[1];
- var isAttributeBinding = inputType === 1 /* Attribute */;
- var sanitizationRef = resolveSanitizationFn(input.securityContext, isAttributeBinding);
- if (sanitizationRef)
- params_2.push(sanitizationRef);
- if (attrNamespace) {
- var namespaceLiteral = literal(attrNamespace);
- if (sanitizationRef) {
- params_2.push(namespaceLiteral);
- }
- else {
- // If there wasn't a sanitization ref, we need to add
- // an extra param so that we can pass in the namespace.
- params_2.push(literal(null), namespaceLiteral);
- }
- }
- _this.allocateBindingSlots(value_2);
- if (inputType === 0 /* Property */) {
- if (value_2 instanceof Interpolation) {
- // prop="{{value}}" and friends
- _this.interpolatedUpdateInstruction(getPropertyInterpolationExpression(value_2), elementIndex, attrName_1, input, value_2, params_2);
- }
- else {
- // [prop]="value"
- // Collect all the properties so that we can chain into a single function at the end.
- propertyBindings.push({
- name: attrName_1,
- sourceSpan: input.sourceSpan,
- value: function () { return _this.convertPropertyBinding(value_2); }, params: params_2
- });
- }
- }
- else if (inputType === 1 /* Attribute */) {
- if (value_2 instanceof Interpolation && getInterpolationArgsLength(value_2) > 1) {
- // attr.name="text{{value}}" and friends
- _this.interpolatedUpdateInstruction(getAttributeInterpolationExpression(value_2), elementIndex, attrName_1, input, value_2, params_2);
- }
- else {
- var boundValue_1 = value_2 instanceof Interpolation ? value_2.expressions[0] : value_2;
- // [attr.name]="value" or attr.name="{{value}}"
- // Collect the attribute bindings so that they can be chained at the end.
- attributeBindings.push({
- name: attrName_1,
- sourceSpan: input.sourceSpan,
- value: function () { return _this.convertPropertyBinding(boundValue_1); }, params: params_2
- });
- }
- }
- else {
- // class prop
- _this.updateInstruction(elementIndex, input.sourceSpan, Identifiers$1.classProp, function () {
- return __spread([
- literal(elementIndex), literal(attrName_1), _this.convertPropertyBinding(value_2)
- ], params_2);
- });
- }
- }
- }
- });
- if (propertyBindings.length > 0) {
- this.updateInstructionChain(elementIndex, Identifiers$1.property, propertyBindings);
- }
- if (attributeBindings.length > 0) {
- this.updateInstructionChain(elementIndex, Identifiers$1.attribute, attributeBindings);
- }
- // Traverse element child nodes
- visitAll(this, element.children);
- if (!isI18nRootElement && this.i18n) {
- this.i18n.appendElement(element.i18n, elementIndex, true);
- }
- if (!createSelfClosingInstruction) {
- // Finish element construction mode.
- var span = element.endSourceSpan || element.sourceSpan;
- if (isI18nRootElement) {
- this.i18nEnd(span, createSelfClosingI18nInstruction);
- }
- if (isNonBindableMode) {
- this.creationInstruction(span, Identifiers$1.enableBindings);
- }
- this.creationInstruction(span, isNgContainer$1 ? Identifiers$1.elementContainerEnd : Identifiers$1.elementEnd);
- }
- };
- /**
- * Adds an update instruction for an interpolated property or attribute, such as
- * `prop="{{value}}"` or `attr.title="{{value}}"`
- */
- TemplateDefinitionBuilder.prototype.interpolatedUpdateInstruction = function (instruction, elementIndex, attrName, input, value, params) {
- var _this = this;
- this.updateInstruction(elementIndex, input.sourceSpan, instruction, function () { return __spread([literal(attrName)], _this.getUpdateInstructionArguments(value), params); });
- };
- TemplateDefinitionBuilder.prototype.visitTemplate = function (template) {
- var _this = this;
- var NG_TEMPLATE_TAG_NAME = 'ng-template';
- var templateIndex = this.allocateDataSlot();
- if (this.i18n) {
- this.i18n.appendTemplate(template.i18n, templateIndex);
- }
- var tagName = sanitizeIdentifier(template.tagName || '');
- var contextName = "" + this.contextName + (tagName ? '_' + tagName : '') + "_" + templateIndex;
- var templateName = contextName + "_Template";
- var parameters = [
- literal(templateIndex),
- variable(templateName),
- // We don't care about the tag's namespace here, because we infer
- // it based on the parent nodes inside the template instruction.
- literal(template.tagName ? splitNsName(template.tagName)[1] : template.tagName),
- ];
- // find directives matching on a given <ng-template> node
- this.matchDirectives(NG_TEMPLATE_TAG_NAME, template);
- // prepare attributes parameter (including attributes used for directive matching)
- var attrsExprs = [];
- template.attributes.forEach(function (a) { attrsExprs.push(asLiteral(a.name), asLiteral(a.value)); });
- attrsExprs.push.apply(attrsExprs, __spread(this.prepareNonRenderAttrs(template.inputs, template.outputs, undefined, template.templateAttrs)));
- parameters.push(this.toAttrsParam(attrsExprs));
- // local refs (ex.: <ng-template #foo>)
- if (template.references && template.references.length) {
- parameters.push(this.prepareRefsParameter(template.references));
- parameters.push(importExpr(Identifiers$1.templateRefExtractor));
- }
- // Create the template function
- var templateVisitor = new TemplateDefinitionBuilder(this.constantPool, this._bindingScope, this.level + 1, contextName, this.i18n, templateIndex, templateName, this.directiveMatcher, this.directives, this.pipeTypeByName, this.pipes, this._namespace, this.fileBasedI18nSuffix, this.i18nUseExternalIds);
- // Nested templates must not be visited until after their parent templates have completed
- // processing, so they are queued here until after the initial pass. Otherwise, we wouldn't
- // be able to support bindings in nested templates to local refs that occur after the
- // template definition. e.g. <div *ngIf="showing">{{ foo }}</div> <div #foo></div>
- this._nestedTemplateFns.push(function () {
- var _a;
- var templateFunctionExpr = templateVisitor.buildTemplateFunction(template.children, template.variables, _this._ngContentReservedSlots.length + _this._ngContentSelectorsOffset, template.i18n);
- _this.constantPool.statements.push(templateFunctionExpr.toDeclStmt(templateName, null));
- if (templateVisitor._ngContentReservedSlots.length) {
- (_a = _this._ngContentReservedSlots).push.apply(_a, __spread(templateVisitor._ngContentReservedSlots));
- }
- });
- // e.g. template(1, MyComp_Template_1)
- this.creationInstruction(template.sourceSpan, Identifiers$1.templateCreate, function () {
- parameters.splice(2, 0, literal(templateVisitor.getConstCount()), literal(templateVisitor.getVarCount()));
- return trimTrailingNulls(parameters);
- });
- // handle property bindings e.g. ɵɵproperty('ngForOf', ctx.items), et al;
- this.templatePropertyBindings(templateIndex, template.templateAttrs);
- // Only add normal input/output binding instructions on explicit ng-template elements.
- if (template.tagName === NG_TEMPLATE_TAG_NAME) {
- // Add the input bindings
- this.templatePropertyBindings(templateIndex, template.inputs);
- // Generate listeners for directive output
- template.outputs.forEach(function (outputAst) {
- _this.creationInstruction(outputAst.sourceSpan, Identifiers$1.listener, _this.prepareListenerParameter('ng_template', outputAst, templateIndex));
- });
- }
- };
- TemplateDefinitionBuilder.prototype.visitBoundText = function (text) {
- var _this = this;
- if (this.i18n) {
- var value_3 = text.value.visit(this._valueConverter);
- this.allocateBindingSlots(value_3);
- if (value_3 instanceof Interpolation) {
- this.i18n.appendBoundText(text.i18n);
- this.i18nAppendBindings(value_3.expressions);
- }
- return;
- }
- var nodeIndex = this.allocateDataSlot();
- this.creationInstruction(text.sourceSpan, Identifiers$1.text, [literal(nodeIndex)]);
- var value = text.value.visit(this._valueConverter);
- this.allocateBindingSlots(value);
- if (value instanceof Interpolation) {
- this.updateInstruction(nodeIndex, text.sourceSpan, getTextInterpolationExpression(value), function () { return _this.getUpdateInstructionArguments(value); });
- }
- else {
- this.updateInstruction(nodeIndex, text.sourceSpan, Identifiers$1.textBinding, function () { return [_this.convertPropertyBinding(value)]; });
- }
- };
- TemplateDefinitionBuilder.prototype.visitText = function (text) {
- // when a text element is located within a translatable
- // block, we exclude this text element from instructions set,
- // since it will be captured in i18n content and processed at runtime
- if (!this.i18n) {
- this.creationInstruction(text.sourceSpan, Identifiers$1.text, [literal(this.allocateDataSlot()), literal(text.value)]);
- }
- };
- TemplateDefinitionBuilder.prototype.visitIcu = function (icu) {
- var initWasInvoked = false;
- // if an ICU was created outside of i18n block, we still treat
- // it as a translatable entity and invoke i18nStart and i18nEnd
- // to generate i18n context and the necessary instructions
- if (!this.i18n) {
- initWasInvoked = true;
- this.i18nStart(null, icu.i18n, true);
- }
- var i18n = this.i18n;
- var vars = this.i18nBindProps(icu.vars);
- var placeholders = this.i18nBindProps(icu.placeholders);
- // output ICU directly and keep ICU reference in context
- var message = icu.i18n;
- var transformFn = function (raw) {
- return instruction(null, Identifiers$1.i18nPostprocess, [raw, mapLiteral(vars, true)]);
- };
- // in case the whole i18n message is a single ICU - we do not need to
- // create a separate top-level translation, we can use the root ref instead
- // and make this ICU a top-level translation
- if (isSingleI18nIcu(i18n.meta)) {
- this.i18nTranslate(message, placeholders, i18n.ref, transformFn);
- }
- else {
- // output ICU directly and keep ICU reference in context
- var ref = this.i18nTranslate(message, placeholders, undefined, transformFn);
- i18n.appendIcu(icuFromI18nMessage(message).name, ref);
- }
- if (initWasInvoked) {
- this.i18nEnd(null, true);
- }
- return null;
- };
- TemplateDefinitionBuilder.prototype.allocateDataSlot = function () { return this._dataIndex++; };
- TemplateDefinitionBuilder.prototype.getConstCount = function () { return this._dataIndex; };
- TemplateDefinitionBuilder.prototype.getVarCount = function () { return this._pureFunctionSlots; };
- TemplateDefinitionBuilder.prototype.getNgContentSelectors = function () {
- return this._ngContentReservedSlots.length ?
- this.constantPool.getConstLiteral(asLiteral(this._ngContentReservedSlots), true) :
- null;
- };
- TemplateDefinitionBuilder.prototype.bindingContext = function () { return "" + this._bindingContext++; };
- TemplateDefinitionBuilder.prototype.templatePropertyBindings = function (templateIndex, attrs) {
- var _this = this;
- var propertyBindings = [];
- attrs.forEach(function (input) {
- if (input instanceof BoundAttribute) {
- var value_4 = input.value.visit(_this._valueConverter);
- if (value_4 !== undefined) {
- _this.allocateBindingSlots(value_4);
- propertyBindings.push({
- name: input.name,
- sourceSpan: input.sourceSpan,
- value: function () { return _this.convertPropertyBinding(value_4); }
- });
- }
- }
- });
- if (propertyBindings.length > 0) {
- this.updateInstructionChain(templateIndex, Identifiers$1.property, propertyBindings);
- }
- };
- // Bindings must only be resolved after all local refs have been visited, so all
- // instructions are queued in callbacks that execute once the initial pass has completed.
- // Otherwise, we wouldn't be able to support local refs that are defined after their
- // bindings. e.g. {{ foo }} <div #foo></div>
- TemplateDefinitionBuilder.prototype.instructionFn = function (fns, span, reference, paramsOrFn, prepend) {
- if (prepend === void 0) { prepend = false; }
- fns[prepend ? 'unshift' : 'push'](function () {
- var params = Array.isArray(paramsOrFn) ? paramsOrFn : paramsOrFn();
- return instruction(span, reference, params).toStmt();
- });
- };
- TemplateDefinitionBuilder.prototype.processStylingInstruction = function (elementIndex, instruction, createMode) {
- var _this = this;
- if (instruction) {
- var paramsFn = function () { return instruction.buildParams(function (value) { return _this.convertPropertyBinding(value); }); };
- if (createMode) {
- this.creationInstruction(instruction.sourceSpan, instruction.reference, paramsFn);
- }
- else {
- this.updateInstruction(elementIndex, instruction.sourceSpan, instruction.reference, paramsFn);
- }
- }
- };
- TemplateDefinitionBuilder.prototype.creationInstruction = function (span, reference, paramsOrFn, prepend) {
- this.instructionFn(this._creationCodeFns, span, reference, paramsOrFn || [], prepend);
- };
- TemplateDefinitionBuilder.prototype.updateInstruction = function (nodeIndex, span, reference, paramsOrFn) {
- this.addSelectInstructionIfNecessary(nodeIndex, span);
- this.instructionFn(this._updateCodeFns, span, reference, paramsOrFn || []);
- };
- TemplateDefinitionBuilder.prototype.updateInstructionChain = function (nodeIndex, reference, bindings) {
- var span = bindings.length ? bindings[0].sourceSpan : null;
- this.addSelectInstructionIfNecessary(nodeIndex, span);
- this._updateCodeFns.push(function () {
- var calls = bindings.map(function (property) {
- var fnParams = __spread([property.value()], (property.params || []));
- if (property.name) {
- fnParams.unshift(literal(property.name));
- }
- return fnParams;
- });
- return chainedInstruction(span, reference, calls).toStmt();
- });
- };
- TemplateDefinitionBuilder.prototype.addSelectInstructionIfNecessary = function (nodeIndex, span) {
- if (this._lastNodeIndexWithFlush < nodeIndex) {
- if (nodeIndex > 0) {
- this.instructionFn(this._updateCodeFns, span, Identifiers$1.select, [literal(nodeIndex)]);
- }
- this._lastNodeIndexWithFlush = nodeIndex;
- }
- };
- TemplateDefinitionBuilder.prototype.allocatePureFunctionSlots = function (numSlots) {
- var originalSlots = this._pureFunctionSlots;
- this._pureFunctionSlots += numSlots;
- return originalSlots;
- };
- TemplateDefinitionBuilder.prototype.allocateBindingSlots = function (value) {
- this._bindingSlots += value instanceof Interpolation ? value.expressions.length : 1;
- };
- /**
- * Gets an expression that refers to the implicit receiver. The implicit
- * receiver is always the root level context.
- */
- TemplateDefinitionBuilder.prototype.getImplicitReceiverExpr = function () {
- if (this._implicitReceiverExpr) {
- return this._implicitReceiverExpr;
- }
- return this._implicitReceiverExpr = this.level === 0 ?
- variable(CONTEXT_NAME) :
- this._bindingScope.getOrCreateSharedContextVar(0);
- };
- TemplateDefinitionBuilder.prototype.convertExpressionBinding = function (value) {
- var convertedPropertyBinding = convertPropertyBinding(this, this.getImplicitReceiverExpr(), value, this.bindingContext(), BindingForm.TrySimple);
- return convertedPropertyBinding.currValExpr;
- };
- TemplateDefinitionBuilder.prototype.convertPropertyBinding = function (value) {
- var _a;
- var interpolationFn = value instanceof Interpolation ? interpolate : function () { return error('Unexpected interpolation'); };
- var convertedPropertyBinding = convertPropertyBinding(this, this.getImplicitReceiverExpr(), value, this.bindingContext(), BindingForm.TrySimple, interpolationFn);
- var valExpr = convertedPropertyBinding.currValExpr;
- (_a = this._tempVariables).push.apply(_a, __spread(convertedPropertyBinding.stmts));
- return valExpr;
- };
- /**
- * Gets a list of argument expressions to pass to an update instruction expression. Also updates
- * the temp variables state with temp variables that were identified as needing to be created
- * while visiting the arguments.
- * @param value The original expression we will be resolving an arguments list from.
- */
- TemplateDefinitionBuilder.prototype.getUpdateInstructionArguments = function (value) {
- var _a;
- var _b = convertUpdateArguments(this, this.getImplicitReceiverExpr(), value, this.bindingContext()), args = _b.args, stmts = _b.stmts;
- (_a = this._tempVariables).push.apply(_a, __spread(stmts));
- return args;
- };
- TemplateDefinitionBuilder.prototype.matchDirectives = function (tagName, elOrTpl) {
- var _this = this;
- if (this.directiveMatcher) {
- var selector = createCssSelector(tagName, getAttrsForDirectiveMatching(elOrTpl));
- this.directiveMatcher.match(selector, function (cssSelector, staticType) { _this.directives.add(staticType); });
- }
- };
- /**
- * Prepares all attribute expression values for the `TAttributes` array.
- *
- * The purpose of this function is to properly construct an attributes array that
- * is passed into the `elementStart` (or just `element`) functions. Because there
- * are many different types of attributes, the array needs to be constructed in a
- * special way so that `elementStart` can properly evaluate them.
- *
- * The format looks like this:
- *
- * ```
- * attrs = [prop, value, prop2, value2,
- * CLASSES, class1, class2,
- * STYLES, style1, value1, style2, value2,
- * BINDINGS, name1, name2, name3,
- * TEMPLATE, name4, name5, name6,
- * I18N, name7, name8, ...]
- * ```
- *
- * Note that this function will fully ignore all synthetic (@foo) attribute values
- * because those values are intended to always be generated as property instructions.
- */
- TemplateDefinitionBuilder.prototype.prepareNonRenderAttrs = function (inputs, outputs, styles, templateAttrs, i18nAttrs) {
- if (templateAttrs === void 0) { templateAttrs = []; }
- if (i18nAttrs === void 0) { i18nAttrs = []; }
- var alreadySeen = new Set();
- var attrExprs = [];
- function addAttrExpr(key, value) {
- if (typeof key === 'string') {
- if (!alreadySeen.has(key)) {
- attrExprs.push.apply(attrExprs, __spread(getAttributeNameLiterals(key)));
- value !== undefined && attrExprs.push(value);
- alreadySeen.add(key);
- }
- }
- else {
- attrExprs.push(literal(key));
- }
- }
- // it's important that this occurs before BINDINGS and TEMPLATE because once `elementStart`
- // comes across the BINDINGS or TEMPLATE markers then it will continue reading each value as
- // as single property value cell by cell.
- if (styles) {
- styles.populateInitialStylingAttrs(attrExprs);
- }
- if (inputs.length || outputs.length) {
- var attrsStartIndex = attrExprs.length;
- for (var i = 0; i < inputs.length; i++) {
- var input = inputs[i];
- if (input.type !== 4 /* Animation */) {
- addAttrExpr(input.name);
- }
- }
- for (var i = 0; i < outputs.length; i++) {
- var output = outputs[i];
- if (output.type !== 1 /* Animation */) {
- addAttrExpr(output.name);
- }
- }
- // this is a cheap way of adding the marker only after all the input/output
- // values have been filtered (by not including the animation ones) and added
- // to the expressions. The marker is important because it tells the runtime
- // code that this is where attributes without values start...
- if (attrExprs.length) {
- attrExprs.splice(attrsStartIndex, 0, literal(3 /* Bindings */));
- }
- }
- if (templateAttrs.length) {
- attrExprs.push(literal(4 /* Template */));
- templateAttrs.forEach(function (attr) { return addAttrExpr(attr.name); });
- }
- if (i18nAttrs.length) {
- attrExprs.push(literal(6 /* I18n */));
- i18nAttrs.forEach(function (attr) { return addAttrExpr(attr.name); });
- }
- return attrExprs;
- };
- TemplateDefinitionBuilder.prototype.toAttrsParam = function (attrsExprs) {
- return attrsExprs.length > 0 ?
- this.constantPool.getConstLiteral(literalArr(attrsExprs), true) :
- TYPED_NULL_EXPR;
- };
- TemplateDefinitionBuilder.prototype.prepareRefsParameter = function (references) {
- var _this = this;
- if (!references || references.length === 0) {
- return TYPED_NULL_EXPR;
- }
- var refsParam = flatten(references.map(function (reference) {
- var slot = _this.allocateDataSlot();
- // Generate the update temporary.
- var variableName = _this._bindingScope.freshReferenceName();
- var retrievalLevel = _this.level;
- var lhs = variable(variableName);
- _this._bindingScope.set(retrievalLevel, reference.name, lhs, 0 /* DEFAULT */, function (scope, relativeLevel) {
- // e.g. nextContext(2);
- var nextContextStmt = relativeLevel > 0 ? [generateNextContextExpr(relativeLevel).toStmt()] : [];
- // e.g. const $foo$ = reference(1);
- var refExpr = lhs.set(importExpr(Identifiers$1.reference).callFn([literal(slot)]));
- return nextContextStmt.concat(refExpr.toConstDecl());
- }, true);
- return [reference.name, reference.value];
- }));
- return this.constantPool.getConstLiteral(asLiteral(refsParam), true);
- };
- TemplateDefinitionBuilder.prototype.prepareListenerParameter = function (tagName, outputAst, index) {
- var _this = this;
- return function () {
- var eventName = outputAst.name;
- var bindingFnName = outputAst.type === 1 /* Animation */ ?
- // synthetic @listener.foo values are treated the exact same as are standard listeners
- prepareSyntheticListenerFunctionName(eventName, outputAst.phase) :
- sanitizeIdentifier(eventName);
- var handlerName = _this.templateName + "_" + tagName + "_" + bindingFnName + "_" + index + "_listener";
- var scope = _this._bindingScope.nestedScope(_this._bindingScope.bindingLevel);
- return prepareEventListenerParameters(outputAst, handlerName, scope);
- };
- };
- return TemplateDefinitionBuilder;
- }());
- var ValueConverter = /** @class */ (function (_super) {
- __extends(ValueConverter, _super);
- function ValueConverter(constantPool, allocateSlot, allocatePureFunctionSlots, definePipe) {
- var _this = _super.call(this) || this;
- _this.constantPool = constantPool;
- _this.allocateSlot = allocateSlot;
- _this.allocatePureFunctionSlots = allocatePureFunctionSlots;
- _this.definePipe = definePipe;
- _this._pipeBindExprs = [];
- return _this;
- }
- // AstMemoryEfficientTransformer
- ValueConverter.prototype.visitPipe = function (pipe, context) {
- // Allocate a slot to create the pipe
- var slot = this.allocateSlot();
- var slotPseudoLocal = "PIPE:" + slot;
- // Allocate one slot for the result plus one slot per pipe argument
- var pureFunctionSlot = this.allocatePureFunctionSlots(2 + pipe.args.length);
- var target = new PropertyRead(pipe.span, new ImplicitReceiver(pipe.span), slotPseudoLocal);
- var _a = pipeBindingCallInfo(pipe.args), identifier = _a.identifier, isVarLength = _a.isVarLength;
- this.definePipe(pipe.name, slotPseudoLocal, slot, importExpr(identifier));
- var args = __spread([pipe.exp], pipe.args);
- var convertedArgs = isVarLength ? this.visitAll([new LiteralArray(pipe.span, args)]) : this.visitAll(args);
- var pipeBindExpr = new FunctionCall(pipe.span, target, __spread([
- new LiteralPrimitive(pipe.span, slot),
- new LiteralPrimitive(pipe.span, pureFunctionSlot)
- ], convertedArgs));
- this._pipeBindExprs.push(pipeBindExpr);
- return pipeBindExpr;
- };
- ValueConverter.prototype.updatePipeSlotOffsets = function (bindingSlots) {
- this._pipeBindExprs.forEach(function (pipe) {
- // update the slot offset arg (index 1) to account for binding slots
- var slotOffset = pipe.args[1];
- slotOffset.value += bindingSlots;
- });
- };
- ValueConverter.prototype.visitLiteralArray = function (array, context) {
- var _this = this;
- return new BuiltinFunctionCall(array.span, this.visitAll(array.expressions), function (values) {
- // If the literal has calculated (non-literal) elements transform it into
- // calls to literal factories that compose the literal and will cache intermediate
- // values. Otherwise, just return an literal array that contains the values.
- var literal = literalArr(values);
- return values.every(function (a) { return a.isConstant(); }) ?
- _this.constantPool.getConstLiteral(literal, true) :
- getLiteralFactory(_this.constantPool, literal, _this.allocatePureFunctionSlots);
- });
- };
- ValueConverter.prototype.visitLiteralMap = function (map, context) {
- var _this = this;
- return new BuiltinFunctionCall(map.span, this.visitAll(map.values), function (values) {
- // If the literal has calculated (non-literal) elements transform it into
- // calls to literal factories that compose the literal and will cache intermediate
- // values. Otherwise, just return an literal array that contains the values.
- var literal = literalMap(values.map(function (value, index) { return ({ key: map.keys[index].key, value: value, quoted: map.keys[index].quoted }); }));
- return values.every(function (a) { return a.isConstant(); }) ?
- _this.constantPool.getConstLiteral(literal, true) :
- getLiteralFactory(_this.constantPool, literal, _this.allocatePureFunctionSlots);
- });
- };
- return ValueConverter;
- }(AstMemoryEfficientTransformer));
- // Pipes always have at least one parameter, the value they operate on
- var pipeBindingIdentifiers = [Identifiers$1.pipeBind1, Identifiers$1.pipeBind2, Identifiers$1.pipeBind3, Identifiers$1.pipeBind4];
- function pipeBindingCallInfo(args) {
- var identifier = pipeBindingIdentifiers[args.length];
- return {
- identifier: identifier || Identifiers$1.pipeBindV,
- isVarLength: !identifier,
- };
- }
- var pureFunctionIdentifiers = [
- Identifiers$1.pureFunction0, Identifiers$1.pureFunction1, Identifiers$1.pureFunction2, Identifiers$1.pureFunction3, Identifiers$1.pureFunction4,
- Identifiers$1.pureFunction5, Identifiers$1.pureFunction6, Identifiers$1.pureFunction7, Identifiers$1.pureFunction8
- ];
- function pureFunctionCallInfo(args) {
- var identifier = pureFunctionIdentifiers[args.length];
- return {
- identifier: identifier || Identifiers$1.pureFunctionV,
- isVarLength: !identifier,
- };
- }
- function instruction(span, reference, params) {
- return importExpr(reference, null, span).callFn(params, span);
- }
- function chainedInstruction(span, reference, calls) {
- var expression = importExpr(reference, null, span);
- if (calls.length > 0) {
- for (var i = 0; i < calls.length; i++) {
- expression = expression.callFn(calls[i], span);
- }
- }
- else {
- // Add a blank invocation, in case the `calls` array is empty.
- expression = expression.callFn([], span);
- }
- return expression;
- }
- // e.g. x(2);
- function generateNextContextExpr(relativeLevelDiff) {
- return importExpr(Identifiers$1.nextContext)
- .callFn(relativeLevelDiff > 1 ? [literal(relativeLevelDiff)] : []);
- }
- function getLiteralFactory(constantPool, literal$1, allocateSlots) {
- var _a = constantPool.getLiteralFactory(literal$1), literalFactory = _a.literalFactory, literalFactoryArguments = _a.literalFactoryArguments;
- // Allocate 1 slot for the result plus 1 per argument
- var startSlot = allocateSlots(1 + literalFactoryArguments.length);
- literalFactoryArguments.length > 0 || error("Expected arguments to a literal factory function");
- var _b = pureFunctionCallInfo(literalFactoryArguments), identifier = _b.identifier, isVarLength = _b.isVarLength;
- // Literal factories are pure functions that only need to be re-invoked when the parameters
- // change.
- var args = [
- literal(startSlot),
- literalFactory,
- ];
- if (isVarLength) {
- args.push(literalArr(literalFactoryArguments));
- }
- else {
- args.push.apply(args, __spread(literalFactoryArguments));
- }
- return importExpr(identifier).callFn(args);
- }
- /**
- * Gets an array of literals that can be added to an expression
- * to represent the name and namespace of an attribute. E.g.
- * `:xlink:href` turns into `[AttributeMarker.NamespaceURI, 'xlink', 'href']`.
- *
- * @param name Name of the attribute, including the namespace.
- */
- function getAttributeNameLiterals(name) {
- var _a = __read(splitNsName(name), 2), attributeNamespace = _a[0], attributeName = _a[1];
- var nameLiteral = literal(attributeName);
- if (attributeNamespace) {
- return [
- literal(0 /* NamespaceURI */), literal(attributeNamespace), nameLiteral
- ];
- }
- return [nameLiteral];
- }
- /** The prefix used to get a shared context in BindingScope's map. */
- var SHARED_CONTEXT_KEY = '$$shared_ctx$$';
- var BindingScope = /** @class */ (function () {
- function BindingScope(bindingLevel, parent) {
- if (bindingLevel === void 0) { bindingLevel = 0; }
- if (parent === void 0) { parent = null; }
- this.bindingLevel = bindingLevel;
- this.parent = parent;
- /** Keeps a map from local variables to their BindingData. */
- this.map = new Map();
- this.referenceNameIndex = 0;
- this.restoreViewVariable = null;
- }
- Object.defineProperty(BindingScope, "ROOT_SCOPE", {
- get: function () {
- if (!BindingScope._ROOT_SCOPE) {
- BindingScope._ROOT_SCOPE = new BindingScope().set(0, '$event', variable('$event'));
- }
- return BindingScope._ROOT_SCOPE;
- },
- enumerable: true,
- configurable: true
- });
- BindingScope.prototype.get = function (name) {
- var current = this;
- while (current) {
- var value = current.map.get(name);
- if (value != null) {
- if (current !== this) {
- // make a local copy and reset the `declare` state
- value = {
- retrievalLevel: value.retrievalLevel,
- lhs: value.lhs,
- declareLocalCallback: value.declareLocalCallback,
- declare: false,
- priority: value.priority,
- localRef: value.localRef
- };
- // Cache the value locally.
- this.map.set(name, value);
- // Possibly generate a shared context var
- this.maybeGenerateSharedContextVar(value);
- this.maybeRestoreView(value.retrievalLevel, value.localRef);
- }
- if (value.declareLocalCallback && !value.declare) {
- value.declare = true;
- }
- return value.lhs;
- }
- current = current.parent;
- }
- // If we get to this point, we are looking for a property on the top level component
- // - If level === 0, we are on the top and don't need to re-declare `ctx`.
- // - If level > 0, we are in an embedded view. We need to retrieve the name of the
- // local var we used to store the component context, e.g. const $comp$ = x();
- return this.bindingLevel === 0 ? null : this.getComponentProperty(name);
- };
- /**
- * Create a local variable for later reference.
- *
- * @param retrievalLevel The level from which this value can be retrieved
- * @param name Name of the variable.
- * @param lhs AST representing the left hand side of the `let lhs = rhs;`.
- * @param priority The sorting priority of this var
- * @param declareLocalCallback The callback to invoke when declaring this local var
- * @param localRef Whether or not this is a local ref
- */
- BindingScope.prototype.set = function (retrievalLevel, name, lhs, priority, declareLocalCallback, localRef) {
- if (priority === void 0) { priority = 0 /* DEFAULT */; }
- if (this.map.has(name)) {
- if (localRef) {
- // Do not throw an error if it's a local ref and do not update existing value,
- // so the first defined ref is always returned.
- return this;
- }
- error("The name " + name + " is already defined in scope to be " + this.map.get(name));
- }
- this.map.set(name, {
- retrievalLevel: retrievalLevel,
- lhs: lhs,
- declare: false,
- declareLocalCallback: declareLocalCallback,
- priority: priority,
- localRef: localRef || false
- });
- return this;
- };
- // Implemented as part of LocalResolver.
- BindingScope.prototype.getLocal = function (name) { return this.get(name); };
- // Implemented as part of LocalResolver.
- BindingScope.prototype.notifyImplicitReceiverUse = function () {
- if (this.bindingLevel !== 0) {
- // Since the implicit receiver is accessed in an embedded view, we need to
- // ensure that we declare a shared context variable for the current template
- // in the update variables.
- this.map.get(SHARED_CONTEXT_KEY + 0).declare = true;
- }
- };
- BindingScope.prototype.nestedScope = function (level) {
- var newScope = new BindingScope(level, this);
- if (level > 0)
- newScope.generateSharedContextVar(0);
- return newScope;
- };
- /**
- * Gets or creates a shared context variable and returns its expression. Note that
- * this does not mean that the shared variable will be declared. Variables in the
- * binding scope will be only declared if they are used.
- */
- BindingScope.prototype.getOrCreateSharedContextVar = function (retrievalLevel) {
- var bindingKey = SHARED_CONTEXT_KEY + retrievalLevel;
- if (!this.map.has(bindingKey)) {
- this.generateSharedContextVar(retrievalLevel);
- }
- return this.map.get(bindingKey).lhs;
- };
- BindingScope.prototype.getSharedContextName = function (retrievalLevel) {
- var sharedCtxObj = this.map.get(SHARED_CONTEXT_KEY + retrievalLevel);
- return sharedCtxObj && sharedCtxObj.declare ? sharedCtxObj.lhs : null;
- };
- BindingScope.prototype.maybeGenerateSharedContextVar = function (value) {
- if (value.priority === 1 /* CONTEXT */ &&
- value.retrievalLevel < this.bindingLevel) {
- var sharedCtxObj = this.map.get(SHARED_CONTEXT_KEY + value.retrievalLevel);
- if (sharedCtxObj) {
- sharedCtxObj.declare = true;
- }
- else {
- this.generateSharedContextVar(value.retrievalLevel);
- }
- }
- };
- BindingScope.prototype.generateSharedContextVar = function (retrievalLevel) {
- var lhs = variable(CONTEXT_NAME + this.freshReferenceName());
- this.map.set(SHARED_CONTEXT_KEY + retrievalLevel, {
- retrievalLevel: retrievalLevel,
- lhs: lhs,
- declareLocalCallback: function (scope, relativeLevel) {
- // const ctx_r0 = nextContext(2);
- return [lhs.set(generateNextContextExpr(relativeLevel)).toConstDecl()];
- },
- declare: false,
- priority: 2 /* SHARED_CONTEXT */,
- localRef: false
- });
- };
- BindingScope.prototype.getComponentProperty = function (name) {
- var componentValue = this.map.get(SHARED_CONTEXT_KEY + 0);
- componentValue.declare = true;
- this.maybeRestoreView(0, false);
- return componentValue.lhs.prop(name);
- };
- BindingScope.prototype.maybeRestoreView = function (retrievalLevel, localRefLookup) {
- // We want to restore the current view in listener fns if:
- // 1 - we are accessing a value in a parent view, which requires walking the view tree rather
- // than using the ctx arg. In this case, the retrieval and binding level will be different.
- // 2 - we are looking up a local ref, which requires restoring the view where the local
- // ref is stored
- if (this.isListenerScope() && (retrievalLevel < this.bindingLevel || localRefLookup)) {
- if (!this.parent.restoreViewVariable) {
- // parent saves variable to generate a shared `const $s$ = getCurrentView();` instruction
- this.parent.restoreViewVariable = variable(this.parent.freshReferenceName());
- }
- this.restoreViewVariable = this.parent.restoreViewVariable;
- }
- };
- BindingScope.prototype.restoreViewStatement = function () {
- // restoreView($state$);
- return this.restoreViewVariable ?
- [instruction(null, Identifiers$1.restoreView, [this.restoreViewVariable]).toStmt()] :
- [];
- };
- BindingScope.prototype.viewSnapshotStatements = function () {
- // const $state$ = getCurrentView();
- var getCurrentViewInstruction = instruction(null, Identifiers$1.getCurrentView, []);
- return this.restoreViewVariable ?
- [this.restoreViewVariable.set(getCurrentViewInstruction).toConstDecl()] :
- [];
- };
- BindingScope.prototype.isListenerScope = function () { return this.parent && this.parent.bindingLevel === this.bindingLevel; };
- BindingScope.prototype.variableDeclarations = function () {
- var _this = this;
- var currentContextLevel = 0;
- return Array.from(this.map.values())
- .filter(function (value) { return value.declare; })
- .sort(function (a, b) { return b.retrievalLevel - a.retrievalLevel || b.priority - a.priority; })
- .reduce(function (stmts, value) {
- var levelDiff = _this.bindingLevel - value.retrievalLevel;
- var currStmts = value.declareLocalCallback(_this, levelDiff - currentContextLevel);
- currentContextLevel = levelDiff;
- return stmts.concat(currStmts);
- }, []);
- };
- BindingScope.prototype.freshReferenceName = function () {
- var current = this;
- // Find the top scope as it maintains the global reference count
- while (current.parent)
- current = current.parent;
- var ref = "" + REFERENCE_PREFIX + current.referenceNameIndex++;
- return ref;
- };
- return BindingScope;
- }());
- /**
- * Creates a `CssSelector` given a tag name and a map of attributes
- */
- function createCssSelector(tag, attributes) {
- var cssSelector = new CssSelector();
- cssSelector.setElement(tag);
- Object.getOwnPropertyNames(attributes).forEach(function (name) {
- var value = attributes[name];
- cssSelector.addAttribute(name, value);
- if (name.toLowerCase() === 'class') {
- var classes = value.trim().split(/\s+/);
- classes.forEach(function (className) { return cssSelector.addClassName(className); });
- }
- });
- return cssSelector;
- }
- /**
- * Creates an array of expressions out of an `ngProjectAs` attributes
- * which can be added to the instruction parameters.
- */
- function getNgProjectAsLiteral(attribute) {
- // Parse the attribute value into a CssSelectorList. Note that we only take the
- // first selector, because we don't support multiple selectors in ngProjectAs.
- var parsedR3Selector = parseSelectorToR3Selector(attribute.value)[0];
- return [literal(5 /* ProjectAs */), asLiteral(parsedR3Selector)];
- }
- function interpolate(args) {
- args = args.slice(1); // Ignore the length prefix added for render2
- switch (args.length) {
- case 3:
- return importExpr(Identifiers$1.interpolation1).callFn(args);
- case 5:
- return importExpr(Identifiers$1.interpolation2).callFn(args);
- case 7:
- return importExpr(Identifiers$1.interpolation3).callFn(args);
- case 9:
- return importExpr(Identifiers$1.interpolation4).callFn(args);
- case 11:
- return importExpr(Identifiers$1.interpolation5).callFn(args);
- case 13:
- return importExpr(Identifiers$1.interpolation6).callFn(args);
- case 15:
- return importExpr(Identifiers$1.interpolation7).callFn(args);
- case 17:
- return importExpr(Identifiers$1.interpolation8).callFn(args);
- }
- (args.length >= 19 && args.length % 2 == 1) ||
- error("Invalid interpolation argument length " + args.length);
- return importExpr(Identifiers$1.interpolationV).callFn([literalArr(args)]);
- }
- /**
- * Gets the instruction to generate for an interpolated property
- * @param interpolation An Interpolation AST
- */
- function getPropertyInterpolationExpression(interpolation) {
- switch (getInterpolationArgsLength(interpolation)) {
- case 1:
- return Identifiers$1.propertyInterpolate;
- case 3:
- return Identifiers$1.propertyInterpolate1;
- case 5:
- return Identifiers$1.propertyInterpolate2;
- case 7:
- return Identifiers$1.propertyInterpolate3;
- case 9:
- return Identifiers$1.propertyInterpolate4;
- case 11:
- return Identifiers$1.propertyInterpolate5;
- case 13:
- return Identifiers$1.propertyInterpolate6;
- case 15:
- return Identifiers$1.propertyInterpolate7;
- case 17:
- return Identifiers$1.propertyInterpolate8;
- default:
- return Identifiers$1.propertyInterpolateV;
- }
- }
- /**
- * Gets the instruction to generate for an interpolated attribute
- * @param interpolation An Interpolation AST
- */
- function getAttributeInterpolationExpression(interpolation) {
- switch (getInterpolationArgsLength(interpolation)) {
- case 3:
- return Identifiers$1.attributeInterpolate1;
- case 5:
- return Identifiers$1.attributeInterpolate2;
- case 7:
- return Identifiers$1.attributeInterpolate3;
- case 9:
- return Identifiers$1.attributeInterpolate4;
- case 11:
- return Identifiers$1.attributeInterpolate5;
- case 13:
- return Identifiers$1.attributeInterpolate6;
- case 15:
- return Identifiers$1.attributeInterpolate7;
- case 17:
- return Identifiers$1.attributeInterpolate8;
- default:
- return Identifiers$1.attributeInterpolateV;
- }
- }
- /**
- * Gets the instruction to generate for interpolated text.
- * @param interpolation An Interpolation AST
- */
- function getTextInterpolationExpression(interpolation) {
- switch (getInterpolationArgsLength(interpolation)) {
- case 1:
- return Identifiers$1.textInterpolate;
- case 3:
- return Identifiers$1.textInterpolate1;
- case 5:
- return Identifiers$1.textInterpolate2;
- case 7:
- return Identifiers$1.textInterpolate3;
- case 9:
- return Identifiers$1.textInterpolate4;
- case 11:
- return Identifiers$1.textInterpolate5;
- case 13:
- return Identifiers$1.textInterpolate6;
- case 15:
- return Identifiers$1.textInterpolate7;
- case 17:
- return Identifiers$1.textInterpolate8;
- default:
- return Identifiers$1.textInterpolateV;
- }
- }
- /**
- * Gets the number of arguments expected to be passed to a generated instruction in the case of
- * interpolation instructions.
- * @param interpolation An interpolation ast
- */
- function getInterpolationArgsLength(interpolation) {
- var expressions = interpolation.expressions, strings = interpolation.strings;
- if (expressions.length === 1 && strings.length === 2 && strings[0] === '' && strings[1] === '') {
- // If the interpolation has one interpolated value, but the prefix and suffix are both empty
- // strings, we only pass one argument, to a special instruction like `propertyInterpolate` or
- // `textInterpolate`.
- return 1;
- }
- else {
- return expressions.length + strings.length;
- }
- }
- /**
- * Parse a template into render3 `Node`s and additional metadata, with no other dependencies.
- *
- * @param template text of the template to parse
- * @param templateUrl URL to use for source mapping of the parsed template
- * @param options options to modify how the template is parsed
- */
- function parseTemplate(template, templateUrl, options) {
- if (options === void 0) { options = {}; }
- var interpolationConfig = options.interpolationConfig, preserveWhitespaces = options.preserveWhitespaces;
- var bindingParser = makeBindingParser(interpolationConfig);
- var htmlParser = new HtmlParser();
- var parseResult = htmlParser.parse(template, templateUrl, __assign({ leadingTriviaChars: LEADING_TRIVIA_CHARS }, options, { tokenizeExpansionForms: true }));
- if (parseResult.errors && parseResult.errors.length > 0) {
- return { errors: parseResult.errors, nodes: [], styleUrls: [], styles: [] };
- }
- var rootNodes = parseResult.rootNodes;
- // process i18n meta information (scan attributes, generate ids)
- // before we run whitespace removal process, because existing i18n
- // extraction process (ng xi18n) relies on a raw content to generate
- // message ids
- rootNodes =
- visitAll$1(new I18nMetaVisitor(interpolationConfig, !preserveWhitespaces), rootNodes);
- if (!preserveWhitespaces) {
- rootNodes = visitAll$1(new WhitespaceVisitor(), rootNodes);
- // run i18n meta visitor again in case we remove whitespaces, because
- // that might affect generated i18n message content. During this pass
- // i18n IDs generated at the first pass will be preserved, so we can mimic
- // existing extraction process (ng xi18n)
- rootNodes = visitAll$1(new I18nMetaVisitor(interpolationConfig, /* keepI18nAttrs */ false), rootNodes);
- }
- var _a = htmlAstToRender3Ast(rootNodes, bindingParser), nodes = _a.nodes, errors = _a.errors, styleUrls = _a.styleUrls, styles = _a.styles;
- if (errors && errors.length > 0) {
- return { errors: errors, nodes: [], styleUrls: [], styles: [] };
- }
- return { nodes: nodes, styleUrls: styleUrls, styles: styles };
- }
- /**
- * Construct a `BindingParser` with a default configuration.
- */
- function makeBindingParser(interpolationConfig) {
- if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }
- return new BindingParser(new Parser$1(new Lexer()), interpolationConfig, new DomElementSchemaRegistry(), null, []);
- }
- function resolveSanitizationFn(context, isAttribute) {
- switch (context) {
- case SecurityContext.HTML:
- return importExpr(Identifiers$1.sanitizeHtml);
- case SecurityContext.SCRIPT:
- return importExpr(Identifiers$1.sanitizeScript);
- case SecurityContext.STYLE:
- // the compiler does not fill in an instruction for [style.prop?] binding
- // values because the style algorithm knows internally what props are subject
- // to sanitization (only [attr.style] values are explicitly sanitized)
- return isAttribute ? importExpr(Identifiers$1.sanitizeStyle) : null;
- case SecurityContext.URL:
- return importExpr(Identifiers$1.sanitizeUrl);
- case SecurityContext.RESOURCE_URL:
- return importExpr(Identifiers$1.sanitizeResourceUrl);
- default:
- return null;
- }
- }
- function isSingleElementTemplate(children) {
- return children.length === 1 && children[0] instanceof Element;
- }
- function isTextNode(node) {
- return node instanceof Text || node instanceof BoundText || node instanceof Icu;
- }
- function hasTextChildrenOnly(children) {
- return children.every(isTextNode);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var EMPTY_ARRAY = [];
- // This regex matches any binding names that contain the "attr." prefix, e.g. "attr.required"
- // If there is a match, the first matching group will contain the attribute name to bind.
- var ATTR_REGEX = /attr\.([^\]]+)/;
- function getStylingPrefix(name) {
- return name.substring(0, 5); // style or class
- }
- function baseDirectiveFields(meta, constantPool, bindingParser) {
- var definitionMap = new DefinitionMap();
- // e.g. `type: MyDirective`
- definitionMap.set('type', meta.type);
- // e.g. `selectors: [['', 'someDir', '']]`
- definitionMap.set('selectors', createDirectiveSelector(meta.selector));
- // e.g. `factory: () => new MyApp(directiveInject(ElementRef))`
- var result = compileFactoryFunction({
- name: meta.name,
- type: meta.type,
- deps: meta.deps,
- injectFn: Identifiers$1.directiveInject,
- });
- definitionMap.set('factory', result.factory);
- if (meta.queries.length > 0) {
- // e.g. `contentQueries: (rf, ctx, dirIndex) => { ... }
- definitionMap.set('contentQueries', createContentQueriesFunction(meta.queries, constantPool, meta.name));
- }
- if (meta.viewQueries.length) {
- definitionMap.set('viewQuery', createViewQueriesFunction(meta.viewQueries, constantPool, meta.name));
- }
- // e.g. `hostBindings: (rf, ctx, elIndex) => { ... }
- definitionMap.set('hostBindings', createHostBindingsFunction(meta.host, meta.typeSourceSpan, bindingParser, constantPool, meta.selector || '', meta.name));
- // e.g 'inputs: {a: 'a'}`
- definitionMap.set('inputs', conditionallyCreateMapObjectLiteral(meta.inputs, true));
- // e.g 'outputs: {a: 'a'}`
- definitionMap.set('outputs', conditionallyCreateMapObjectLiteral(meta.outputs));
- if (meta.exportAs !== null) {
- definitionMap.set('exportAs', literalArr(meta.exportAs.map(function (e) { return literal(e); })));
- }
- return { definitionMap: definitionMap, statements: result.statements };
- }
- /**
- * Add features to the definition map.
- */
- function addFeatures(definitionMap, meta) {
- // e.g. `features: [NgOnChangesFeature()]`
- var features = [];
- var providers = meta.providers;
- var viewProviders = meta.viewProviders;
- if (providers || viewProviders) {
- var args = [providers || new LiteralArrayExpr([])];
- if (viewProviders) {
- args.push(viewProviders);
- }
- features.push(importExpr(Identifiers$1.ProvidersFeature).callFn(args));
- }
- if (meta.usesInheritance) {
- features.push(importExpr(Identifiers$1.InheritDefinitionFeature));
- }
- if (meta.lifecycle.usesOnChanges) {
- features.push(importExpr(Identifiers$1.NgOnChangesFeature).callFn(EMPTY_ARRAY));
- }
- if (features.length) {
- definitionMap.set('features', literalArr(features));
- }
- }
- /**
- * Compile a directive for the render3 runtime as defined by the `R3DirectiveMetadata`.
- */
- function compileDirectiveFromMetadata(meta, constantPool, bindingParser) {
- var _a = baseDirectiveFields(meta, constantPool, bindingParser), definitionMap = _a.definitionMap, statements = _a.statements;
- addFeatures(definitionMap, meta);
- var expression = importExpr(Identifiers$1.defineDirective).callFn([definitionMap.toLiteralMap()]);
- if (!meta.selector) {
- throw new Error("Directive " + meta.name + " has no selector, please add it!");
- }
- var type = createTypeForDef(meta, Identifiers$1.DirectiveDefWithMeta);
- return { expression: expression, type: type, statements: statements };
- }
- /**
- * Compile a base definition for the render3 runtime as defined by {@link R3BaseRefMetadata}
- * @param meta the metadata used for compilation.
- */
- function compileBaseDefFromMetadata(meta, constantPool, bindingParser) {
- var definitionMap = new DefinitionMap();
- if (meta.inputs) {
- var inputs_1 = meta.inputs;
- var inputsMap = Object.keys(inputs_1).map(function (key) {
- var v = inputs_1[key];
- var value = Array.isArray(v) ? literalArr(v.map(function (vx) { return literal(vx); })) : literal(v);
- return { key: key, value: value, quoted: false };
- });
- definitionMap.set('inputs', literalMap(inputsMap));
- }
- if (meta.outputs) {
- var outputs_1 = meta.outputs;
- var outputsMap = Object.keys(outputs_1).map(function (key) {
- var value = literal(outputs_1[key]);
- return { key: key, value: value, quoted: false };
- });
- definitionMap.set('outputs', literalMap(outputsMap));
- }
- if (meta.viewQueries && meta.viewQueries.length > 0) {
- definitionMap.set('viewQuery', createViewQueriesFunction(meta.viewQueries, constantPool));
- }
- if (meta.queries && meta.queries.length > 0) {
- definitionMap.set('contentQueries', createContentQueriesFunction(meta.queries, constantPool));
- }
- if (meta.host) {
- definitionMap.set('hostBindings', createHostBindingsFunction(meta.host, meta.typeSourceSpan, bindingParser, constantPool, meta.name));
- }
- var expression = importExpr(Identifiers$1.defineBase).callFn([definitionMap.toLiteralMap()]);
- var type = new ExpressionType(importExpr(Identifiers$1.BaseDef));
- return { expression: expression, type: type };
- }
- /**
- * Compile a component for the render3 runtime as defined by the `R3ComponentMetadata`.
- */
- function compileComponentFromMetadata(meta, constantPool, bindingParser) {
- var e_1, _a;
- var _b = baseDirectiveFields(meta, constantPool, bindingParser), definitionMap = _b.definitionMap, statements = _b.statements;
- addFeatures(definitionMap, meta);
- var selector = meta.selector && CssSelector.parse(meta.selector);
- var firstSelector = selector && selector[0];
- // e.g. `attr: ["class", ".my.app"]`
- // This is optional an only included if the first selector of a component specifies attributes.
- if (firstSelector) {
- var selectorAttributes = firstSelector.getAttrs();
- if (selectorAttributes.length) {
- definitionMap.set('attrs', constantPool.getConstLiteral(literalArr(selectorAttributes.map(function (value) { return value != null ? literal(value) : literal(undefined); })),
- /* forceShared */ true));
- }
- }
- // Generate the CSS matcher that recognize directive
- var directiveMatcher = null;
- if (meta.directives.length > 0) {
- var matcher = new SelectorMatcher();
- try {
- for (var _c = __values(meta.directives), _d = _c.next(); !_d.done; _d = _c.next()) {
- var _e = _d.value, selector_1 = _e.selector, expression_1 = _e.expression;
- matcher.addSelectables(CssSelector.parse(selector_1), expression_1);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_1) throw e_1.error; }
- }
- directiveMatcher = matcher;
- }
- // e.g. `template: function MyComponent_Template(_ctx, _cm) {...}`
- var templateTypeName = meta.name;
- var templateName = templateTypeName ? templateTypeName + "_Template" : null;
- var directivesUsed = new Set();
- var pipesUsed = new Set();
- var changeDetection = meta.changeDetection;
- var template = meta.template;
- var templateBuilder = new TemplateDefinitionBuilder(constantPool, BindingScope.ROOT_SCOPE, 0, templateTypeName, null, null, templateName, directiveMatcher, directivesUsed, meta.pipes, pipesUsed, Identifiers$1.namespaceHTML, meta.relativeContextFilePath, meta.i18nUseExternalIds);
- var templateFunctionExpression = templateBuilder.buildTemplateFunction(template.nodes, []);
- // We need to provide this so that dynamically generated components know what
- // projected content blocks to pass through to the component when it is instantiated.
- var ngContentSelectors = templateBuilder.getNgContentSelectors();
- if (ngContentSelectors) {
- definitionMap.set('ngContentSelectors', ngContentSelectors);
- }
- // e.g. `consts: 2`
- definitionMap.set('consts', literal(templateBuilder.getConstCount()));
- // e.g. `vars: 2`
- definitionMap.set('vars', literal(templateBuilder.getVarCount()));
- definitionMap.set('template', templateFunctionExpression);
- // e.g. `directives: [MyDirective]`
- if (directivesUsed.size) {
- var directivesExpr = literalArr(Array.from(directivesUsed));
- if (meta.wrapDirectivesAndPipesInClosure) {
- directivesExpr = fn([], [new ReturnStatement(directivesExpr)]);
- }
- definitionMap.set('directives', directivesExpr);
- }
- // e.g. `pipes: [MyPipe]`
- if (pipesUsed.size) {
- var pipesExpr = literalArr(Array.from(pipesUsed));
- if (meta.wrapDirectivesAndPipesInClosure) {
- pipesExpr = fn([], [new ReturnStatement(pipesExpr)]);
- }
- definitionMap.set('pipes', pipesExpr);
- }
- if (meta.encapsulation === null) {
- meta.encapsulation = ViewEncapsulation.Emulated;
- }
- // e.g. `styles: [str1, str2]`
- if (meta.styles && meta.styles.length) {
- var styleValues = meta.encapsulation == ViewEncapsulation.Emulated ?
- compileStyles(meta.styles, CONTENT_ATTR, HOST_ATTR) :
- meta.styles;
- var strings = styleValues.map(function (str) { return literal(str); });
- definitionMap.set('styles', literalArr(strings));
- }
- else if (meta.encapsulation === ViewEncapsulation.Emulated) {
- // If there is no style, don't generate css selectors on elements
- meta.encapsulation = ViewEncapsulation.None;
- }
- // Only set view encapsulation if it's not the default value
- if (meta.encapsulation !== ViewEncapsulation.Emulated) {
- definitionMap.set('encapsulation', literal(meta.encapsulation));
- }
- // e.g. `animation: [trigger('123', [])]`
- if (meta.animations !== null) {
- definitionMap.set('data', literalMap([{ key: 'animation', value: meta.animations, quoted: false }]));
- }
- // Only set the change detection flag if it's defined and it's not the default.
- if (changeDetection != null && changeDetection !== ChangeDetectionStrategy.Default) {
- definitionMap.set('changeDetection', literal(changeDetection));
- }
- // On the type side, remove newlines from the selector as it will need to fit into a TypeScript
- // string literal, which must be on one line.
- var selectorForType = (meta.selector || '').replace(/\n/g, '');
- var expression = importExpr(Identifiers$1.defineComponent).callFn([definitionMap.toLiteralMap()]);
- var type = createTypeForDef(meta, Identifiers$1.ComponentDefWithMeta);
- return { expression: expression, type: type, statements: statements };
- }
- function prepareQueryParams(query, constantPool) {
- var parameters = [
- getQueryPredicate(query, constantPool),
- literal(query.descendants),
- query.read || literal(null),
- ];
- return parameters;
- }
- // Turn a directive selector into an R3-compatible selector for directive def
- function createDirectiveSelector(selector) {
- return asLiteral(parseSelectorToR3Selector(selector));
- }
- function convertAttributesToExpressions(attributes) {
- var e_2, _a;
- var values = [];
- try {
- for (var _b = __values(Object.getOwnPropertyNames(attributes)), _c = _b.next(); !_c.done; _c = _b.next()) {
- var key = _c.value;
- var value = attributes[key];
- values.push(literal(key), value);
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_2) throw e_2.error; }
- }
- return values;
- }
- // Define and update any content queries
- function createContentQueriesFunction(queries, constantPool, name) {
- var e_3, _a;
- var createStatements = [];
- var updateStatements = [];
- var tempAllocator = temporaryAllocator(updateStatements, TEMPORARY_NAME);
- try {
- for (var queries_1 = __values(queries), queries_1_1 = queries_1.next(); !queries_1_1.done; queries_1_1 = queries_1.next()) {
- var query = queries_1_1.value;
- // creation, e.g. r3.contentQuery(dirIndex, somePredicate, true, null);
- var args = __spread([variable('dirIndex')], prepareQueryParams(query, constantPool));
- var queryInstruction = query.static ? Identifiers$1.staticContentQuery : Identifiers$1.contentQuery;
- createStatements.push(importExpr(queryInstruction).callFn(args).toStmt());
- // update, e.g. (r3.queryRefresh(tmp = r3.loadContentQuery()) && (ctx.someDir = tmp));
- var temporary = tempAllocator();
- var getQueryList = importExpr(Identifiers$1.loadContentQuery).callFn([]);
- var refresh = importExpr(Identifiers$1.queryRefresh).callFn([temporary.set(getQueryList)]);
- var updateDirective = variable(CONTEXT_NAME)
- .prop(query.propertyName)
- .set(query.first ? temporary.prop('first') : temporary);
- updateStatements.push(refresh.and(updateDirective).toStmt());
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (queries_1_1 && !queries_1_1.done && (_a = queries_1.return)) _a.call(queries_1);
- }
- finally { if (e_3) throw e_3.error; }
- }
- var contentQueriesFnName = name ? name + "_ContentQueries" : null;
- return fn([
- new FnParam(RENDER_FLAGS, NUMBER_TYPE), new FnParam(CONTEXT_NAME, null),
- new FnParam('dirIndex', null)
- ], [
- renderFlagCheckIfStmt(1 /* Create */, createStatements),
- renderFlagCheckIfStmt(2 /* Update */, updateStatements)
- ], INFERRED_TYPE, null, contentQueriesFnName);
- }
- function stringAsType(str) {
- return expressionType(literal(str));
- }
- function stringMapAsType(map) {
- var mapValues = Object.keys(map).map(function (key) {
- var value = Array.isArray(map[key]) ? map[key][0] : map[key];
- return {
- key: key,
- value: literal(value),
- quoted: true,
- };
- });
- return expressionType(literalMap(mapValues));
- }
- function stringArrayAsType(arr) {
- return arr.length > 0 ? expressionType(literalArr(arr.map(function (value) { return literal(value); }))) :
- NONE_TYPE;
- }
- function createTypeForDef(meta, typeBase) {
- // On the type side, remove newlines from the selector as it will need to fit into a TypeScript
- // string literal, which must be on one line.
- var selectorForType = (meta.selector || '').replace(/\n/g, '');
- return expressionType(importExpr(typeBase, [
- typeWithParameters(meta.type, meta.typeArgumentCount),
- stringAsType(selectorForType),
- meta.exportAs !== null ? stringArrayAsType(meta.exportAs) : NONE_TYPE,
- stringMapAsType(meta.inputs),
- stringMapAsType(meta.outputs),
- stringArrayAsType(meta.queries.map(function (q) { return q.propertyName; })),
- ]));
- }
- // Define and update any view queries
- function createViewQueriesFunction(viewQueries, constantPool, name) {
- var createStatements = [];
- var updateStatements = [];
- var tempAllocator = temporaryAllocator(updateStatements, TEMPORARY_NAME);
- viewQueries.forEach(function (query) {
- var queryInstruction = query.static ? Identifiers$1.staticViewQuery : Identifiers$1.viewQuery;
- // creation, e.g. r3.viewQuery(somePredicate, true);
- var queryDefinition = importExpr(queryInstruction).callFn(prepareQueryParams(query, constantPool));
- createStatements.push(queryDefinition.toStmt());
- // update, e.g. (r3.queryRefresh(tmp = r3.loadViewQuery()) && (ctx.someDir = tmp));
- var temporary = tempAllocator();
- var getQueryList = importExpr(Identifiers$1.loadViewQuery).callFn([]);
- var refresh = importExpr(Identifiers$1.queryRefresh).callFn([temporary.set(getQueryList)]);
- var updateDirective = variable(CONTEXT_NAME)
- .prop(query.propertyName)
- .set(query.first ? temporary.prop('first') : temporary);
- updateStatements.push(refresh.and(updateDirective).toStmt());
- });
- var viewQueryFnName = name ? name + "_Query" : null;
- return fn([new FnParam(RENDER_FLAGS, NUMBER_TYPE), new FnParam(CONTEXT_NAME, null)], [
- renderFlagCheckIfStmt(1 /* Create */, createStatements),
- renderFlagCheckIfStmt(2 /* Update */, updateStatements)
- ], INFERRED_TYPE, null, viewQueryFnName);
- }
- // Return a host binding function or null if one is not necessary.
- function createHostBindingsFunction(hostBindingsMetadata, typeSourceSpan, bindingParser, constantPool, selector, name) {
- // Initialize hostVarsCount to number of bound host properties (interpolations illegal),
- // except 'style' and 'class' properties, since they should *not* allocate host var slots
- var hostVarsCount = Object.keys(hostBindingsMetadata.properties)
- .filter(function (name) {
- var prefix = getStylingPrefix(name);
- return prefix !== 'style' && prefix !== 'class';
- })
- .length;
- var elVarExp = variable('elIndex');
- var bindingContext = variable(CONTEXT_NAME);
- var styleBuilder = new StylingBuilder(elVarExp, bindingContext);
- var _a = hostBindingsMetadata.specialAttributes, styleAttr = _a.styleAttr, classAttr = _a.classAttr;
- if (styleAttr !== undefined) {
- styleBuilder.registerStyleAttr(styleAttr);
- }
- if (classAttr !== undefined) {
- styleBuilder.registerClassAttr(classAttr);
- }
- var createStatements = [];
- var updateStatements = [];
- var totalHostVarsCount = hostVarsCount;
- var hostBindingSourceSpan = typeSourceSpan;
- var directiveSummary = metadataAsSummary(hostBindingsMetadata);
- var valueConverter;
- var getValueConverter = function () {
- if (!valueConverter) {
- var hostVarsCountFn = function (numSlots) {
- var originalVarsCount = totalHostVarsCount;
- totalHostVarsCount += numSlots;
- return originalVarsCount;
- };
- valueConverter = new ValueConverter(constantPool, function () { return error('Unexpected node'); }, // new nodes are illegal here
- hostVarsCountFn, function () { return error('Unexpected pipe'); }); // pipes are illegal here
- }
- return valueConverter;
- };
- // Calculate host event bindings
- var eventBindings = bindingParser.createDirectiveHostEventAsts(directiveSummary, hostBindingSourceSpan);
- if (eventBindings && eventBindings.length) {
- var listeners = createHostListeners(eventBindings, name);
- createStatements.push.apply(createStatements, __spread(listeners));
- }
- // Calculate the host property bindings
- var bindings = bindingParser.createBoundHostProperties(directiveSummary, hostBindingSourceSpan);
- (bindings || []).forEach(function (binding) {
- var name = binding.name;
- var stylingInputWasSet = styleBuilder.registerInputBasedOnName(name, binding.expression, binding.sourceSpan);
- if (!stylingInputWasSet) {
- // resolve literal arrays and literal objects
- var value = binding.expression.visit(getValueConverter());
- var bindingExpr = bindingFn(bindingContext, value);
- var _a = getBindingNameAndInstruction(binding), bindingName = _a.bindingName, instruction = _a.instruction, isAttribute = _a.isAttribute;
- var securityContexts = bindingParser.calcPossibleSecurityContexts(selector, bindingName, isAttribute)
- .filter(function (context) { return context !== SecurityContext.NONE; });
- var sanitizerFn = null;
- if (securityContexts.length) {
- if (securityContexts.length === 2 &&
- securityContexts.indexOf(SecurityContext.URL) > -1 &&
- securityContexts.indexOf(SecurityContext.RESOURCE_URL) > -1) {
- // Special case for some URL attributes (such as "src" and "href") that may be a part
- // of different security contexts. In this case we use special santitization function and
- // select the actual sanitizer at runtime based on a tag name that is provided while
- // invoking sanitization function.
- sanitizerFn = importExpr(Identifiers$1.sanitizeUrlOrResourceUrl);
- }
- else {
- sanitizerFn = resolveSanitizationFn(securityContexts[0], isAttribute);
- }
- }
- var instructionParams = [literal(bindingName), bindingExpr.currValExpr];
- if (sanitizerFn) {
- instructionParams.push(sanitizerFn);
- }
- if (!isAttribute) {
- if (!sanitizerFn) {
- // append `null` in front of `nativeOnly` flag if no sanitizer fn defined
- instructionParams.push(literal(null));
- }
- // host bindings must have nativeOnly prop set to true
- instructionParams.push(literal(true));
- }
- updateStatements.push.apply(updateStatements, __spread(bindingExpr.stmts));
- updateStatements.push(importExpr(instruction).callFn(instructionParams).toStmt());
- }
- });
- // since we're dealing with directives/components and both have hostBinding
- // functions, we need to generate a special hostAttrs instruction that deals
- // with both the assignment of styling as well as static attributes to the host
- // element. The instruction below will instruct all initial styling (styling
- // that is inside of a host binding within a directive/component) to be attached
- // to the host element alongside any of the provided host attributes that were
- // collected earlier.
- var hostAttrs = convertAttributesToExpressions(hostBindingsMetadata.attributes);
- var hostInstruction = styleBuilder.buildHostAttrsInstruction(null, hostAttrs, constantPool);
- if (hostInstruction) {
- createStatements.push(createStylingStmt(hostInstruction, bindingContext, bindingFn));
- }
- if (styleBuilder.hasBindings) {
- // singular style/class bindings (things like `[style.prop]` and `[class.name]`)
- // MUST be registered on a given element within the component/directive
- // templateFn/hostBindingsFn functions. The instruction below will figure out
- // what all the bindings are and then generate the statements required to register
- // those bindings to the element via `styling`.
- var stylingInstruction = styleBuilder.buildStylingInstruction(null, constantPool);
- if (stylingInstruction) {
- createStatements.push(createStylingStmt(stylingInstruction, bindingContext, bindingFn));
- }
- // finally each binding that was registered in the statement above will need to be added to
- // the update block of a component/directive templateFn/hostBindingsFn so that the bindings
- // are evaluated and updated for the element.
- styleBuilder.buildUpdateLevelInstructions(getValueConverter()).forEach(function (instruction) {
- totalHostVarsCount += instruction.allocateBindingSlots;
- updateStatements.push(createStylingStmt(instruction, bindingContext, bindingFn));
- });
- }
- if (totalHostVarsCount) {
- createStatements.unshift(importExpr(Identifiers$1.allocHostVars).callFn([literal(totalHostVarsCount)]).toStmt());
- }
- if (createStatements.length > 0 || updateStatements.length > 0) {
- var hostBindingsFnName = name ? name + "_HostBindings" : null;
- var statements = [];
- if (createStatements.length > 0) {
- statements.push(renderFlagCheckIfStmt(1 /* Create */, createStatements));
- }
- if (updateStatements.length > 0) {
- statements.push(renderFlagCheckIfStmt(2 /* Update */, updateStatements));
- }
- return fn([
- new FnParam(RENDER_FLAGS, NUMBER_TYPE), new FnParam(CONTEXT_NAME, null),
- new FnParam(elVarExp.name, NUMBER_TYPE)
- ], statements, INFERRED_TYPE, null, hostBindingsFnName);
- }
- return null;
- }
- function bindingFn(implicit, value) {
- return convertPropertyBinding(null, implicit, value, 'b', BindingForm.TrySimple, function () { return error('Unexpected interpolation'); });
- }
- function createStylingStmt(instruction, bindingContext, bindingFn) {
- var params = instruction.buildParams(function (value) { return bindingFn(bindingContext, value).currValExpr; });
- return importExpr(instruction.reference, null, instruction.sourceSpan)
- .callFn(params, instruction.sourceSpan)
- .toStmt();
- }
- function getBindingNameAndInstruction(binding) {
- var bindingName = binding.name;
- var instruction;
- // Check to see if this is an attr binding or a property binding
- var attrMatches = bindingName.match(ATTR_REGEX);
- if (attrMatches) {
- bindingName = attrMatches[1];
- instruction = Identifiers$1.attribute;
- }
- else {
- if (binding.isAnimation) {
- bindingName = prepareSyntheticPropertyName(bindingName);
- // host bindings that have a synthetic property (e.g. @foo) should always be rendered
- // in the context of the component and not the parent. Therefore there is a special
- // compatibility instruction available for this purpose.
- instruction = Identifiers$1.updateSyntheticHostBinding;
- }
- else {
- instruction = Identifiers$1.property;
- }
- }
- return { bindingName: bindingName, instruction: instruction, isAttribute: !!attrMatches };
- }
- function createHostListeners(eventBindings, name) {
- return eventBindings.map(function (binding) {
- var bindingName = binding.name && sanitizeIdentifier(binding.name);
- var bindingFnName = binding.type === 1 /* Animation */ ?
- prepareSyntheticListenerFunctionName(bindingName, binding.targetOrPhase) :
- bindingName;
- var handlerName = name && bindingName ? name + "_" + bindingFnName + "_HostBindingHandler" : null;
- var params = prepareEventListenerParameters(BoundEvent.fromParsedEvent(binding), handlerName);
- var instruction = binding.type == 1 /* Animation */ ? Identifiers$1.componentHostSyntheticListener : Identifiers$1.listener;
- return importExpr(instruction).callFn(params).toStmt();
- });
- }
- function metadataAsSummary(meta) {
- // clang-format off
- return {
- // This is used by the BindingParser, which only deals with listeners and properties. There's no
- // need to pass attributes to it.
- hostAttributes: {},
- hostListeners: meta.listeners,
- hostProperties: meta.properties,
- };
- // clang-format on
- }
- var HOST_REG_EXP$1 = /^(?:\[([^\]]+)\])|(?:\(([^\)]+)\))$/;
- function parseHostBindings(host) {
- var e_4, _a;
- var attributes = {};
- var listeners = {};
- var properties = {};
- var specialAttributes = {};
- try {
- for (var _b = __values(Object.keys(host)), _c = _b.next(); !_c.done; _c = _b.next()) {
- var key = _c.value;
- var value = host[key];
- var matches = key.match(HOST_REG_EXP$1);
- if (matches === null) {
- switch (key) {
- case 'class':
- if (typeof value !== 'string') {
- // TODO(alxhub): make this a diagnostic.
- throw new Error("Class binding must be string");
- }
- specialAttributes.classAttr = value;
- break;
- case 'style':
- if (typeof value !== 'string') {
- // TODO(alxhub): make this a diagnostic.
- throw new Error("Style binding must be string");
- }
- specialAttributes.styleAttr = value;
- break;
- default:
- if (typeof value === 'string') {
- attributes[key] = literal(value);
- }
- else {
- attributes[key] = value;
- }
- }
- }
- else if (matches[1 /* Binding */] != null) {
- if (typeof value !== 'string') {
- // TODO(alxhub): make this a diagnostic.
- throw new Error("Property binding must be string");
- }
- // synthetic properties (the ones that have a `@` as a prefix)
- // are still treated the same as regular properties. Therefore
- // there is no point in storing them in a separate map.
- properties[matches[1 /* Binding */]] = value;
- }
- else if (matches[2 /* Event */] != null) {
- if (typeof value !== 'string') {
- // TODO(alxhub): make this a diagnostic.
- throw new Error("Event binding must be string");
- }
- listeners[matches[2 /* Event */]] = value;
- }
- }
- }
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_4) throw e_4.error; }
- }
- return { attributes: attributes, listeners: listeners, properties: properties, specialAttributes: specialAttributes };
- }
- /**
- * Verifies host bindings and returns the list of errors (if any). Empty array indicates that a
- * given set of host bindings has no errors.
- *
- * @param bindings set of host bindings to verify.
- * @param sourceSpan source span where host bindings were defined.
- * @returns array of errors associated with a given set of host bindings.
- */
- function verifyHostBindings(bindings, sourceSpan) {
- var summary = metadataAsSummary(bindings);
- // TODO: abstract out host bindings verification logic and use it instead of
- // creating events and properties ASTs to detect errors (FW-996)
- var bindingParser = makeBindingParser();
- bindingParser.createDirectiveHostEventAsts(summary, sourceSpan);
- bindingParser.createBoundHostProperties(summary, sourceSpan);
- return bindingParser.errors;
- }
- function compileStyles(styles, selector, hostSelector) {
- var shadowCss = new ShadowCss();
- return styles.map(function (style) { return shadowCss.shimCssText(style, selector, hostSelector); });
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * An interface for retrieving documents by URL that the compiler uses
- * to load templates.
- */
- var ResourceLoader = /** @class */ (function () {
- function ResourceLoader() {
- }
- ResourceLoader.prototype.get = function (url) { return ''; };
- return ResourceLoader;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var CompilerFacadeImpl = /** @class */ (function () {
- function CompilerFacadeImpl(jitEvaluator) {
- if (jitEvaluator === void 0) { jitEvaluator = new JitEvaluator(); }
- this.jitEvaluator = jitEvaluator;
- this.R3ResolvedDependencyType = R3ResolvedDependencyType;
- this.ResourceLoader = ResourceLoader;
- this.elementSchemaRegistry = new DomElementSchemaRegistry();
- }
- CompilerFacadeImpl.prototype.compilePipe = function (angularCoreEnv, sourceMapUrl, facade) {
- var res = compilePipeFromMetadata({
- name: facade.name,
- type: new WrappedNodeExpr(facade.type),
- typeArgumentCount: facade.typeArgumentCount,
- deps: convertR3DependencyMetadataArray(facade.deps),
- pipeName: facade.pipeName,
- pure: facade.pure,
- });
- return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, res.statements);
- };
- CompilerFacadeImpl.prototype.compileInjectable = function (angularCoreEnv, sourceMapUrl, facade) {
- var _a = compileInjectable({
- name: facade.name,
- type: new WrappedNodeExpr(facade.type),
- typeArgumentCount: facade.typeArgumentCount,
- providedIn: computeProvidedIn(facade.providedIn),
- useClass: wrapExpression(facade, USE_CLASS),
- useFactory: wrapExpression(facade, USE_FACTORY),
- useValue: wrapExpression(facade, USE_VALUE),
- useExisting: wrapExpression(facade, USE_EXISTING),
- ctorDeps: convertR3DependencyMetadataArray(facade.ctorDeps),
- userDeps: convertR3DependencyMetadataArray(facade.userDeps) || undefined,
- }), expression = _a.expression, statements = _a.statements;
- return this.jitExpression(expression, angularCoreEnv, sourceMapUrl, statements);
- };
- CompilerFacadeImpl.prototype.compileInjector = function (angularCoreEnv, sourceMapUrl, facade) {
- var meta = {
- name: facade.name,
- type: new WrappedNodeExpr(facade.type),
- deps: convertR3DependencyMetadataArray(facade.deps),
- providers: new WrappedNodeExpr(facade.providers),
- imports: facade.imports.map(function (i) { return new WrappedNodeExpr(i); }),
- };
- var res = compileInjector(meta);
- return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, res.statements);
- };
- CompilerFacadeImpl.prototype.compileNgModule = function (angularCoreEnv, sourceMapUrl, facade) {
- var meta = {
- type: new WrappedNodeExpr(facade.type),
- bootstrap: facade.bootstrap.map(wrapReference),
- declarations: facade.declarations.map(wrapReference),
- imports: facade.imports.map(wrapReference),
- exports: facade.exports.map(wrapReference),
- emitInline: true,
- containsForwardDecls: false,
- schemas: facade.schemas ? facade.schemas.map(wrapReference) : null,
- id: facade.id ? new WrappedNodeExpr(facade.id) : null,
- };
- var res = compileNgModule(meta);
- return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, []);
- };
- CompilerFacadeImpl.prototype.compileDirective = function (angularCoreEnv, sourceMapUrl, facade) {
- var constantPool = new ConstantPool();
- var bindingParser = makeBindingParser();
- var meta = convertDirectiveFacadeToMetadata(facade);
- var res = compileDirectiveFromMetadata(meta, constantPool, bindingParser);
- var preStatements = __spread(constantPool.statements, res.statements);
- return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, preStatements);
- };
- CompilerFacadeImpl.prototype.compileComponent = function (angularCoreEnv, sourceMapUrl, facade) {
- // The ConstantPool is a requirement of the JIT'er.
- var constantPool = new ConstantPool();
- var interpolationConfig = facade.interpolation ?
- InterpolationConfig.fromArray(facade.interpolation) :
- DEFAULT_INTERPOLATION_CONFIG;
- // Parse the template and check for errors.
- var template = parseTemplate(facade.template, sourceMapUrl, { preserveWhitespaces: facade.preserveWhitespaces, interpolationConfig: interpolationConfig });
- if (template.errors !== undefined) {
- var errors = template.errors.map(function (err) { return err.toString(); }).join(', ');
- throw new Error("Errors during JIT compilation of template for " + facade.name + ": " + errors);
- }
- // Compile the component metadata, including template, into an expression.
- // TODO(alxhub): implement inputs, outputs, queries, etc.
- var res = compileComponentFromMetadata(__assign({}, facade, convertDirectiveFacadeToMetadata(facade), { selector: facade.selector || this.elementSchemaRegistry.getDefaultComponentElementName(), template: template, wrapDirectivesAndPipesInClosure: false, styles: facade.styles || [], encapsulation: facade.encapsulation, interpolation: interpolationConfig, changeDetection: facade.changeDetection, animations: facade.animations != null ? new WrappedNodeExpr(facade.animations) : null, viewProviders: facade.viewProviders != null ? new WrappedNodeExpr(facade.viewProviders) :
- null, relativeContextFilePath: '', i18nUseExternalIds: true }), constantPool, makeBindingParser(interpolationConfig));
- var preStatements = __spread(constantPool.statements, res.statements);
- return this.jitExpression(res.expression, angularCoreEnv, "ng:///" + facade.name + ".js", preStatements);
- };
- CompilerFacadeImpl.prototype.compileBase = function (angularCoreEnv, sourceMapUrl, facade) {
- var constantPool = new ConstantPool();
- var typeSourceSpan = this.createParseSourceSpan('Base', facade.name, "ng:///" + facade.name + ".js");
- var meta = __assign({}, facade, { typeSourceSpan: typeSourceSpan, viewQueries: facade.viewQueries ? facade.viewQueries.map(convertToR3QueryMetadata) :
- facade.viewQueries, queries: facade.queries ? facade.queries.map(convertToR3QueryMetadata) : facade.queries, host: extractHostBindings(facade.propMetadata, typeSourceSpan) });
- var res = compileBaseDefFromMetadata(meta, constantPool, makeBindingParser());
- return this.jitExpression(res.expression, angularCoreEnv, sourceMapUrl, constantPool.statements);
- };
- CompilerFacadeImpl.prototype.createParseSourceSpan = function (kind, typeName, sourceUrl) {
- return r3JitTypeSourceSpan(kind, typeName, sourceUrl);
- };
- /**
- * JIT compiles an expression and returns the result of executing that expression.
- *
- * @param def the definition which will be compiled and executed to get the value to patch
- * @param context an object map of @angular/core symbol names to symbols which will be available
- * in the context of the compiled expression
- * @param sourceUrl a URL to use for the source map of the compiled expression
- * @param preStatements a collection of statements that should be evaluated before the expression.
- */
- CompilerFacadeImpl.prototype.jitExpression = function (def, context, sourceUrl, preStatements) {
- // The ConstantPool may contain Statements which declare variables used in the final expression.
- // Therefore, its statements need to precede the actual JIT operation. The final statement is a
- // declaration of $def which is set to the expression being compiled.
- var statements = __spread(preStatements, [
- new DeclareVarStmt('$def', def, undefined, [StmtModifier.Exported]),
- ]);
- var res = this.jitEvaluator.evaluateStatements(sourceUrl, statements, new R3JitReflector(context), /* enableSourceMaps */ true);
- return res['$def'];
- };
- return CompilerFacadeImpl;
- }());
- var USE_CLASS = Object.keys({ useClass: null })[0];
- var USE_FACTORY = Object.keys({ useFactory: null })[0];
- var USE_VALUE = Object.keys({ useValue: null })[0];
- var USE_EXISTING = Object.keys({ useExisting: null })[0];
- var wrapReference = function (value) {
- var wrapped = new WrappedNodeExpr(value);
- return { value: wrapped, type: wrapped };
- };
- function convertToR3QueryMetadata(facade) {
- return __assign({}, facade, { predicate: Array.isArray(facade.predicate) ? facade.predicate :
- new WrappedNodeExpr(facade.predicate), read: facade.read ? new WrappedNodeExpr(facade.read) : null, static: facade.static });
- }
- function convertDirectiveFacadeToMetadata(facade) {
- var inputsFromMetadata = parseInputOutputs(facade.inputs || []);
- var outputsFromMetadata = parseInputOutputs(facade.outputs || []);
- var propMetadata = facade.propMetadata;
- var inputsFromType = {};
- var outputsFromType = {};
- var _loop_1 = function (field) {
- if (propMetadata.hasOwnProperty(field)) {
- propMetadata[field].forEach(function (ann) {
- if (isInput(ann)) {
- inputsFromType[field] =
- ann.bindingPropertyName ? [ann.bindingPropertyName, field] : field;
- }
- else if (isOutput(ann)) {
- outputsFromType[field] = ann.bindingPropertyName || field;
- }
- });
- }
- };
- for (var field in propMetadata) {
- _loop_1(field);
- }
- return __assign({}, facade, { typeSourceSpan: facade.typeSourceSpan, type: new WrappedNodeExpr(facade.type), deps: convertR3DependencyMetadataArray(facade.deps), host: extractHostBindings(facade.propMetadata, facade.typeSourceSpan, facade.host), inputs: __assign({}, inputsFromMetadata, inputsFromType), outputs: __assign({}, outputsFromMetadata, outputsFromType), queries: facade.queries.map(convertToR3QueryMetadata), providers: facade.providers != null ? new WrappedNodeExpr(facade.providers) : null, viewQueries: facade.viewQueries.map(convertToR3QueryMetadata) });
- }
- function wrapExpression(obj, property) {
- if (obj.hasOwnProperty(property)) {
- return new WrappedNodeExpr(obj[property]);
- }
- else {
- return undefined;
- }
- }
- function computeProvidedIn(providedIn) {
- if (providedIn == null || typeof providedIn === 'string') {
- return new LiteralExpr(providedIn);
- }
- else {
- return new WrappedNodeExpr(providedIn);
- }
- }
- function convertR3DependencyMetadata(facade) {
- var tokenExpr;
- if (facade.token === null) {
- tokenExpr = new LiteralExpr(null);
- }
- else if (facade.resolved === R3ResolvedDependencyType.Attribute) {
- tokenExpr = new LiteralExpr(facade.token);
- }
- else {
- tokenExpr = new WrappedNodeExpr(facade.token);
- }
- return {
- token: tokenExpr,
- resolved: facade.resolved,
- host: facade.host,
- optional: facade.optional,
- self: facade.self,
- skipSelf: facade.skipSelf
- };
- }
- function convertR3DependencyMetadataArray(facades) {
- return facades == null ? null : facades.map(convertR3DependencyMetadata);
- }
- function extractHostBindings(propMetadata, sourceSpan, host) {
- // First parse the declarations from the metadata.
- var bindings = parseHostBindings(host || {});
- // After that check host bindings for errors
- var errors = verifyHostBindings(bindings, sourceSpan);
- if (errors.length) {
- throw new Error(errors.map(function (error) { return error.msg; }).join('\n'));
- }
- var _loop_2 = function (field) {
- if (propMetadata.hasOwnProperty(field)) {
- propMetadata[field].forEach(function (ann) {
- if (isHostBinding(ann)) {
- bindings.properties[ann.hostPropertyName || field] = field;
- }
- else if (isHostListener(ann)) {
- bindings.listeners[ann.eventName || field] = field + "(" + (ann.args || []).join(',') + ")";
- }
- });
- }
- };
- // Next, loop over the properties of the object, looking for @HostBinding and @HostListener.
- for (var field in propMetadata) {
- _loop_2(field);
- }
- return bindings;
- }
- function isHostBinding(value) {
- return value.ngMetadataName === 'HostBinding';
- }
- function isHostListener(value) {
- return value.ngMetadataName === 'HostListener';
- }
- function isInput(value) {
- return value.ngMetadataName === 'Input';
- }
- function isOutput(value) {
- return value.ngMetadataName === 'Output';
- }
- function parseInputOutputs(values) {
- return values.reduce(function (map, value) {
- var _a = __read(value.split(',').map(function (piece) { return piece.trim(); }), 2), field = _a[0], property = _a[1];
- map[field] = property || field;
- return map;
- }, {});
- }
- function publishFacade(global) {
- var ng = global.ng || (global.ng = {});
- ng.ɵcompilerFacade = new CompilerFacadeImpl();
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var VERSION$1 = new Version('8.1.3');
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var CompilerConfig = /** @class */ (function () {
- function CompilerConfig(_a) {
- var _b = _a === void 0 ? {} : _a, _c = _b.defaultEncapsulation, defaultEncapsulation = _c === void 0 ? ViewEncapsulation.Emulated : _c, _d = _b.useJit, useJit = _d === void 0 ? true : _d, _e = _b.jitDevMode, jitDevMode = _e === void 0 ? false : _e, _f = _b.missingTranslation, missingTranslation = _f === void 0 ? null : _f, preserveWhitespaces = _b.preserveWhitespaces, strictInjectionParameters = _b.strictInjectionParameters;
- this.defaultEncapsulation = defaultEncapsulation;
- this.useJit = !!useJit;
- this.jitDevMode = !!jitDevMode;
- this.missingTranslation = missingTranslation;
- this.preserveWhitespaces = preserveWhitespacesDefault(noUndefined(preserveWhitespaces));
- this.strictInjectionParameters = strictInjectionParameters === true;
- }
- return CompilerConfig;
- }());
- function preserveWhitespacesDefault(preserveWhitespacesOption, defaultSetting) {
- if (defaultSetting === void 0) { defaultSetting = false; }
- return preserveWhitespacesOption === null ? defaultSetting : preserveWhitespacesOption;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var DirectiveNormalizer = /** @class */ (function () {
- function DirectiveNormalizer(_resourceLoader, _urlResolver, _htmlParser, _config) {
- this._resourceLoader = _resourceLoader;
- this._urlResolver = _urlResolver;
- this._htmlParser = _htmlParser;
- this._config = _config;
- this._resourceLoaderCache = new Map();
- }
- DirectiveNormalizer.prototype.clearCache = function () { this._resourceLoaderCache.clear(); };
- DirectiveNormalizer.prototype.clearCacheFor = function (normalizedDirective) {
- var _this = this;
- if (!normalizedDirective.isComponent) {
- return;
- }
- var template = normalizedDirective.template;
- this._resourceLoaderCache.delete(template.templateUrl);
- template.externalStylesheets.forEach(function (stylesheet) { _this._resourceLoaderCache.delete(stylesheet.moduleUrl); });
- };
- DirectiveNormalizer.prototype._fetch = function (url) {
- var result = this._resourceLoaderCache.get(url);
- if (!result) {
- result = this._resourceLoader.get(url);
- this._resourceLoaderCache.set(url, result);
- }
- return result;
- };
- DirectiveNormalizer.prototype.normalizeTemplate = function (prenormData) {
- var _this = this;
- if (isDefined(prenormData.template)) {
- if (isDefined(prenormData.templateUrl)) {
- throw syntaxError("'" + stringify(prenormData.componentType) + "' component cannot define both template and templateUrl");
- }
- if (typeof prenormData.template !== 'string') {
- throw syntaxError("The template specified for component " + stringify(prenormData.componentType) + " is not a string");
- }
- }
- else if (isDefined(prenormData.templateUrl)) {
- if (typeof prenormData.templateUrl !== 'string') {
- throw syntaxError("The templateUrl specified for component " + stringify(prenormData.componentType) + " is not a string");
- }
- }
- else {
- throw syntaxError("No template specified for component " + stringify(prenormData.componentType));
- }
- if (isDefined(prenormData.preserveWhitespaces) &&
- typeof prenormData.preserveWhitespaces !== 'boolean') {
- throw syntaxError("The preserveWhitespaces option for component " + stringify(prenormData.componentType) + " must be a boolean");
- }
- return SyncAsync.then(this._preParseTemplate(prenormData), function (preparsedTemplate) { return _this._normalizeTemplateMetadata(prenormData, preparsedTemplate); });
- };
- DirectiveNormalizer.prototype._preParseTemplate = function (prenomData) {
- var _this = this;
- var template;
- var templateUrl;
- if (prenomData.template != null) {
- template = prenomData.template;
- templateUrl = prenomData.moduleUrl;
- }
- else {
- templateUrl = this._urlResolver.resolve(prenomData.moduleUrl, prenomData.templateUrl);
- template = this._fetch(templateUrl);
- }
- return SyncAsync.then(template, function (template) { return _this._preparseLoadedTemplate(prenomData, template, templateUrl); });
- };
- DirectiveNormalizer.prototype._preparseLoadedTemplate = function (prenormData, template, templateAbsUrl) {
- var isInline = !!prenormData.template;
- var interpolationConfig = InterpolationConfig.fromArray(prenormData.interpolation);
- var templateUrl = templateSourceUrl({ reference: prenormData.ngModuleType }, { type: { reference: prenormData.componentType } }, { isInline: isInline, templateUrl: templateAbsUrl });
- var rootNodesAndErrors = this._htmlParser.parse(template, templateUrl, { tokenizeExpansionForms: true, interpolationConfig: interpolationConfig });
- if (rootNodesAndErrors.errors.length > 0) {
- var errorString = rootNodesAndErrors.errors.join('\n');
- throw syntaxError("Template parse errors:\n" + errorString);
- }
- var templateMetadataStyles = this._normalizeStylesheet(new CompileStylesheetMetadata({ styles: prenormData.styles, moduleUrl: prenormData.moduleUrl }));
- var visitor = new TemplatePreparseVisitor();
- visitAll$1(visitor, rootNodesAndErrors.rootNodes);
- var templateStyles = this._normalizeStylesheet(new CompileStylesheetMetadata({ styles: visitor.styles, styleUrls: visitor.styleUrls, moduleUrl: templateAbsUrl }));
- var styles = templateMetadataStyles.styles.concat(templateStyles.styles);
- var inlineStyleUrls = templateMetadataStyles.styleUrls.concat(templateStyles.styleUrls);
- var styleUrls = this
- ._normalizeStylesheet(new CompileStylesheetMetadata({ styleUrls: prenormData.styleUrls, moduleUrl: prenormData.moduleUrl }))
- .styleUrls;
- return {
- template: template,
- templateUrl: templateAbsUrl, isInline: isInline,
- htmlAst: rootNodesAndErrors, styles: styles, inlineStyleUrls: inlineStyleUrls, styleUrls: styleUrls,
- ngContentSelectors: visitor.ngContentSelectors,
- };
- };
- DirectiveNormalizer.prototype._normalizeTemplateMetadata = function (prenormData, preparsedTemplate) {
- var _this = this;
- return SyncAsync.then(this._loadMissingExternalStylesheets(preparsedTemplate.styleUrls.concat(preparsedTemplate.inlineStyleUrls)), function (externalStylesheets) { return _this._normalizeLoadedTemplateMetadata(prenormData, preparsedTemplate, externalStylesheets); });
- };
- DirectiveNormalizer.prototype._normalizeLoadedTemplateMetadata = function (prenormData, preparsedTemplate, stylesheets) {
- // Algorithm:
- // - produce exactly 1 entry per original styleUrl in
- // CompileTemplateMetadata.externalStylesheets with all styles inlined
- // - inline all styles that are referenced by the template into CompileTemplateMetadata.styles.
- // Reason: be able to determine how many stylesheets there are even without loading
- // the template nor the stylesheets, so we can create a stub for TypeScript always synchronously
- // (as resource loading may be async)
- var _this = this;
- var styles = __spread(preparsedTemplate.styles);
- this._inlineStyles(preparsedTemplate.inlineStyleUrls, stylesheets, styles);
- var styleUrls = preparsedTemplate.styleUrls;
- var externalStylesheets = styleUrls.map(function (styleUrl) {
- var stylesheet = stylesheets.get(styleUrl);
- var styles = __spread(stylesheet.styles);
- _this._inlineStyles(stylesheet.styleUrls, stylesheets, styles);
- return new CompileStylesheetMetadata({ moduleUrl: styleUrl, styles: styles });
- });
- var encapsulation = prenormData.encapsulation;
- if (encapsulation == null) {
- encapsulation = this._config.defaultEncapsulation;
- }
- if (encapsulation === ViewEncapsulation.Emulated && styles.length === 0 &&
- styleUrls.length === 0) {
- encapsulation = ViewEncapsulation.None;
- }
- return new CompileTemplateMetadata({
- encapsulation: encapsulation,
- template: preparsedTemplate.template,
- templateUrl: preparsedTemplate.templateUrl,
- htmlAst: preparsedTemplate.htmlAst, styles: styles, styleUrls: styleUrls,
- ngContentSelectors: preparsedTemplate.ngContentSelectors,
- animations: prenormData.animations,
- interpolation: prenormData.interpolation,
- isInline: preparsedTemplate.isInline, externalStylesheets: externalStylesheets,
- preserveWhitespaces: preserveWhitespacesDefault(prenormData.preserveWhitespaces, this._config.preserveWhitespaces),
- });
- };
- DirectiveNormalizer.prototype._inlineStyles = function (styleUrls, stylesheets, targetStyles) {
- var _this = this;
- styleUrls.forEach(function (styleUrl) {
- var stylesheet = stylesheets.get(styleUrl);
- stylesheet.styles.forEach(function (style) { return targetStyles.push(style); });
- _this._inlineStyles(stylesheet.styleUrls, stylesheets, targetStyles);
- });
- };
- DirectiveNormalizer.prototype._loadMissingExternalStylesheets = function (styleUrls, loadedStylesheets) {
- var _this = this;
- if (loadedStylesheets === void 0) { loadedStylesheets = new Map(); }
- return SyncAsync.then(SyncAsync.all(styleUrls.filter(function (styleUrl) { return !loadedStylesheets.has(styleUrl); })
- .map(function (styleUrl) { return SyncAsync.then(_this._fetch(styleUrl), function (loadedStyle) {
- var stylesheet = _this._normalizeStylesheet(new CompileStylesheetMetadata({ styles: [loadedStyle], moduleUrl: styleUrl }));
- loadedStylesheets.set(styleUrl, stylesheet);
- return _this._loadMissingExternalStylesheets(stylesheet.styleUrls, loadedStylesheets);
- }); })), function (_) { return loadedStylesheets; });
- };
- DirectiveNormalizer.prototype._normalizeStylesheet = function (stylesheet) {
- var _this = this;
- var moduleUrl = stylesheet.moduleUrl;
- var allStyleUrls = stylesheet.styleUrls.filter(isStyleUrlResolvable)
- .map(function (url) { return _this._urlResolver.resolve(moduleUrl, url); });
- var allStyles = stylesheet.styles.map(function (style) {
- var styleWithImports = extractStyleUrls(_this._urlResolver, moduleUrl, style);
- allStyleUrls.push.apply(allStyleUrls, __spread(styleWithImports.styleUrls));
- return styleWithImports.style;
- });
- return new CompileStylesheetMetadata({ styles: allStyles, styleUrls: allStyleUrls, moduleUrl: moduleUrl });
- };
- return DirectiveNormalizer;
- }());
- var TemplatePreparseVisitor = /** @class */ (function () {
- function TemplatePreparseVisitor() {
- this.ngContentSelectors = [];
- this.styles = [];
- this.styleUrls = [];
- this.ngNonBindableStackCount = 0;
- }
- TemplatePreparseVisitor.prototype.visitElement = function (ast, context) {
- var preparsedElement = preparseElement(ast);
- switch (preparsedElement.type) {
- case PreparsedElementType.NG_CONTENT:
- if (this.ngNonBindableStackCount === 0) {
- this.ngContentSelectors.push(preparsedElement.selectAttr);
- }
- break;
- case PreparsedElementType.STYLE:
- var textContent_1 = '';
- ast.children.forEach(function (child) {
- if (child instanceof Text$3) {
- textContent_1 += child.value;
- }
- });
- this.styles.push(textContent_1);
- break;
- case PreparsedElementType.STYLESHEET:
- this.styleUrls.push(preparsedElement.hrefAttr);
- break;
- default:
- break;
- }
- if (preparsedElement.nonBindable) {
- this.ngNonBindableStackCount++;
- }
- visitAll$1(this, ast.children);
- if (preparsedElement.nonBindable) {
- this.ngNonBindableStackCount--;
- }
- return null;
- };
- TemplatePreparseVisitor.prototype.visitExpansion = function (ast, context) { visitAll$1(this, ast.cases); };
- TemplatePreparseVisitor.prototype.visitExpansionCase = function (ast, context) {
- visitAll$1(this, ast.expression);
- };
- TemplatePreparseVisitor.prototype.visitComment = function (ast, context) { return null; };
- TemplatePreparseVisitor.prototype.visitAttribute = function (ast, context) { return null; };
- TemplatePreparseVisitor.prototype.visitText = function (ast, context) { return null; };
- return TemplatePreparseVisitor;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var QUERY_METADATA_IDENTIFIERS = [
- createViewChild,
- createViewChildren,
- createContentChild,
- createContentChildren,
- ];
- /*
- * Resolve a `Type` for {@link Directive}.
- *
- * This interface can be overridden by the application developer to create custom behavior.
- *
- * See {@link Compiler}
- */
- var DirectiveResolver = /** @class */ (function () {
- function DirectiveResolver(_reflector) {
- this._reflector = _reflector;
- }
- DirectiveResolver.prototype.isDirective = function (type) {
- var typeMetadata = this._reflector.annotations(resolveForwardRef(type));
- return typeMetadata && typeMetadata.some(isDirectiveMetadata);
- };
- DirectiveResolver.prototype.resolve = function (type, throwIfNotFound) {
- if (throwIfNotFound === void 0) { throwIfNotFound = true; }
- var typeMetadata = this._reflector.annotations(resolveForwardRef(type));
- if (typeMetadata) {
- var metadata = findLast(typeMetadata, isDirectiveMetadata);
- if (metadata) {
- var propertyMetadata = this._reflector.propMetadata(type);
- var guards = this._reflector.guards(type);
- return this._mergeWithPropertyMetadata(metadata, propertyMetadata, guards, type);
- }
- }
- if (throwIfNotFound) {
- throw new Error("No Directive annotation found on " + stringify(type));
- }
- return null;
- };
- DirectiveResolver.prototype._mergeWithPropertyMetadata = function (dm, propertyMetadata, guards, directiveType) {
- var inputs = [];
- var outputs = [];
- var host = {};
- var queries = {};
- Object.keys(propertyMetadata).forEach(function (propName) {
- var input = findLast(propertyMetadata[propName], function (a) { return createInput.isTypeOf(a); });
- if (input) {
- if (input.bindingPropertyName) {
- inputs.push(propName + ": " + input.bindingPropertyName);
- }
- else {
- inputs.push(propName);
- }
- }
- var output = findLast(propertyMetadata[propName], function (a) { return createOutput.isTypeOf(a); });
- if (output) {
- if (output.bindingPropertyName) {
- outputs.push(propName + ": " + output.bindingPropertyName);
- }
- else {
- outputs.push(propName);
- }
- }
- var hostBindings = propertyMetadata[propName].filter(function (a) { return createHostBinding.isTypeOf(a); });
- hostBindings.forEach(function (hostBinding) {
- if (hostBinding.hostPropertyName) {
- var startWith = hostBinding.hostPropertyName[0];
- if (startWith === '(') {
- throw new Error("@HostBinding can not bind to events. Use @HostListener instead.");
- }
- else if (startWith === '[') {
- throw new Error("@HostBinding parameter should be a property name, 'class.<name>', or 'attr.<name>'.");
- }
- host["[" + hostBinding.hostPropertyName + "]"] = propName;
- }
- else {
- host["[" + propName + "]"] = propName;
- }
- });
- var hostListeners = propertyMetadata[propName].filter(function (a) { return createHostListener.isTypeOf(a); });
- hostListeners.forEach(function (hostListener) {
- var args = hostListener.args || [];
- host["(" + hostListener.eventName + ")"] = propName + "(" + args.join(',') + ")";
- });
- var query = findLast(propertyMetadata[propName], function (a) { return QUERY_METADATA_IDENTIFIERS.some(function (i) { return i.isTypeOf(a); }); });
- if (query) {
- queries[propName] = query;
- }
- });
- return this._merge(dm, inputs, outputs, host, queries, guards, directiveType);
- };
- DirectiveResolver.prototype._extractPublicName = function (def) { return splitAtColon(def, [null, def])[1].trim(); };
- DirectiveResolver.prototype._dedupeBindings = function (bindings) {
- var names = new Set();
- var publicNames = new Set();
- var reversedResult = [];
- // go last to first to allow later entries to overwrite previous entries
- for (var i = bindings.length - 1; i >= 0; i--) {
- var binding = bindings[i];
- var name_1 = this._extractPublicName(binding);
- publicNames.add(name_1);
- if (!names.has(name_1)) {
- names.add(name_1);
- reversedResult.push(binding);
- }
- }
- return reversedResult.reverse();
- };
- DirectiveResolver.prototype._merge = function (directive, inputs, outputs, host, queries, guards, directiveType) {
- var mergedInputs = this._dedupeBindings(directive.inputs ? directive.inputs.concat(inputs) : inputs);
- var mergedOutputs = this._dedupeBindings(directive.outputs ? directive.outputs.concat(outputs) : outputs);
- var mergedHost = directive.host ? __assign({}, directive.host, host) : host;
- var mergedQueries = directive.queries ? __assign({}, directive.queries, queries) : queries;
- if (createComponent.isTypeOf(directive)) {
- var comp = directive;
- return createComponent({
- selector: comp.selector,
- inputs: mergedInputs,
- outputs: mergedOutputs,
- host: mergedHost,
- exportAs: comp.exportAs,
- moduleId: comp.moduleId,
- queries: mergedQueries,
- changeDetection: comp.changeDetection,
- providers: comp.providers,
- viewProviders: comp.viewProviders,
- entryComponents: comp.entryComponents,
- template: comp.template,
- templateUrl: comp.templateUrl,
- styles: comp.styles,
- styleUrls: comp.styleUrls,
- encapsulation: comp.encapsulation,
- animations: comp.animations,
- interpolation: comp.interpolation,
- preserveWhitespaces: directive.preserveWhitespaces,
- });
- }
- else {
- return createDirective({
- selector: directive.selector,
- inputs: mergedInputs,
- outputs: mergedOutputs,
- host: mergedHost,
- exportAs: directive.exportAs,
- queries: mergedQueries,
- providers: directive.providers, guards: guards
- });
- }
- };
- return DirectiveResolver;
- }());
- function isDirectiveMetadata(type) {
- return createDirective.isTypeOf(type) || createComponent.isTypeOf(type);
- }
- function findLast(arr, condition) {
- for (var i = arr.length - 1; i >= 0; i--) {
- if (condition(arr[i])) {
- return arr[i];
- }
- }
- return null;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * An i18n error.
- */
- var I18nError = /** @class */ (function (_super) {
- __extends(I18nError, _super);
- function I18nError(span, msg) {
- return _super.call(this, span, msg) || this;
- }
- return I18nError;
- }(ParseError));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _I18N_ATTR = 'i18n';
- var _I18N_ATTR_PREFIX = 'i18n-';
- var _I18N_COMMENT_PREFIX_REGEXP = /^i18n:?/;
- var MEANING_SEPARATOR = '|';
- var ID_SEPARATOR = '@@';
- var i18nCommentsWarned = false;
- function mergeTranslations(nodes, translations, interpolationConfig, implicitTags, implicitAttrs) {
- var visitor = new _Visitor$2(implicitTags, implicitAttrs);
- return visitor.merge(nodes, translations, interpolationConfig);
- }
- var ExtractionResult = /** @class */ (function () {
- function ExtractionResult(messages, errors) {
- this.messages = messages;
- this.errors = errors;
- }
- return ExtractionResult;
- }());
- var _VisitorMode;
- (function (_VisitorMode) {
- _VisitorMode[_VisitorMode["Extract"] = 0] = "Extract";
- _VisitorMode[_VisitorMode["Merge"] = 1] = "Merge";
- })(_VisitorMode || (_VisitorMode = {}));
- /**
- * This Visitor is used:
- * 1. to extract all the translatable strings from an html AST (see `extract()`),
- * 2. to replace the translatable strings with the actual translations (see `merge()`)
- *
- * @internal
- */
- var _Visitor$2 = /** @class */ (function () {
- function _Visitor(_implicitTags, _implicitAttrs) {
- this._implicitTags = _implicitTags;
- this._implicitAttrs = _implicitAttrs;
- }
- /**
- * Extracts the messages from the tree
- */
- _Visitor.prototype.extract = function (nodes, interpolationConfig) {
- var _this = this;
- this._init(_VisitorMode.Extract, interpolationConfig);
- nodes.forEach(function (node) { return node.visit(_this, null); });
- if (this._inI18nBlock) {
- this._reportError(nodes[nodes.length - 1], 'Unclosed block');
- }
- return new ExtractionResult(this._messages, this._errors);
- };
- /**
- * Returns a tree where all translatable nodes are translated
- */
- _Visitor.prototype.merge = function (nodes, translations, interpolationConfig) {
- this._init(_VisitorMode.Merge, interpolationConfig);
- this._translations = translations;
- // Construct a single fake root element
- var wrapper = new Element$1('wrapper', [], nodes, undefined, undefined, undefined);
- var translatedNode = wrapper.visit(this, null);
- if (this._inI18nBlock) {
- this._reportError(nodes[nodes.length - 1], 'Unclosed block');
- }
- return new ParseTreeResult(translatedNode.children, this._errors);
- };
- _Visitor.prototype.visitExpansionCase = function (icuCase, context) {
- // Parse cases for translatable html attributes
- var expression = visitAll$1(this, icuCase.expression, context);
- if (this._mode === _VisitorMode.Merge) {
- return new ExpansionCase(icuCase.value, expression, icuCase.sourceSpan, icuCase.valueSourceSpan, icuCase.expSourceSpan);
- }
- };
- _Visitor.prototype.visitExpansion = function (icu, context) {
- this._mayBeAddBlockChildren(icu);
- var wasInIcu = this._inIcu;
- if (!this._inIcu) {
- // nested ICU messages should not be extracted but top-level translated as a whole
- if (this._isInTranslatableSection) {
- this._addMessage([icu]);
- }
- this._inIcu = true;
- }
- var cases = visitAll$1(this, icu.cases, context);
- if (this._mode === _VisitorMode.Merge) {
- icu = new Expansion(icu.switchValue, icu.type, cases, icu.sourceSpan, icu.switchValueSourceSpan);
- }
- this._inIcu = wasInIcu;
- return icu;
- };
- _Visitor.prototype.visitComment = function (comment, context) {
- var isOpening = _isOpeningComment(comment);
- if (isOpening && this._isInTranslatableSection) {
- this._reportError(comment, 'Could not start a block inside a translatable section');
- return;
- }
- var isClosing = _isClosingComment(comment);
- if (isClosing && !this._inI18nBlock) {
- this._reportError(comment, 'Trying to close an unopened block');
- return;
- }
- if (!this._inI18nNode && !this._inIcu) {
- if (!this._inI18nBlock) {
- if (isOpening) {
- // deprecated from v5 you should use <ng-container i18n> instead of i18n comments
- if (!i18nCommentsWarned && console && console.warn) {
- i18nCommentsWarned = true;
- var details = comment.sourceSpan.details ? ", " + comment.sourceSpan.details : '';
- // TODO(ocombe): use a log service once there is a public one available
- console.warn("I18n comments are deprecated, use an <ng-container> element instead (" + comment.sourceSpan.start + details + ")");
- }
- this._inI18nBlock = true;
- this._blockStartDepth = this._depth;
- this._blockChildren = [];
- this._blockMeaningAndDesc =
- comment.value.replace(_I18N_COMMENT_PREFIX_REGEXP, '').trim();
- this._openTranslatableSection(comment);
- }
- }
- else {
- if (isClosing) {
- if (this._depth == this._blockStartDepth) {
- this._closeTranslatableSection(comment, this._blockChildren);
- this._inI18nBlock = false;
- var message = this._addMessage(this._blockChildren, this._blockMeaningAndDesc);
- // merge attributes in sections
- var nodes = this._translateMessage(comment, message);
- return visitAll$1(this, nodes);
- }
- else {
- this._reportError(comment, 'I18N blocks should not cross element boundaries');
- return;
- }
- }
- }
- }
- };
- _Visitor.prototype.visitText = function (text, context) {
- if (this._isInTranslatableSection) {
- this._mayBeAddBlockChildren(text);
- }
- return text;
- };
- _Visitor.prototype.visitElement = function (el, context) {
- var _this = this;
- this._mayBeAddBlockChildren(el);
- this._depth++;
- var wasInI18nNode = this._inI18nNode;
- var wasInImplicitNode = this._inImplicitNode;
- var childNodes = [];
- var translatedChildNodes = undefined;
- // Extract:
- // - top level nodes with the (implicit) "i18n" attribute if not already in a section
- // - ICU messages
- var i18nAttr = _getI18nAttr(el);
- var i18nMeta = i18nAttr ? i18nAttr.value : '';
- var isImplicit = this._implicitTags.some(function (tag) { return el.name === tag; }) && !this._inIcu &&
- !this._isInTranslatableSection;
- var isTopLevelImplicit = !wasInImplicitNode && isImplicit;
- this._inImplicitNode = wasInImplicitNode || isImplicit;
- if (!this._isInTranslatableSection && !this._inIcu) {
- if (i18nAttr || isTopLevelImplicit) {
- this._inI18nNode = true;
- var message = this._addMessage(el.children, i18nMeta);
- translatedChildNodes = this._translateMessage(el, message);
- }
- if (this._mode == _VisitorMode.Extract) {
- var isTranslatable = i18nAttr || isTopLevelImplicit;
- if (isTranslatable)
- this._openTranslatableSection(el);
- visitAll$1(this, el.children);
- if (isTranslatable)
- this._closeTranslatableSection(el, el.children);
- }
- }
- else {
- if (i18nAttr || isTopLevelImplicit) {
- this._reportError(el, 'Could not mark an element as translatable inside a translatable section');
- }
- if (this._mode == _VisitorMode.Extract) {
- // Descend into child nodes for extraction
- visitAll$1(this, el.children);
- }
- }
- if (this._mode === _VisitorMode.Merge) {
- var visitNodes = translatedChildNodes || el.children;
- visitNodes.forEach(function (child) {
- var visited = child.visit(_this, context);
- if (visited && !_this._isInTranslatableSection) {
- // Do not add the children from translatable sections (= i18n blocks here)
- // They will be added later in this loop when the block closes (i.e. on `<!-- /i18n -->`)
- childNodes = childNodes.concat(visited);
- }
- });
- }
- this._visitAttributesOf(el);
- this._depth--;
- this._inI18nNode = wasInI18nNode;
- this._inImplicitNode = wasInImplicitNode;
- if (this._mode === _VisitorMode.Merge) {
- var translatedAttrs = this._translateAttributes(el);
- return new Element$1(el.name, translatedAttrs, childNodes, el.sourceSpan, el.startSourceSpan, el.endSourceSpan);
- }
- return null;
- };
- _Visitor.prototype.visitAttribute = function (attribute, context) {
- throw new Error('unreachable code');
- };
- _Visitor.prototype._init = function (mode, interpolationConfig) {
- this._mode = mode;
- this._inI18nBlock = false;
- this._inI18nNode = false;
- this._depth = 0;
- this._inIcu = false;
- this._msgCountAtSectionStart = undefined;
- this._errors = [];
- this._messages = [];
- this._inImplicitNode = false;
- this._createI18nMessage = createI18nMessageFactory(interpolationConfig);
- };
- // looks for translatable attributes
- _Visitor.prototype._visitAttributesOf = function (el) {
- var _this = this;
- var explicitAttrNameToValue = {};
- var implicitAttrNames = this._implicitAttrs[el.name] || [];
- el.attrs.filter(function (attr) { return attr.name.startsWith(_I18N_ATTR_PREFIX); })
- .forEach(function (attr) { return explicitAttrNameToValue[attr.name.slice(_I18N_ATTR_PREFIX.length)] =
- attr.value; });
- el.attrs.forEach(function (attr) {
- if (attr.name in explicitAttrNameToValue) {
- _this._addMessage([attr], explicitAttrNameToValue[attr.name]);
- }
- else if (implicitAttrNames.some(function (name) { return attr.name === name; })) {
- _this._addMessage([attr]);
- }
- });
- };
- // add a translatable message
- _Visitor.prototype._addMessage = function (ast, msgMeta) {
- if (ast.length == 0 ||
- ast.length == 1 && ast[0] instanceof Attribute && !ast[0].value) {
- // Do not create empty messages
- return null;
- }
- var _a = _parseMessageMeta(msgMeta), meaning = _a.meaning, description = _a.description, id = _a.id;
- var message = this._createI18nMessage(ast, meaning, description, id);
- this._messages.push(message);
- return message;
- };
- // Translates the given message given the `TranslationBundle`
- // This is used for translating elements / blocks - see `_translateAttributes` for attributes
- // no-op when called in extraction mode (returns [])
- _Visitor.prototype._translateMessage = function (el, message) {
- if (message && this._mode === _VisitorMode.Merge) {
- var nodes = this._translations.get(message);
- if (nodes) {
- return nodes;
- }
- this._reportError(el, "Translation unavailable for message id=\"" + this._translations.digest(message) + "\"");
- }
- return [];
- };
- // translate the attributes of an element and remove i18n specific attributes
- _Visitor.prototype._translateAttributes = function (el) {
- var _this = this;
- var attributes = el.attrs;
- var i18nParsedMessageMeta = {};
- attributes.forEach(function (attr) {
- if (attr.name.startsWith(_I18N_ATTR_PREFIX)) {
- i18nParsedMessageMeta[attr.name.slice(_I18N_ATTR_PREFIX.length)] =
- _parseMessageMeta(attr.value);
- }
- });
- var translatedAttributes = [];
- attributes.forEach(function (attr) {
- if (attr.name === _I18N_ATTR || attr.name.startsWith(_I18N_ATTR_PREFIX)) {
- // strip i18n specific attributes
- return;
- }
- if (attr.value && attr.value != '' && i18nParsedMessageMeta.hasOwnProperty(attr.name)) {
- var _a = i18nParsedMessageMeta[attr.name], meaning = _a.meaning, description = _a.description, id = _a.id;
- var message = _this._createI18nMessage([attr], meaning, description, id);
- var nodes = _this._translations.get(message);
- if (nodes) {
- if (nodes.length == 0) {
- translatedAttributes.push(new Attribute(attr.name, '', attr.sourceSpan));
- }
- else if (nodes[0] instanceof Text$3) {
- var value = nodes[0].value;
- translatedAttributes.push(new Attribute(attr.name, value, attr.sourceSpan));
- }
- else {
- _this._reportError(el, "Unexpected translation for attribute \"" + attr.name + "\" (id=\"" + (id || _this._translations.digest(message)) + "\")");
- }
- }
- else {
- _this._reportError(el, "Translation unavailable for attribute \"" + attr.name + "\" (id=\"" + (id || _this._translations.digest(message)) + "\")");
- }
- }
- else {
- translatedAttributes.push(attr);
- }
- });
- return translatedAttributes;
- };
- /**
- * Add the node as a child of the block when:
- * - we are in a block,
- * - we are not inside a ICU message (those are handled separately),
- * - the node is a "direct child" of the block
- */
- _Visitor.prototype._mayBeAddBlockChildren = function (node) {
- if (this._inI18nBlock && !this._inIcu && this._depth == this._blockStartDepth) {
- this._blockChildren.push(node);
- }
- };
- /**
- * Marks the start of a section, see `_closeTranslatableSection`
- */
- _Visitor.prototype._openTranslatableSection = function (node) {
- if (this._isInTranslatableSection) {
- this._reportError(node, 'Unexpected section start');
- }
- else {
- this._msgCountAtSectionStart = this._messages.length;
- }
- };
- Object.defineProperty(_Visitor.prototype, "_isInTranslatableSection", {
- /**
- * A translatable section could be:
- * - the content of translatable element,
- * - nodes between `<!-- i18n -->` and `<!-- /i18n -->` comments
- */
- get: function () {
- return this._msgCountAtSectionStart !== void 0;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * Terminates a section.
- *
- * If a section has only one significant children (comments not significant) then we should not
- * keep the message from this children:
- *
- * `<p i18n="meaning|description">{ICU message}</p>` would produce two messages:
- * - one for the <p> content with meaning and description,
- * - another one for the ICU message.
- *
- * In this case the last message is discarded as it contains less information (the AST is
- * otherwise identical).
- *
- * Note that we should still keep messages extracted from attributes inside the section (ie in the
- * ICU message here)
- */
- _Visitor.prototype._closeTranslatableSection = function (node, directChildren) {
- if (!this._isInTranslatableSection) {
- this._reportError(node, 'Unexpected section end');
- return;
- }
- var startIndex = this._msgCountAtSectionStart;
- var significantChildren = directChildren.reduce(function (count, node) { return count + (node instanceof Comment ? 0 : 1); }, 0);
- if (significantChildren == 1) {
- for (var i = this._messages.length - 1; i >= startIndex; i--) {
- var ast = this._messages[i].nodes;
- if (!(ast.length == 1 && ast[0] instanceof Text$1)) {
- this._messages.splice(i, 1);
- break;
- }
- }
- }
- this._msgCountAtSectionStart = undefined;
- };
- _Visitor.prototype._reportError = function (node, msg) {
- this._errors.push(new I18nError(node.sourceSpan, msg));
- };
- return _Visitor;
- }());
- function _isOpeningComment(n) {
- return !!(n instanceof Comment && n.value && n.value.startsWith('i18n'));
- }
- function _isClosingComment(n) {
- return !!(n instanceof Comment && n.value && n.value === '/i18n');
- }
- function _getI18nAttr(p) {
- return p.attrs.find(function (attr) { return attr.name === _I18N_ATTR; }) || null;
- }
- function _parseMessageMeta(i18n) {
- if (!i18n)
- return { meaning: '', description: '', id: '' };
- var idIndex = i18n.indexOf(ID_SEPARATOR);
- var descIndex = i18n.indexOf(MEANING_SEPARATOR);
- var _a = __read((idIndex > -1) ? [i18n.slice(0, idIndex), i18n.slice(idIndex + 2)] : [i18n, ''], 2), meaningAndDesc = _a[0], id = _a[1];
- var _b = __read((descIndex > -1) ?
- [meaningAndDesc.slice(0, descIndex), meaningAndDesc.slice(descIndex + 1)] :
- ['', meaningAndDesc], 2), meaning = _b[0], description = _b[1];
- return { meaning: meaning, description: description, id: id };
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var XmlTagDefinition = /** @class */ (function () {
- function XmlTagDefinition() {
- this.closedByParent = false;
- this.contentType = TagContentType.PARSABLE_DATA;
- this.isVoid = false;
- this.ignoreFirstLf = false;
- this.canSelfClose = true;
- }
- XmlTagDefinition.prototype.requireExtraParent = function (currentParent) { return false; };
- XmlTagDefinition.prototype.isClosedByChild = function (name) { return false; };
- return XmlTagDefinition;
- }());
- var _TAG_DEFINITION = new XmlTagDefinition();
- function getXmlTagDefinition(tagName) {
- return _TAG_DEFINITION;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var XmlParser = /** @class */ (function (_super) {
- __extends(XmlParser, _super);
- function XmlParser() {
- return _super.call(this, getXmlTagDefinition) || this;
- }
- XmlParser.prototype.parse = function (source, url, options) {
- return _super.prototype.parse.call(this, source, url, options);
- };
- return XmlParser;
- }(Parser));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _VERSION = '1.2';
- var _XMLNS = 'urn:oasis:names:tc:xliff:document:1.2';
- // TODO(vicb): make this a param (s/_/-/)
- var _DEFAULT_SOURCE_LANG = 'en';
- var _PLACEHOLDER_TAG$1 = 'x';
- var _MARKER_TAG = 'mrk';
- var _FILE_TAG = 'file';
- var _SOURCE_TAG$1 = 'source';
- var _SEGMENT_SOURCE_TAG = 'seg-source';
- var _TARGET_TAG = 'target';
- var _UNIT_TAG = 'trans-unit';
- var _CONTEXT_GROUP_TAG = 'context-group';
- var _CONTEXT_TAG = 'context';
- // http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html
- // http://docs.oasis-open.org/xliff/v1.2/xliff-profile-html/xliff-profile-html-1.2.html
- var Xliff = /** @class */ (function (_super) {
- __extends(Xliff, _super);
- function Xliff() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- Xliff.prototype.write = function (messages, locale) {
- var visitor = new _WriteVisitor();
- var transUnits = [];
- messages.forEach(function (message) {
- var _a;
- var contextTags = [];
- message.sources.forEach(function (source) {
- var contextGroupTag = new Tag(_CONTEXT_GROUP_TAG, { purpose: 'location' });
- contextGroupTag.children.push(new CR(10), new Tag(_CONTEXT_TAG, { 'context-type': 'sourcefile' }, [new Text$2(source.filePath)]), new CR(10), new Tag(_CONTEXT_TAG, { 'context-type': 'linenumber' }, [new Text$2("" + source.startLine)]), new CR(8));
- contextTags.push(new CR(8), contextGroupTag);
- });
- var transUnit = new Tag(_UNIT_TAG, { id: message.id, datatype: 'html' });
- (_a = transUnit.children).push.apply(_a, __spread([new CR(8), new Tag(_SOURCE_TAG$1, {}, visitor.serialize(message.nodes))], contextTags));
- if (message.description) {
- transUnit.children.push(new CR(8), new Tag('note', { priority: '1', from: 'description' }, [new Text$2(message.description)]));
- }
- if (message.meaning) {
- transUnit.children.push(new CR(8), new Tag('note', { priority: '1', from: 'meaning' }, [new Text$2(message.meaning)]));
- }
- transUnit.children.push(new CR(6));
- transUnits.push(new CR(6), transUnit);
- });
- var body = new Tag('body', {}, __spread(transUnits, [new CR(4)]));
- var file = new Tag('file', {
- 'source-language': locale || _DEFAULT_SOURCE_LANG,
- datatype: 'plaintext',
- original: 'ng2.template',
- }, [new CR(4), body, new CR(2)]);
- var xliff = new Tag('xliff', { version: _VERSION, xmlns: _XMLNS }, [new CR(2), file, new CR()]);
- return serialize([
- new Declaration({ version: '1.0', encoding: 'UTF-8' }), new CR(), xliff, new CR()
- ]);
- };
- Xliff.prototype.load = function (content, url) {
- // xliff to xml nodes
- var xliffParser = new XliffParser();
- var _a = xliffParser.parse(content, url), locale = _a.locale, msgIdToHtml = _a.msgIdToHtml, errors = _a.errors;
- // xml nodes to i18n nodes
- var i18nNodesByMsgId = {};
- var converter = new XmlToI18n();
- Object.keys(msgIdToHtml).forEach(function (msgId) {
- var _a = converter.convert(msgIdToHtml[msgId], url), i18nNodes = _a.i18nNodes, e = _a.errors;
- errors.push.apply(errors, __spread(e));
- i18nNodesByMsgId[msgId] = i18nNodes;
- });
- if (errors.length) {
- throw new Error("xliff parse errors:\n" + errors.join('\n'));
- }
- return { locale: locale, i18nNodesByMsgId: i18nNodesByMsgId };
- };
- Xliff.prototype.digest = function (message) { return digest(message); };
- return Xliff;
- }(Serializer));
- var _WriteVisitor = /** @class */ (function () {
- function _WriteVisitor() {
- }
- _WriteVisitor.prototype.visitText = function (text, context) { return [new Text$2(text.value)]; };
- _WriteVisitor.prototype.visitContainer = function (container, context) {
- var _this = this;
- var nodes = [];
- container.children.forEach(function (node) { return nodes.push.apply(nodes, __spread(node.visit(_this))); });
- return nodes;
- };
- _WriteVisitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- var nodes = [new Text$2("{" + icu.expressionPlaceholder + ", " + icu.type + ", ")];
- Object.keys(icu.cases).forEach(function (c) {
- nodes.push.apply(nodes, __spread([new Text$2(c + " {")], icu.cases[c].visit(_this), [new Text$2("} ")]));
- });
- nodes.push(new Text$2("}"));
- return nodes;
- };
- _WriteVisitor.prototype.visitTagPlaceholder = function (ph, context) {
- var ctype = getCtypeForTag(ph.tag);
- if (ph.isVoid) {
- // void tags have no children nor closing tags
- return [new Tag(_PLACEHOLDER_TAG$1, { id: ph.startName, ctype: ctype, 'equiv-text': "<" + ph.tag + "/>" })];
- }
- var startTagPh = new Tag(_PLACEHOLDER_TAG$1, { id: ph.startName, ctype: ctype, 'equiv-text': "<" + ph.tag + ">" });
- var closeTagPh = new Tag(_PLACEHOLDER_TAG$1, { id: ph.closeName, ctype: ctype, 'equiv-text': "</" + ph.tag + ">" });
- return __spread([startTagPh], this.serialize(ph.children), [closeTagPh]);
- };
- _WriteVisitor.prototype.visitPlaceholder = function (ph, context) {
- return [new Tag(_PLACEHOLDER_TAG$1, { id: ph.name, 'equiv-text': "{{" + ph.value + "}}" })];
- };
- _WriteVisitor.prototype.visitIcuPlaceholder = function (ph, context) {
- var equivText = "{" + ph.value.expression + ", " + ph.value.type + ", " + Object.keys(ph.value.cases).map(function (value) { return value + ' {...}'; }).join(' ') + "}";
- return [new Tag(_PLACEHOLDER_TAG$1, { id: ph.name, 'equiv-text': equivText })];
- };
- _WriteVisitor.prototype.serialize = function (nodes) {
- var _this = this;
- return [].concat.apply([], __spread(nodes.map(function (node) { return node.visit(_this); })));
- };
- return _WriteVisitor;
- }());
- // TODO(vicb): add error management (structure)
- // Extract messages as xml nodes from the xliff file
- var XliffParser = /** @class */ (function () {
- function XliffParser() {
- this._locale = null;
- }
- XliffParser.prototype.parse = function (xliff, url) {
- this._unitMlString = null;
- this._msgIdToHtml = {};
- var xml = new XmlParser().parse(xliff, url);
- this._errors = xml.errors;
- visitAll$1(this, xml.rootNodes, null);
- return {
- msgIdToHtml: this._msgIdToHtml,
- errors: this._errors,
- locale: this._locale,
- };
- };
- XliffParser.prototype.visitElement = function (element, context) {
- switch (element.name) {
- case _UNIT_TAG:
- this._unitMlString = null;
- var idAttr = element.attrs.find(function (attr) { return attr.name === 'id'; });
- if (!idAttr) {
- this._addError(element, "<" + _UNIT_TAG + "> misses the \"id\" attribute");
- }
- else {
- var id = idAttr.value;
- if (this._msgIdToHtml.hasOwnProperty(id)) {
- this._addError(element, "Duplicated translations for msg " + id);
- }
- else {
- visitAll$1(this, element.children, null);
- if (typeof this._unitMlString === 'string') {
- this._msgIdToHtml[id] = this._unitMlString;
- }
- else {
- this._addError(element, "Message " + id + " misses a translation");
- }
- }
- }
- break;
- // ignore those tags
- case _SOURCE_TAG$1:
- case _SEGMENT_SOURCE_TAG:
- break;
- case _TARGET_TAG:
- var innerTextStart = element.startSourceSpan.end.offset;
- var innerTextEnd = element.endSourceSpan.start.offset;
- var content = element.startSourceSpan.start.file.content;
- var innerText = content.slice(innerTextStart, innerTextEnd);
- this._unitMlString = innerText;
- break;
- case _FILE_TAG:
- var localeAttr = element.attrs.find(function (attr) { return attr.name === 'target-language'; });
- if (localeAttr) {
- this._locale = localeAttr.value;
- }
- visitAll$1(this, element.children, null);
- break;
- default:
- // TODO(vicb): assert file structure, xliff version
- // For now only recurse on unhandled nodes
- visitAll$1(this, element.children, null);
- }
- };
- XliffParser.prototype.visitAttribute = function (attribute, context) { };
- XliffParser.prototype.visitText = function (text, context) { };
- XliffParser.prototype.visitComment = function (comment, context) { };
- XliffParser.prototype.visitExpansion = function (expansion, context) { };
- XliffParser.prototype.visitExpansionCase = function (expansionCase, context) { };
- XliffParser.prototype._addError = function (node, message) {
- this._errors.push(new I18nError(node.sourceSpan, message));
- };
- return XliffParser;
- }());
- // Convert ml nodes (xliff syntax) to i18n nodes
- var XmlToI18n = /** @class */ (function () {
- function XmlToI18n() {
- }
- XmlToI18n.prototype.convert = function (message, url) {
- var xmlIcu = new XmlParser().parse(message, url, { tokenizeExpansionForms: true });
- this._errors = xmlIcu.errors;
- var i18nNodes = this._errors.length > 0 || xmlIcu.rootNodes.length == 0 ?
- [] : [].concat.apply([], __spread(visitAll$1(this, xmlIcu.rootNodes)));
- return {
- i18nNodes: i18nNodes,
- errors: this._errors,
- };
- };
- XmlToI18n.prototype.visitText = function (text, context) { return new Text$1(text.value, text.sourceSpan); };
- XmlToI18n.prototype.visitElement = function (el, context) {
- if (el.name === _PLACEHOLDER_TAG$1) {
- var nameAttr = el.attrs.find(function (attr) { return attr.name === 'id'; });
- if (nameAttr) {
- return new Placeholder('', nameAttr.value, el.sourceSpan);
- }
- this._addError(el, "<" + _PLACEHOLDER_TAG$1 + "> misses the \"id\" attribute");
- return null;
- }
- if (el.name === _MARKER_TAG) {
- return [].concat.apply([], __spread(visitAll$1(this, el.children)));
- }
- this._addError(el, "Unexpected tag");
- return null;
- };
- XmlToI18n.prototype.visitExpansion = function (icu, context) {
- var caseMap = {};
- visitAll$1(this, icu.cases).forEach(function (c) {
- caseMap[c.value] = new Container(c.nodes, icu.sourceSpan);
- });
- return new Icu$1(icu.switchValue, icu.type, caseMap, icu.sourceSpan);
- };
- XmlToI18n.prototype.visitExpansionCase = function (icuCase, context) {
- return {
- value: icuCase.value,
- nodes: visitAll$1(this, icuCase.expression),
- };
- };
- XmlToI18n.prototype.visitComment = function (comment, context) { };
- XmlToI18n.prototype.visitAttribute = function (attribute, context) { };
- XmlToI18n.prototype._addError = function (node, message) {
- this._errors.push(new I18nError(node.sourceSpan, message));
- };
- return XmlToI18n;
- }());
- function getCtypeForTag(tag) {
- switch (tag.toLowerCase()) {
- case 'br':
- return 'lb';
- case 'img':
- return 'image';
- default:
- return "x-" + tag;
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _VERSION$1 = '2.0';
- var _XMLNS$1 = 'urn:oasis:names:tc:xliff:document:2.0';
- // TODO(vicb): make this a param (s/_/-/)
- var _DEFAULT_SOURCE_LANG$1 = 'en';
- var _PLACEHOLDER_TAG$2 = 'ph';
- var _PLACEHOLDER_SPANNING_TAG = 'pc';
- var _MARKER_TAG$1 = 'mrk';
- var _XLIFF_TAG = 'xliff';
- var _SOURCE_TAG$2 = 'source';
- var _TARGET_TAG$1 = 'target';
- var _UNIT_TAG$1 = 'unit';
- // http://docs.oasis-open.org/xliff/xliff-core/v2.0/os/xliff-core-v2.0-os.html
- var Xliff2 = /** @class */ (function (_super) {
- __extends(Xliff2, _super);
- function Xliff2() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- Xliff2.prototype.write = function (messages, locale) {
- var visitor = new _WriteVisitor$1();
- var units = [];
- messages.forEach(function (message) {
- var unit = new Tag(_UNIT_TAG$1, { id: message.id });
- var notes = new Tag('notes');
- if (message.description || message.meaning) {
- if (message.description) {
- notes.children.push(new CR(8), new Tag('note', { category: 'description' }, [new Text$2(message.description)]));
- }
- if (message.meaning) {
- notes.children.push(new CR(8), new Tag('note', { category: 'meaning' }, [new Text$2(message.meaning)]));
- }
- }
- message.sources.forEach(function (source) {
- notes.children.push(new CR(8), new Tag('note', { category: 'location' }, [
- new Text$2(source.filePath + ":" + source.startLine + (source.endLine !== source.startLine ? ',' + source.endLine : ''))
- ]));
- });
- notes.children.push(new CR(6));
- unit.children.push(new CR(6), notes);
- var segment = new Tag('segment');
- segment.children.push(new CR(8), new Tag(_SOURCE_TAG$2, {}, visitor.serialize(message.nodes)), new CR(6));
- unit.children.push(new CR(6), segment, new CR(4));
- units.push(new CR(4), unit);
- });
- var file = new Tag('file', { 'original': 'ng.template', id: 'ngi18n' }, __spread(units, [new CR(2)]));
- var xliff = new Tag(_XLIFF_TAG, { version: _VERSION$1, xmlns: _XMLNS$1, srcLang: locale || _DEFAULT_SOURCE_LANG$1 }, [new CR(2), file, new CR()]);
- return serialize([
- new Declaration({ version: '1.0', encoding: 'UTF-8' }), new CR(), xliff, new CR()
- ]);
- };
- Xliff2.prototype.load = function (content, url) {
- // xliff to xml nodes
- var xliff2Parser = new Xliff2Parser();
- var _a = xliff2Parser.parse(content, url), locale = _a.locale, msgIdToHtml = _a.msgIdToHtml, errors = _a.errors;
- // xml nodes to i18n nodes
- var i18nNodesByMsgId = {};
- var converter = new XmlToI18n$1();
- Object.keys(msgIdToHtml).forEach(function (msgId) {
- var _a = converter.convert(msgIdToHtml[msgId], url), i18nNodes = _a.i18nNodes, e = _a.errors;
- errors.push.apply(errors, __spread(e));
- i18nNodesByMsgId[msgId] = i18nNodes;
- });
- if (errors.length) {
- throw new Error("xliff2 parse errors:\n" + errors.join('\n'));
- }
- return { locale: locale, i18nNodesByMsgId: i18nNodesByMsgId };
- };
- Xliff2.prototype.digest = function (message) { return decimalDigest(message); };
- return Xliff2;
- }(Serializer));
- var _WriteVisitor$1 = /** @class */ (function () {
- function _WriteVisitor() {
- }
- _WriteVisitor.prototype.visitText = function (text, context) { return [new Text$2(text.value)]; };
- _WriteVisitor.prototype.visitContainer = function (container, context) {
- var _this = this;
- var nodes = [];
- container.children.forEach(function (node) { return nodes.push.apply(nodes, __spread(node.visit(_this))); });
- return nodes;
- };
- _WriteVisitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- var nodes = [new Text$2("{" + icu.expressionPlaceholder + ", " + icu.type + ", ")];
- Object.keys(icu.cases).forEach(function (c) {
- nodes.push.apply(nodes, __spread([new Text$2(c + " {")], icu.cases[c].visit(_this), [new Text$2("} ")]));
- });
- nodes.push(new Text$2("}"));
- return nodes;
- };
- _WriteVisitor.prototype.visitTagPlaceholder = function (ph, context) {
- var _this = this;
- var type = getTypeForTag(ph.tag);
- if (ph.isVoid) {
- var tagPh = new Tag(_PLACEHOLDER_TAG$2, {
- id: (this._nextPlaceholderId++).toString(),
- equiv: ph.startName,
- type: type,
- disp: "<" + ph.tag + "/>",
- });
- return [tagPh];
- }
- var tagPc = new Tag(_PLACEHOLDER_SPANNING_TAG, {
- id: (this._nextPlaceholderId++).toString(),
- equivStart: ph.startName,
- equivEnd: ph.closeName,
- type: type,
- dispStart: "<" + ph.tag + ">",
- dispEnd: "</" + ph.tag + ">",
- });
- var nodes = [].concat.apply([], __spread(ph.children.map(function (node) { return node.visit(_this); })));
- if (nodes.length) {
- nodes.forEach(function (node) { return tagPc.children.push(node); });
- }
- else {
- tagPc.children.push(new Text$2(''));
- }
- return [tagPc];
- };
- _WriteVisitor.prototype.visitPlaceholder = function (ph, context) {
- var idStr = (this._nextPlaceholderId++).toString();
- return [new Tag(_PLACEHOLDER_TAG$2, {
- id: idStr,
- equiv: ph.name,
- disp: "{{" + ph.value + "}}",
- })];
- };
- _WriteVisitor.prototype.visitIcuPlaceholder = function (ph, context) {
- var cases = Object.keys(ph.value.cases).map(function (value) { return value + ' {...}'; }).join(' ');
- var idStr = (this._nextPlaceholderId++).toString();
- return [new Tag(_PLACEHOLDER_TAG$2, { id: idStr, equiv: ph.name, disp: "{" + ph.value.expression + ", " + ph.value.type + ", " + cases + "}" })];
- };
- _WriteVisitor.prototype.serialize = function (nodes) {
- var _this = this;
- this._nextPlaceholderId = 0;
- return [].concat.apply([], __spread(nodes.map(function (node) { return node.visit(_this); })));
- };
- return _WriteVisitor;
- }());
- // Extract messages as xml nodes from the xliff file
- var Xliff2Parser = /** @class */ (function () {
- function Xliff2Parser() {
- this._locale = null;
- }
- Xliff2Parser.prototype.parse = function (xliff, url) {
- this._unitMlString = null;
- this._msgIdToHtml = {};
- var xml = new XmlParser().parse(xliff, url);
- this._errors = xml.errors;
- visitAll$1(this, xml.rootNodes, null);
- return {
- msgIdToHtml: this._msgIdToHtml,
- errors: this._errors,
- locale: this._locale,
- };
- };
- Xliff2Parser.prototype.visitElement = function (element, context) {
- switch (element.name) {
- case _UNIT_TAG$1:
- this._unitMlString = null;
- var idAttr = element.attrs.find(function (attr) { return attr.name === 'id'; });
- if (!idAttr) {
- this._addError(element, "<" + _UNIT_TAG$1 + "> misses the \"id\" attribute");
- }
- else {
- var id = idAttr.value;
- if (this._msgIdToHtml.hasOwnProperty(id)) {
- this._addError(element, "Duplicated translations for msg " + id);
- }
- else {
- visitAll$1(this, element.children, null);
- if (typeof this._unitMlString === 'string') {
- this._msgIdToHtml[id] = this._unitMlString;
- }
- else {
- this._addError(element, "Message " + id + " misses a translation");
- }
- }
- }
- break;
- case _SOURCE_TAG$2:
- // ignore source message
- break;
- case _TARGET_TAG$1:
- var innerTextStart = element.startSourceSpan.end.offset;
- var innerTextEnd = element.endSourceSpan.start.offset;
- var content = element.startSourceSpan.start.file.content;
- var innerText = content.slice(innerTextStart, innerTextEnd);
- this._unitMlString = innerText;
- break;
- case _XLIFF_TAG:
- var localeAttr = element.attrs.find(function (attr) { return attr.name === 'trgLang'; });
- if (localeAttr) {
- this._locale = localeAttr.value;
- }
- var versionAttr = element.attrs.find(function (attr) { return attr.name === 'version'; });
- if (versionAttr) {
- var version = versionAttr.value;
- if (version !== '2.0') {
- this._addError(element, "The XLIFF file version " + version + " is not compatible with XLIFF 2.0 serializer");
- }
- else {
- visitAll$1(this, element.children, null);
- }
- }
- break;
- default:
- visitAll$1(this, element.children, null);
- }
- };
- Xliff2Parser.prototype.visitAttribute = function (attribute, context) { };
- Xliff2Parser.prototype.visitText = function (text, context) { };
- Xliff2Parser.prototype.visitComment = function (comment, context) { };
- Xliff2Parser.prototype.visitExpansion = function (expansion, context) { };
- Xliff2Parser.prototype.visitExpansionCase = function (expansionCase, context) { };
- Xliff2Parser.prototype._addError = function (node, message) {
- this._errors.push(new I18nError(node.sourceSpan, message));
- };
- return Xliff2Parser;
- }());
- // Convert ml nodes (xliff syntax) to i18n nodes
- var XmlToI18n$1 = /** @class */ (function () {
- function XmlToI18n() {
- }
- XmlToI18n.prototype.convert = function (message, url) {
- var xmlIcu = new XmlParser().parse(message, url, { tokenizeExpansionForms: true });
- this._errors = xmlIcu.errors;
- var i18nNodes = this._errors.length > 0 || xmlIcu.rootNodes.length == 0 ?
- [] : [].concat.apply([], __spread(visitAll$1(this, xmlIcu.rootNodes)));
- return {
- i18nNodes: i18nNodes,
- errors: this._errors,
- };
- };
- XmlToI18n.prototype.visitText = function (text, context) { return new Text$1(text.value, text.sourceSpan); };
- XmlToI18n.prototype.visitElement = function (el, context) {
- var _this = this;
- switch (el.name) {
- case _PLACEHOLDER_TAG$2:
- var nameAttr = el.attrs.find(function (attr) { return attr.name === 'equiv'; });
- if (nameAttr) {
- return [new Placeholder('', nameAttr.value, el.sourceSpan)];
- }
- this._addError(el, "<" + _PLACEHOLDER_TAG$2 + "> misses the \"equiv\" attribute");
- break;
- case _PLACEHOLDER_SPANNING_TAG:
- var startAttr = el.attrs.find(function (attr) { return attr.name === 'equivStart'; });
- var endAttr = el.attrs.find(function (attr) { return attr.name === 'equivEnd'; });
- if (!startAttr) {
- this._addError(el, "<" + _PLACEHOLDER_TAG$2 + "> misses the \"equivStart\" attribute");
- }
- else if (!endAttr) {
- this._addError(el, "<" + _PLACEHOLDER_TAG$2 + "> misses the \"equivEnd\" attribute");
- }
- else {
- var startId = startAttr.value;
- var endId = endAttr.value;
- var nodes = [];
- return nodes.concat.apply(nodes, __spread([new Placeholder('', startId, el.sourceSpan)], el.children.map(function (node) { return node.visit(_this, null); }), [new Placeholder('', endId, el.sourceSpan)]));
- }
- break;
- case _MARKER_TAG$1:
- return [].concat.apply([], __spread(visitAll$1(this, el.children)));
- default:
- this._addError(el, "Unexpected tag");
- }
- return null;
- };
- XmlToI18n.prototype.visitExpansion = function (icu, context) {
- var caseMap = {};
- visitAll$1(this, icu.cases).forEach(function (c) {
- caseMap[c.value] = new Container(c.nodes, icu.sourceSpan);
- });
- return new Icu$1(icu.switchValue, icu.type, caseMap, icu.sourceSpan);
- };
- XmlToI18n.prototype.visitExpansionCase = function (icuCase, context) {
- return {
- value: icuCase.value,
- nodes: [].concat.apply([], __spread(visitAll$1(this, icuCase.expression))),
- };
- };
- XmlToI18n.prototype.visitComment = function (comment, context) { };
- XmlToI18n.prototype.visitAttribute = function (attribute, context) { };
- XmlToI18n.prototype._addError = function (node, message) {
- this._errors.push(new I18nError(node.sourceSpan, message));
- };
- return XmlToI18n;
- }());
- function getTypeForTag(tag) {
- switch (tag.toLowerCase()) {
- case 'br':
- case 'b':
- case 'i':
- case 'u':
- return 'fmt';
- case 'img':
- return 'image';
- case 'a':
- return 'link';
- default:
- return 'other';
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _TRANSLATIONS_TAG = 'translationbundle';
- var _TRANSLATION_TAG = 'translation';
- var _PLACEHOLDER_TAG$3 = 'ph';
- var Xtb = /** @class */ (function (_super) {
- __extends(Xtb, _super);
- function Xtb() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- Xtb.prototype.write = function (messages, locale) { throw new Error('Unsupported'); };
- Xtb.prototype.load = function (content, url) {
- // xtb to xml nodes
- var xtbParser = new XtbParser();
- var _a = xtbParser.parse(content, url), locale = _a.locale, msgIdToHtml = _a.msgIdToHtml, errors = _a.errors;
- // xml nodes to i18n nodes
- var i18nNodesByMsgId = {};
- var converter = new XmlToI18n$2();
- // Because we should be able to load xtb files that rely on features not supported by angular,
- // we need to delay the conversion of html to i18n nodes so that non angular messages are not
- // converted
- Object.keys(msgIdToHtml).forEach(function (msgId) {
- var valueFn = function () {
- var _a = converter.convert(msgIdToHtml[msgId], url), i18nNodes = _a.i18nNodes, errors = _a.errors;
- if (errors.length) {
- throw new Error("xtb parse errors:\n" + errors.join('\n'));
- }
- return i18nNodes;
- };
- createLazyProperty(i18nNodesByMsgId, msgId, valueFn);
- });
- if (errors.length) {
- throw new Error("xtb parse errors:\n" + errors.join('\n'));
- }
- return { locale: locale, i18nNodesByMsgId: i18nNodesByMsgId };
- };
- Xtb.prototype.digest = function (message) { return digest$1(message); };
- Xtb.prototype.createNameMapper = function (message) {
- return new SimplePlaceholderMapper(message, toPublicName);
- };
- return Xtb;
- }(Serializer));
- function createLazyProperty(messages, id, valueFn) {
- Object.defineProperty(messages, id, {
- configurable: true,
- enumerable: true,
- get: function () {
- var value = valueFn();
- Object.defineProperty(messages, id, { enumerable: true, value: value });
- return value;
- },
- set: function (_) { throw new Error('Could not overwrite an XTB translation'); },
- });
- }
- // Extract messages as xml nodes from the xtb file
- var XtbParser = /** @class */ (function () {
- function XtbParser() {
- this._locale = null;
- }
- XtbParser.prototype.parse = function (xtb, url) {
- this._bundleDepth = 0;
- this._msgIdToHtml = {};
- // We can not parse the ICU messages at this point as some messages might not originate
- // from Angular that could not be lex'd.
- var xml = new XmlParser().parse(xtb, url);
- this._errors = xml.errors;
- visitAll$1(this, xml.rootNodes);
- return {
- msgIdToHtml: this._msgIdToHtml,
- errors: this._errors,
- locale: this._locale,
- };
- };
- XtbParser.prototype.visitElement = function (element, context) {
- switch (element.name) {
- case _TRANSLATIONS_TAG:
- this._bundleDepth++;
- if (this._bundleDepth > 1) {
- this._addError(element, "<" + _TRANSLATIONS_TAG + "> elements can not be nested");
- }
- var langAttr = element.attrs.find(function (attr) { return attr.name === 'lang'; });
- if (langAttr) {
- this._locale = langAttr.value;
- }
- visitAll$1(this, element.children, null);
- this._bundleDepth--;
- break;
- case _TRANSLATION_TAG:
- var idAttr = element.attrs.find(function (attr) { return attr.name === 'id'; });
- if (!idAttr) {
- this._addError(element, "<" + _TRANSLATION_TAG + "> misses the \"id\" attribute");
- }
- else {
- var id = idAttr.value;
- if (this._msgIdToHtml.hasOwnProperty(id)) {
- this._addError(element, "Duplicated translations for msg " + id);
- }
- else {
- var innerTextStart = element.startSourceSpan.end.offset;
- var innerTextEnd = element.endSourceSpan.start.offset;
- var content = element.startSourceSpan.start.file.content;
- var innerText = content.slice(innerTextStart, innerTextEnd);
- this._msgIdToHtml[id] = innerText;
- }
- }
- break;
- default:
- this._addError(element, 'Unexpected tag');
- }
- };
- XtbParser.prototype.visitAttribute = function (attribute, context) { };
- XtbParser.prototype.visitText = function (text, context) { };
- XtbParser.prototype.visitComment = function (comment, context) { };
- XtbParser.prototype.visitExpansion = function (expansion, context) { };
- XtbParser.prototype.visitExpansionCase = function (expansionCase, context) { };
- XtbParser.prototype._addError = function (node, message) {
- this._errors.push(new I18nError(node.sourceSpan, message));
- };
- return XtbParser;
- }());
- // Convert ml nodes (xtb syntax) to i18n nodes
- var XmlToI18n$2 = /** @class */ (function () {
- function XmlToI18n() {
- }
- XmlToI18n.prototype.convert = function (message, url) {
- var xmlIcu = new XmlParser().parse(message, url, { tokenizeExpansionForms: true });
- this._errors = xmlIcu.errors;
- var i18nNodes = this._errors.length > 0 || xmlIcu.rootNodes.length == 0 ?
- [] :
- visitAll$1(this, xmlIcu.rootNodes);
- return {
- i18nNodes: i18nNodes,
- errors: this._errors,
- };
- };
- XmlToI18n.prototype.visitText = function (text, context) { return new Text$1(text.value, text.sourceSpan); };
- XmlToI18n.prototype.visitExpansion = function (icu, context) {
- var caseMap = {};
- visitAll$1(this, icu.cases).forEach(function (c) {
- caseMap[c.value] = new Container(c.nodes, icu.sourceSpan);
- });
- return new Icu$1(icu.switchValue, icu.type, caseMap, icu.sourceSpan);
- };
- XmlToI18n.prototype.visitExpansionCase = function (icuCase, context) {
- return {
- value: icuCase.value,
- nodes: visitAll$1(this, icuCase.expression),
- };
- };
- XmlToI18n.prototype.visitElement = function (el, context) {
- if (el.name === _PLACEHOLDER_TAG$3) {
- var nameAttr = el.attrs.find(function (attr) { return attr.name === 'name'; });
- if (nameAttr) {
- return new Placeholder('', nameAttr.value, el.sourceSpan);
- }
- this._addError(el, "<" + _PLACEHOLDER_TAG$3 + "> misses the \"name\" attribute");
- }
- else {
- this._addError(el, "Unexpected tag");
- }
- return null;
- };
- XmlToI18n.prototype.visitComment = function (comment, context) { };
- XmlToI18n.prototype.visitAttribute = function (attribute, context) { };
- XmlToI18n.prototype._addError = function (node, message) {
- this._errors.push(new I18nError(node.sourceSpan, message));
- };
- return XmlToI18n;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A container for translated messages
- */
- var TranslationBundle = /** @class */ (function () {
- function TranslationBundle(_i18nNodesByMsgId, locale, digest, mapperFactory, missingTranslationStrategy, console) {
- if (_i18nNodesByMsgId === void 0) { _i18nNodesByMsgId = {}; }
- if (missingTranslationStrategy === void 0) { missingTranslationStrategy = MissingTranslationStrategy.Warning; }
- this._i18nNodesByMsgId = _i18nNodesByMsgId;
- this.digest = digest;
- this.mapperFactory = mapperFactory;
- this._i18nToHtml = new I18nToHtmlVisitor(_i18nNodesByMsgId, locale, digest, mapperFactory, missingTranslationStrategy, console);
- }
- // Creates a `TranslationBundle` by parsing the given `content` with the `serializer`.
- TranslationBundle.load = function (content, url, serializer, missingTranslationStrategy, console) {
- var _a = serializer.load(content, url), locale = _a.locale, i18nNodesByMsgId = _a.i18nNodesByMsgId;
- var digestFn = function (m) { return serializer.digest(m); };
- var mapperFactory = function (m) { return serializer.createNameMapper(m); };
- return new TranslationBundle(i18nNodesByMsgId, locale, digestFn, mapperFactory, missingTranslationStrategy, console);
- };
- // Returns the translation as HTML nodes from the given source message.
- TranslationBundle.prototype.get = function (srcMsg) {
- var html = this._i18nToHtml.convert(srcMsg);
- if (html.errors.length) {
- throw new Error(html.errors.join('\n'));
- }
- return html.nodes;
- };
- TranslationBundle.prototype.has = function (srcMsg) { return this.digest(srcMsg) in this._i18nNodesByMsgId; };
- return TranslationBundle;
- }());
- var I18nToHtmlVisitor = /** @class */ (function () {
- function I18nToHtmlVisitor(_i18nNodesByMsgId, _locale, _digest, _mapperFactory, _missingTranslationStrategy, _console) {
- if (_i18nNodesByMsgId === void 0) { _i18nNodesByMsgId = {}; }
- this._i18nNodesByMsgId = _i18nNodesByMsgId;
- this._locale = _locale;
- this._digest = _digest;
- this._mapperFactory = _mapperFactory;
- this._missingTranslationStrategy = _missingTranslationStrategy;
- this._console = _console;
- this._contextStack = [];
- this._errors = [];
- }
- I18nToHtmlVisitor.prototype.convert = function (srcMsg) {
- this._contextStack.length = 0;
- this._errors.length = 0;
- // i18n to text
- var text = this._convertToText(srcMsg);
- // text to html
- var url = srcMsg.nodes[0].sourceSpan.start.file.url;
- var html = new HtmlParser().parse(text, url, { tokenizeExpansionForms: true });
- return {
- nodes: html.rootNodes,
- errors: __spread(this._errors, html.errors),
- };
- };
- I18nToHtmlVisitor.prototype.visitText = function (text, context) {
- // `convert()` uses an `HtmlParser` to return `html.Node`s
- // we should then make sure that any special characters are escaped
- return escapeXml(text.value);
- };
- I18nToHtmlVisitor.prototype.visitContainer = function (container, context) {
- var _this = this;
- return container.children.map(function (n) { return n.visit(_this); }).join('');
- };
- I18nToHtmlVisitor.prototype.visitIcu = function (icu, context) {
- var _this = this;
- var cases = Object.keys(icu.cases).map(function (k) { return k + " {" + icu.cases[k].visit(_this) + "}"; });
- // TODO(vicb): Once all format switch to using expression placeholders
- // we should throw when the placeholder is not in the source message
- var exp = this._srcMsg.placeholders.hasOwnProperty(icu.expression) ?
- this._srcMsg.placeholders[icu.expression] :
- icu.expression;
- return "{" + exp + ", " + icu.type + ", " + cases.join(' ') + "}";
- };
- I18nToHtmlVisitor.prototype.visitPlaceholder = function (ph, context) {
- var phName = this._mapper(ph.name);
- if (this._srcMsg.placeholders.hasOwnProperty(phName)) {
- return this._srcMsg.placeholders[phName];
- }
- if (this._srcMsg.placeholderToMessage.hasOwnProperty(phName)) {
- return this._convertToText(this._srcMsg.placeholderToMessage[phName]);
- }
- this._addError(ph, "Unknown placeholder \"" + ph.name + "\"");
- return '';
- };
- // Loaded message contains only placeholders (vs tag and icu placeholders).
- // However when a translation can not be found, we need to serialize the source message
- // which can contain tag placeholders
- I18nToHtmlVisitor.prototype.visitTagPlaceholder = function (ph, context) {
- var _this = this;
- var tag = "" + ph.tag;
- var attrs = Object.keys(ph.attrs).map(function (name) { return name + "=\"" + ph.attrs[name] + "\""; }).join(' ');
- if (ph.isVoid) {
- return "<" + tag + " " + attrs + "/>";
- }
- var children = ph.children.map(function (c) { return c.visit(_this); }).join('');
- return "<" + tag + " " + attrs + ">" + children + "</" + tag + ">";
- };
- // Loaded message contains only placeholders (vs tag and icu placeholders).
- // However when a translation can not be found, we need to serialize the source message
- // which can contain tag placeholders
- I18nToHtmlVisitor.prototype.visitIcuPlaceholder = function (ph, context) {
- // An ICU placeholder references the source message to be serialized
- return this._convertToText(this._srcMsg.placeholderToMessage[ph.name]);
- };
- /**
- * Convert a source message to a translated text string:
- * - text nodes are replaced with their translation,
- * - placeholders are replaced with their content,
- * - ICU nodes are converted to ICU expressions.
- */
- I18nToHtmlVisitor.prototype._convertToText = function (srcMsg) {
- var _this = this;
- var id = this._digest(srcMsg);
- var mapper = this._mapperFactory ? this._mapperFactory(srcMsg) : null;
- var nodes;
- this._contextStack.push({ msg: this._srcMsg, mapper: this._mapper });
- this._srcMsg = srcMsg;
- if (this._i18nNodesByMsgId.hasOwnProperty(id)) {
- // When there is a translation use its nodes as the source
- // And create a mapper to convert serialized placeholder names to internal names
- nodes = this._i18nNodesByMsgId[id];
- this._mapper = function (name) { return mapper ? mapper.toInternalName(name) : name; };
- }
- else {
- // When no translation has been found
- // - report an error / a warning / nothing,
- // - use the nodes from the original message
- // - placeholders are already internal and need no mapper
- if (this._missingTranslationStrategy === MissingTranslationStrategy.Error) {
- var ctx = this._locale ? " for locale \"" + this._locale + "\"" : '';
- this._addError(srcMsg.nodes[0], "Missing translation for message \"" + id + "\"" + ctx);
- }
- else if (this._console &&
- this._missingTranslationStrategy === MissingTranslationStrategy.Warning) {
- var ctx = this._locale ? " for locale \"" + this._locale + "\"" : '';
- this._console.warn("Missing translation for message \"" + id + "\"" + ctx);
- }
- nodes = srcMsg.nodes;
- this._mapper = function (name) { return name; };
- }
- var text = nodes.map(function (node) { return node.visit(_this); }).join('');
- var context = this._contextStack.pop();
- this._srcMsg = context.msg;
- this._mapper = context.mapper;
- return text;
- };
- I18nToHtmlVisitor.prototype._addError = function (el, msg) {
- this._errors.push(new I18nError(el.sourceSpan, msg));
- };
- return I18nToHtmlVisitor;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var I18NHtmlParser = /** @class */ (function () {
- function I18NHtmlParser(_htmlParser, translations, translationsFormat, missingTranslation, console) {
- if (missingTranslation === void 0) { missingTranslation = MissingTranslationStrategy.Warning; }
- this._htmlParser = _htmlParser;
- if (translations) {
- var serializer = createSerializer(translationsFormat);
- this._translationBundle =
- TranslationBundle.load(translations, 'i18n', serializer, missingTranslation, console);
- }
- else {
- this._translationBundle =
- new TranslationBundle({}, null, digest, undefined, missingTranslation, console);
- }
- }
- I18NHtmlParser.prototype.parse = function (source, url, options) {
- if (options === void 0) { options = {}; }
- var interpolationConfig = options.interpolationConfig || DEFAULT_INTERPOLATION_CONFIG;
- var parseResult = this._htmlParser.parse(source, url, __assign({ interpolationConfig: interpolationConfig }, options));
- if (parseResult.errors.length) {
- return new ParseTreeResult(parseResult.rootNodes, parseResult.errors);
- }
- return mergeTranslations(parseResult.rootNodes, this._translationBundle, interpolationConfig, [], {});
- };
- return I18NHtmlParser;
- }());
- function createSerializer(format) {
- format = (format || 'xlf').toLowerCase();
- switch (format) {
- case 'xmb':
- return new Xmb();
- case 'xtb':
- return new Xtb();
- case 'xliff2':
- case 'xlf2':
- return new Xliff2();
- case 'xliff':
- case 'xlf':
- default:
- return new Xliff();
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var STRIP_SRC_FILE_SUFFIXES = /(\.ts|\.d\.ts|\.js|\.jsx|\.tsx)$/;
- var GENERATED_FILE = /\.ngfactory\.|\.ngsummary\./;
- var JIT_SUMMARY_FILE = /\.ngsummary\./;
- var JIT_SUMMARY_NAME = /NgSummary$/;
- function ngfactoryFilePath(filePath, forceSourceFile) {
- if (forceSourceFile === void 0) { forceSourceFile = false; }
- var urlWithSuffix = splitTypescriptSuffix(filePath, forceSourceFile);
- return urlWithSuffix[0] + ".ngfactory" + normalizeGenFileSuffix(urlWithSuffix[1]);
- }
- function stripGeneratedFileSuffix(filePath) {
- return filePath.replace(GENERATED_FILE, '.');
- }
- function isGeneratedFile(filePath) {
- return GENERATED_FILE.test(filePath);
- }
- function splitTypescriptSuffix(path, forceSourceFile) {
- if (forceSourceFile === void 0) { forceSourceFile = false; }
- if (path.endsWith('.d.ts')) {
- return [path.slice(0, -5), forceSourceFile ? '.ts' : '.d.ts'];
- }
- var lastDot = path.lastIndexOf('.');
- if (lastDot !== -1) {
- return [path.substring(0, lastDot), path.substring(lastDot)];
- }
- return [path, ''];
- }
- function normalizeGenFileSuffix(srcFileSuffix) {
- return srcFileSuffix === '.tsx' ? '.ts' : srcFileSuffix;
- }
- function summaryFileName(fileName) {
- var fileNameWithoutSuffix = fileName.replace(STRIP_SRC_FILE_SUFFIXES, '');
- return fileNameWithoutSuffix + ".ngsummary.json";
- }
- function summaryForJitFileName(fileName, forceSourceFile) {
- if (forceSourceFile === void 0) { forceSourceFile = false; }
- var urlWithSuffix = splitTypescriptSuffix(stripGeneratedFileSuffix(fileName), forceSourceFile);
- return urlWithSuffix[0] + ".ngsummary" + urlWithSuffix[1];
- }
- function stripSummaryForJitFileSuffix(filePath) {
- return filePath.replace(JIT_SUMMARY_FILE, '.');
- }
- function summaryForJitName(symbolName) {
- return symbolName + "NgSummary";
- }
- function stripSummaryForJitNameSuffix(symbolName) {
- return symbolName.replace(JIT_SUMMARY_NAME, '');
- }
- var LOWERED_SYMBOL = /\u0275\d+/;
- function isLoweredSymbol(name) {
- return LOWERED_SYMBOL.test(name);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var LifecycleHooks;
- (function (LifecycleHooks) {
- LifecycleHooks[LifecycleHooks["OnInit"] = 0] = "OnInit";
- LifecycleHooks[LifecycleHooks["OnDestroy"] = 1] = "OnDestroy";
- LifecycleHooks[LifecycleHooks["DoCheck"] = 2] = "DoCheck";
- LifecycleHooks[LifecycleHooks["OnChanges"] = 3] = "OnChanges";
- LifecycleHooks[LifecycleHooks["AfterContentInit"] = 4] = "AfterContentInit";
- LifecycleHooks[LifecycleHooks["AfterContentChecked"] = 5] = "AfterContentChecked";
- LifecycleHooks[LifecycleHooks["AfterViewInit"] = 6] = "AfterViewInit";
- LifecycleHooks[LifecycleHooks["AfterViewChecked"] = 7] = "AfterViewChecked";
- })(LifecycleHooks || (LifecycleHooks = {}));
- var LIFECYCLE_HOOKS_VALUES = [
- LifecycleHooks.OnInit, LifecycleHooks.OnDestroy, LifecycleHooks.DoCheck, LifecycleHooks.OnChanges,
- LifecycleHooks.AfterContentInit, LifecycleHooks.AfterContentChecked, LifecycleHooks.AfterViewInit,
- LifecycleHooks.AfterViewChecked
- ];
- function hasLifecycleHook(reflector, hook, token) {
- return reflector.hasLifecycleHook(token, getHookName(hook));
- }
- function getAllLifecycleHooks(reflector, token) {
- return LIFECYCLE_HOOKS_VALUES.filter(function (hook) { return hasLifecycleHook(reflector, hook, token); });
- }
- function getHookName(hook) {
- switch (hook) {
- case LifecycleHooks.OnInit:
- return 'ngOnInit';
- case LifecycleHooks.OnDestroy:
- return 'ngOnDestroy';
- case LifecycleHooks.DoCheck:
- return 'ngDoCheck';
- case LifecycleHooks.OnChanges:
- return 'ngOnChanges';
- case LifecycleHooks.AfterContentInit:
- return 'ngAfterContentInit';
- case LifecycleHooks.AfterContentChecked:
- return 'ngAfterContentChecked';
- case LifecycleHooks.AfterViewInit:
- return 'ngAfterViewInit';
- case LifecycleHooks.AfterViewChecked:
- return 'ngAfterViewChecked';
- default:
- // This default case is not needed by TypeScript compiler, as the switch is exhaustive.
- // However Closure Compiler does not understand that and reports an error in typed mode.
- // The `throw new Error` below works around the problem, and the unexpected: never variable
- // makes sure tsc still checks this code is unreachable.
- var unexpected = hook;
- throw new Error("unexpected " + unexpected);
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ERROR_COMPONENT_TYPE = 'ngComponentType';
- // Design notes:
- // - don't lazily create metadata:
- // For some metadata, we need to do async work sometimes,
- // so the user has to kick off this loading.
- // But we want to report errors even when the async work is
- // not required to check that the user would have been able
- // to wait correctly.
- var CompileMetadataResolver = /** @class */ (function () {
- function CompileMetadataResolver(_config, _htmlParser, _ngModuleResolver, _directiveResolver, _pipeResolver, _summaryResolver, _schemaRegistry, _directiveNormalizer, _console, _staticSymbolCache, _reflector, _errorCollector) {
- this._config = _config;
- this._htmlParser = _htmlParser;
- this._ngModuleResolver = _ngModuleResolver;
- this._directiveResolver = _directiveResolver;
- this._pipeResolver = _pipeResolver;
- this._summaryResolver = _summaryResolver;
- this._schemaRegistry = _schemaRegistry;
- this._directiveNormalizer = _directiveNormalizer;
- this._console = _console;
- this._staticSymbolCache = _staticSymbolCache;
- this._reflector = _reflector;
- this._errorCollector = _errorCollector;
- this._nonNormalizedDirectiveCache = new Map();
- this._directiveCache = new Map();
- this._summaryCache = new Map();
- this._pipeCache = new Map();
- this._ngModuleCache = new Map();
- this._ngModuleOfTypes = new Map();
- this._shallowModuleCache = new Map();
- }
- CompileMetadataResolver.prototype.getReflector = function () { return this._reflector; };
- CompileMetadataResolver.prototype.clearCacheFor = function (type) {
- var dirMeta = this._directiveCache.get(type);
- this._directiveCache.delete(type);
- this._nonNormalizedDirectiveCache.delete(type);
- this._summaryCache.delete(type);
- this._pipeCache.delete(type);
- this._ngModuleOfTypes.delete(type);
- // Clear all of the NgModule as they contain transitive information!
- this._ngModuleCache.clear();
- if (dirMeta) {
- this._directiveNormalizer.clearCacheFor(dirMeta);
- }
- };
- CompileMetadataResolver.prototype.clearCache = function () {
- this._directiveCache.clear();
- this._nonNormalizedDirectiveCache.clear();
- this._summaryCache.clear();
- this._pipeCache.clear();
- this._ngModuleCache.clear();
- this._ngModuleOfTypes.clear();
- this._directiveNormalizer.clearCache();
- };
- CompileMetadataResolver.prototype._createProxyClass = function (baseType, name) {
- var delegate = null;
- var proxyClass = function () {
- if (!delegate) {
- throw new Error("Illegal state: Class " + name + " for type " + stringify(baseType) + " is not compiled yet!");
- }
- return delegate.apply(this, arguments);
- };
- proxyClass.setDelegate = function (d) {
- delegate = d;
- proxyClass.prototype = d.prototype;
- };
- // Make stringify work correctly
- proxyClass.overriddenName = name;
- return proxyClass;
- };
- CompileMetadataResolver.prototype.getGeneratedClass = function (dirType, name) {
- if (dirType instanceof StaticSymbol) {
- return this._staticSymbolCache.get(ngfactoryFilePath(dirType.filePath), name);
- }
- else {
- return this._createProxyClass(dirType, name);
- }
- };
- CompileMetadataResolver.prototype.getComponentViewClass = function (dirType) {
- return this.getGeneratedClass(dirType, viewClassName(dirType, 0));
- };
- CompileMetadataResolver.prototype.getHostComponentViewClass = function (dirType) {
- return this.getGeneratedClass(dirType, hostViewClassName(dirType));
- };
- CompileMetadataResolver.prototype.getHostComponentType = function (dirType) {
- var name = identifierName({ reference: dirType }) + "_Host";
- if (dirType instanceof StaticSymbol) {
- return this._staticSymbolCache.get(dirType.filePath, name);
- }
- return this._createProxyClass(dirType, name);
- };
- CompileMetadataResolver.prototype.getRendererType = function (dirType) {
- if (dirType instanceof StaticSymbol) {
- return this._staticSymbolCache.get(ngfactoryFilePath(dirType.filePath), rendererTypeName(dirType));
- }
- else {
- // returning an object as proxy,
- // that we fill later during runtime compilation.
- return {};
- }
- };
- CompileMetadataResolver.prototype.getComponentFactory = function (selector, dirType, inputs, outputs) {
- if (dirType instanceof StaticSymbol) {
- return this._staticSymbolCache.get(ngfactoryFilePath(dirType.filePath), componentFactoryName(dirType));
- }
- else {
- var hostView = this.getHostComponentViewClass(dirType);
- // Note: ngContentSelectors will be filled later once the template is
- // loaded.
- var createComponentFactory = this._reflector.resolveExternalReference(Identifiers.createComponentFactory);
- return createComponentFactory(selector, dirType, hostView, inputs, outputs, []);
- }
- };
- CompileMetadataResolver.prototype.initComponentFactory = function (factory, ngContentSelectors) {
- var _a;
- if (!(factory instanceof StaticSymbol)) {
- (_a = factory.ngContentSelectors).push.apply(_a, __spread(ngContentSelectors));
- }
- };
- CompileMetadataResolver.prototype._loadSummary = function (type, kind) {
- var typeSummary = this._summaryCache.get(type);
- if (!typeSummary) {
- var summary = this._summaryResolver.resolveSummary(type);
- typeSummary = summary ? summary.type : null;
- this._summaryCache.set(type, typeSummary || null);
- }
- return typeSummary && typeSummary.summaryKind === kind ? typeSummary : null;
- };
- CompileMetadataResolver.prototype.getHostComponentMetadata = function (compMeta, hostViewType) {
- var hostType = this.getHostComponentType(compMeta.type.reference);
- if (!hostViewType) {
- hostViewType = this.getHostComponentViewClass(hostType);
- }
- // Note: ! is ok here as this method should only be called with normalized directive
- // metadata, which always fills in the selector.
- var template = CssSelector.parse(compMeta.selector)[0].getMatchingElementTemplate();
- var templateUrl = '';
- var htmlAst = this._htmlParser.parse(template, templateUrl);
- return CompileDirectiveMetadata.create({
- isHost: true,
- type: { reference: hostType, diDeps: [], lifecycleHooks: [] },
- template: new CompileTemplateMetadata({
- encapsulation: ViewEncapsulation.None,
- template: template,
- templateUrl: templateUrl,
- htmlAst: htmlAst,
- styles: [],
- styleUrls: [],
- ngContentSelectors: [],
- animations: [],
- isInline: true,
- externalStylesheets: [],
- interpolation: null,
- preserveWhitespaces: false,
- }),
- exportAs: null,
- changeDetection: ChangeDetectionStrategy.Default,
- inputs: [],
- outputs: [],
- host: {},
- isComponent: true,
- selector: '*',
- providers: [],
- viewProviders: [],
- queries: [],
- guards: {},
- viewQueries: [],
- componentViewType: hostViewType,
- rendererType: { id: '__Host__', encapsulation: ViewEncapsulation.None, styles: [], data: {} },
- entryComponents: [],
- componentFactory: null
- });
- };
- CompileMetadataResolver.prototype.loadDirectiveMetadata = function (ngModuleType, directiveType, isSync) {
- var _this = this;
- if (this._directiveCache.has(directiveType)) {
- return null;
- }
- directiveType = resolveForwardRef(directiveType);
- var _a = this.getNonNormalizedDirectiveMetadata(directiveType), annotation = _a.annotation, metadata = _a.metadata;
- var createDirectiveMetadata = function (templateMetadata) {
- var normalizedDirMeta = new CompileDirectiveMetadata({
- isHost: false,
- type: metadata.type,
- isComponent: metadata.isComponent,
- selector: metadata.selector,
- exportAs: metadata.exportAs,
- changeDetection: metadata.changeDetection,
- inputs: metadata.inputs,
- outputs: metadata.outputs,
- hostListeners: metadata.hostListeners,
- hostProperties: metadata.hostProperties,
- hostAttributes: metadata.hostAttributes,
- providers: metadata.providers,
- viewProviders: metadata.viewProviders,
- queries: metadata.queries,
- guards: metadata.guards,
- viewQueries: metadata.viewQueries,
- entryComponents: metadata.entryComponents,
- componentViewType: metadata.componentViewType,
- rendererType: metadata.rendererType,
- componentFactory: metadata.componentFactory,
- template: templateMetadata
- });
- if (templateMetadata) {
- _this.initComponentFactory(metadata.componentFactory, templateMetadata.ngContentSelectors);
- }
- _this._directiveCache.set(directiveType, normalizedDirMeta);
- _this._summaryCache.set(directiveType, normalizedDirMeta.toSummary());
- return null;
- };
- if (metadata.isComponent) {
- var template = metadata.template;
- var templateMeta = this._directiveNormalizer.normalizeTemplate({
- ngModuleType: ngModuleType,
- componentType: directiveType,
- moduleUrl: this._reflector.componentModuleUrl(directiveType, annotation),
- encapsulation: template.encapsulation,
- template: template.template,
- templateUrl: template.templateUrl,
- styles: template.styles,
- styleUrls: template.styleUrls,
- animations: template.animations,
- interpolation: template.interpolation,
- preserveWhitespaces: template.preserveWhitespaces
- });
- if (isPromise(templateMeta) && isSync) {
- this._reportError(componentStillLoadingError(directiveType), directiveType);
- return null;
- }
- return SyncAsync.then(templateMeta, createDirectiveMetadata);
- }
- else {
- // directive
- createDirectiveMetadata(null);
- return null;
- }
- };
- CompileMetadataResolver.prototype.getNonNormalizedDirectiveMetadata = function (directiveType) {
- var _this = this;
- directiveType = resolveForwardRef(directiveType);
- if (!directiveType) {
- return null;
- }
- var cacheEntry = this._nonNormalizedDirectiveCache.get(directiveType);
- if (cacheEntry) {
- return cacheEntry;
- }
- var dirMeta = this._directiveResolver.resolve(directiveType, false);
- if (!dirMeta) {
- return null;
- }
- var nonNormalizedTemplateMetadata = undefined;
- if (createComponent.isTypeOf(dirMeta)) {
- // component
- var compMeta = dirMeta;
- assertArrayOfStrings('styles', compMeta.styles);
- assertArrayOfStrings('styleUrls', compMeta.styleUrls);
- assertInterpolationSymbols('interpolation', compMeta.interpolation);
- var animations = compMeta.animations;
- nonNormalizedTemplateMetadata = new CompileTemplateMetadata({
- encapsulation: noUndefined(compMeta.encapsulation),
- template: noUndefined(compMeta.template),
- templateUrl: noUndefined(compMeta.templateUrl),
- htmlAst: null,
- styles: compMeta.styles || [],
- styleUrls: compMeta.styleUrls || [],
- animations: animations || [],
- interpolation: noUndefined(compMeta.interpolation),
- isInline: !!compMeta.template,
- externalStylesheets: [],
- ngContentSelectors: [],
- preserveWhitespaces: noUndefined(dirMeta.preserveWhitespaces),
- });
- }
- var changeDetectionStrategy = null;
- var viewProviders = [];
- var entryComponentMetadata = [];
- var selector = dirMeta.selector;
- if (createComponent.isTypeOf(dirMeta)) {
- // Component
- var compMeta = dirMeta;
- changeDetectionStrategy = compMeta.changeDetection;
- if (compMeta.viewProviders) {
- viewProviders = this._getProvidersMetadata(compMeta.viewProviders, entryComponentMetadata, "viewProviders for \"" + stringifyType(directiveType) + "\"", [], directiveType);
- }
- if (compMeta.entryComponents) {
- entryComponentMetadata = flattenAndDedupeArray(compMeta.entryComponents)
- .map(function (type) { return _this._getEntryComponentMetadata(type); })
- .concat(entryComponentMetadata);
- }
- if (!selector) {
- selector = this._schemaRegistry.getDefaultComponentElementName();
- }
- }
- else {
- // Directive
- if (!selector) {
- this._reportError(syntaxError("Directive " + stringifyType(directiveType) + " has no selector, please add it!"), directiveType);
- selector = 'error';
- }
- }
- var providers = [];
- if (dirMeta.providers != null) {
- providers = this._getProvidersMetadata(dirMeta.providers, entryComponentMetadata, "providers for \"" + stringifyType(directiveType) + "\"", [], directiveType);
- }
- var queries = [];
- var viewQueries = [];
- if (dirMeta.queries != null) {
- queries = this._getQueriesMetadata(dirMeta.queries, false, directiveType);
- viewQueries = this._getQueriesMetadata(dirMeta.queries, true, directiveType);
- }
- var metadata = CompileDirectiveMetadata.create({
- isHost: false,
- selector: selector,
- exportAs: noUndefined(dirMeta.exportAs),
- isComponent: !!nonNormalizedTemplateMetadata,
- type: this._getTypeMetadata(directiveType),
- template: nonNormalizedTemplateMetadata,
- changeDetection: changeDetectionStrategy,
- inputs: dirMeta.inputs || [],
- outputs: dirMeta.outputs || [],
- host: dirMeta.host || {},
- providers: providers || [],
- viewProviders: viewProviders || [],
- queries: queries || [],
- guards: dirMeta.guards || {},
- viewQueries: viewQueries || [],
- entryComponents: entryComponentMetadata,
- componentViewType: nonNormalizedTemplateMetadata ? this.getComponentViewClass(directiveType) :
- null,
- rendererType: nonNormalizedTemplateMetadata ? this.getRendererType(directiveType) : null,
- componentFactory: null
- });
- if (nonNormalizedTemplateMetadata) {
- metadata.componentFactory =
- this.getComponentFactory(selector, directiveType, metadata.inputs, metadata.outputs);
- }
- cacheEntry = { metadata: metadata, annotation: dirMeta };
- this._nonNormalizedDirectiveCache.set(directiveType, cacheEntry);
- return cacheEntry;
- };
- /**
- * Gets the metadata for the given directive.
- * This assumes `loadNgModuleDirectiveAndPipeMetadata` has been called first.
- */
- CompileMetadataResolver.prototype.getDirectiveMetadata = function (directiveType) {
- var dirMeta = this._directiveCache.get(directiveType);
- if (!dirMeta) {
- this._reportError(syntaxError("Illegal state: getDirectiveMetadata can only be called after loadNgModuleDirectiveAndPipeMetadata for a module that declares it. Directive " + stringifyType(directiveType) + "."), directiveType);
- }
- return dirMeta;
- };
- CompileMetadataResolver.prototype.getDirectiveSummary = function (dirType) {
- var dirSummary = this._loadSummary(dirType, CompileSummaryKind.Directive);
- if (!dirSummary) {
- this._reportError(syntaxError("Illegal state: Could not load the summary for directive " + stringifyType(dirType) + "."), dirType);
- }
- return dirSummary;
- };
- CompileMetadataResolver.prototype.isDirective = function (type) {
- return !!this._loadSummary(type, CompileSummaryKind.Directive) ||
- this._directiveResolver.isDirective(type);
- };
- CompileMetadataResolver.prototype.isPipe = function (type) {
- return !!this._loadSummary(type, CompileSummaryKind.Pipe) ||
- this._pipeResolver.isPipe(type);
- };
- CompileMetadataResolver.prototype.isNgModule = function (type) {
- return !!this._loadSummary(type, CompileSummaryKind.NgModule) ||
- this._ngModuleResolver.isNgModule(type);
- };
- CompileMetadataResolver.prototype.getNgModuleSummary = function (moduleType, alreadyCollecting) {
- if (alreadyCollecting === void 0) { alreadyCollecting = null; }
- var moduleSummary = this._loadSummary(moduleType, CompileSummaryKind.NgModule);
- if (!moduleSummary) {
- var moduleMeta = this.getNgModuleMetadata(moduleType, false, alreadyCollecting);
- moduleSummary = moduleMeta ? moduleMeta.toSummary() : null;
- if (moduleSummary) {
- this._summaryCache.set(moduleType, moduleSummary);
- }
- }
- return moduleSummary;
- };
- /**
- * Loads the declared directives and pipes of an NgModule.
- */
- CompileMetadataResolver.prototype.loadNgModuleDirectiveAndPipeMetadata = function (moduleType, isSync, throwIfNotFound) {
- var _this = this;
- if (throwIfNotFound === void 0) { throwIfNotFound = true; }
- var ngModule = this.getNgModuleMetadata(moduleType, throwIfNotFound);
- var loading = [];
- if (ngModule) {
- ngModule.declaredDirectives.forEach(function (id) {
- var promise = _this.loadDirectiveMetadata(moduleType, id.reference, isSync);
- if (promise) {
- loading.push(promise);
- }
- });
- ngModule.declaredPipes.forEach(function (id) { return _this._loadPipeMetadata(id.reference); });
- }
- return Promise.all(loading);
- };
- CompileMetadataResolver.prototype.getShallowModuleMetadata = function (moduleType) {
- var compileMeta = this._shallowModuleCache.get(moduleType);
- if (compileMeta) {
- return compileMeta;
- }
- var ngModuleMeta = findLast(this._reflector.shallowAnnotations(moduleType), createNgModule.isTypeOf);
- compileMeta = {
- type: this._getTypeMetadata(moduleType),
- rawExports: ngModuleMeta.exports,
- rawImports: ngModuleMeta.imports,
- rawProviders: ngModuleMeta.providers,
- };
- this._shallowModuleCache.set(moduleType, compileMeta);
- return compileMeta;
- };
- CompileMetadataResolver.prototype.getNgModuleMetadata = function (moduleType, throwIfNotFound, alreadyCollecting) {
- var _this = this;
- if (throwIfNotFound === void 0) { throwIfNotFound = true; }
- if (alreadyCollecting === void 0) { alreadyCollecting = null; }
- moduleType = resolveForwardRef(moduleType);
- var compileMeta = this._ngModuleCache.get(moduleType);
- if (compileMeta) {
- return compileMeta;
- }
- var meta = this._ngModuleResolver.resolve(moduleType, throwIfNotFound);
- if (!meta) {
- return null;
- }
- var declaredDirectives = [];
- var exportedNonModuleIdentifiers = [];
- var declaredPipes = [];
- var importedModules = [];
- var exportedModules = [];
- var providers = [];
- var entryComponents = [];
- var bootstrapComponents = [];
- var schemas = [];
- if (meta.imports) {
- flattenAndDedupeArray(meta.imports).forEach(function (importedType) {
- var importedModuleType = undefined;
- if (isValidType(importedType)) {
- importedModuleType = importedType;
- }
- else if (importedType && importedType.ngModule) {
- var moduleWithProviders = importedType;
- importedModuleType = moduleWithProviders.ngModule;
- if (moduleWithProviders.providers) {
- providers.push.apply(providers, __spread(_this._getProvidersMetadata(moduleWithProviders.providers, entryComponents, "provider for the NgModule '" + stringifyType(importedModuleType) + "'", [], importedType)));
- }
- }
- if (importedModuleType) {
- if (_this._checkSelfImport(moduleType, importedModuleType))
- return;
- if (!alreadyCollecting)
- alreadyCollecting = new Set();
- if (alreadyCollecting.has(importedModuleType)) {
- _this._reportError(syntaxError(_this._getTypeDescriptor(importedModuleType) + " '" + stringifyType(importedType) + "' is imported recursively by the module '" + stringifyType(moduleType) + "'."), moduleType);
- return;
- }
- alreadyCollecting.add(importedModuleType);
- var importedModuleSummary = _this.getNgModuleSummary(importedModuleType, alreadyCollecting);
- alreadyCollecting.delete(importedModuleType);
- if (!importedModuleSummary) {
- _this._reportError(syntaxError("Unexpected " + _this._getTypeDescriptor(importedType) + " '" + stringifyType(importedType) + "' imported by the module '" + stringifyType(moduleType) + "'. Please add a @NgModule annotation."), moduleType);
- return;
- }
- importedModules.push(importedModuleSummary);
- }
- else {
- _this._reportError(syntaxError("Unexpected value '" + stringifyType(importedType) + "' imported by the module '" + stringifyType(moduleType) + "'"), moduleType);
- return;
- }
- });
- }
- if (meta.exports) {
- flattenAndDedupeArray(meta.exports).forEach(function (exportedType) {
- if (!isValidType(exportedType)) {
- _this._reportError(syntaxError("Unexpected value '" + stringifyType(exportedType) + "' exported by the module '" + stringifyType(moduleType) + "'"), moduleType);
- return;
- }
- if (!alreadyCollecting)
- alreadyCollecting = new Set();
- if (alreadyCollecting.has(exportedType)) {
- _this._reportError(syntaxError(_this._getTypeDescriptor(exportedType) + " '" + stringify(exportedType) + "' is exported recursively by the module '" + stringifyType(moduleType) + "'"), moduleType);
- return;
- }
- alreadyCollecting.add(exportedType);
- var exportedModuleSummary = _this.getNgModuleSummary(exportedType, alreadyCollecting);
- alreadyCollecting.delete(exportedType);
- if (exportedModuleSummary) {
- exportedModules.push(exportedModuleSummary);
- }
- else {
- exportedNonModuleIdentifiers.push(_this._getIdentifierMetadata(exportedType));
- }
- });
- }
- // Note: This will be modified later, so we rely on
- // getting a new instance every time!
- var transitiveModule = this._getTransitiveNgModuleMetadata(importedModules, exportedModules);
- if (meta.declarations) {
- flattenAndDedupeArray(meta.declarations).forEach(function (declaredType) {
- if (!isValidType(declaredType)) {
- _this._reportError(syntaxError("Unexpected value '" + stringifyType(declaredType) + "' declared by the module '" + stringifyType(moduleType) + "'"), moduleType);
- return;
- }
- var declaredIdentifier = _this._getIdentifierMetadata(declaredType);
- if (_this.isDirective(declaredType)) {
- transitiveModule.addDirective(declaredIdentifier);
- declaredDirectives.push(declaredIdentifier);
- _this._addTypeToModule(declaredType, moduleType);
- }
- else if (_this.isPipe(declaredType)) {
- transitiveModule.addPipe(declaredIdentifier);
- transitiveModule.pipes.push(declaredIdentifier);
- declaredPipes.push(declaredIdentifier);
- _this._addTypeToModule(declaredType, moduleType);
- }
- else {
- _this._reportError(syntaxError("Unexpected " + _this._getTypeDescriptor(declaredType) + " '" + stringifyType(declaredType) + "' declared by the module '" + stringifyType(moduleType) + "'. Please add a @Pipe/@Directive/@Component annotation."), moduleType);
- return;
- }
- });
- }
- var exportedDirectives = [];
- var exportedPipes = [];
- exportedNonModuleIdentifiers.forEach(function (exportedId) {
- if (transitiveModule.directivesSet.has(exportedId.reference)) {
- exportedDirectives.push(exportedId);
- transitiveModule.addExportedDirective(exportedId);
- }
- else if (transitiveModule.pipesSet.has(exportedId.reference)) {
- exportedPipes.push(exportedId);
- transitiveModule.addExportedPipe(exportedId);
- }
- else {
- _this._reportError(syntaxError("Can't export " + _this._getTypeDescriptor(exportedId.reference) + " " + stringifyType(exportedId.reference) + " from " + stringifyType(moduleType) + " as it was neither declared nor imported!"), moduleType);
- return;
- }
- });
- // The providers of the module have to go last
- // so that they overwrite any other provider we already added.
- if (meta.providers) {
- providers.push.apply(providers, __spread(this._getProvidersMetadata(meta.providers, entryComponents, "provider for the NgModule '" + stringifyType(moduleType) + "'", [], moduleType)));
- }
- if (meta.entryComponents) {
- entryComponents.push.apply(entryComponents, __spread(flattenAndDedupeArray(meta.entryComponents)
- .map(function (type) { return _this._getEntryComponentMetadata(type); })));
- }
- if (meta.bootstrap) {
- flattenAndDedupeArray(meta.bootstrap).forEach(function (type) {
- if (!isValidType(type)) {
- _this._reportError(syntaxError("Unexpected value '" + stringifyType(type) + "' used in the bootstrap property of module '" + stringifyType(moduleType) + "'"), moduleType);
- return;
- }
- bootstrapComponents.push(_this._getIdentifierMetadata(type));
- });
- }
- entryComponents.push.apply(entryComponents, __spread(bootstrapComponents.map(function (type) { return _this._getEntryComponentMetadata(type.reference); })));
- if (meta.schemas) {
- schemas.push.apply(schemas, __spread(flattenAndDedupeArray(meta.schemas)));
- }
- compileMeta = new CompileNgModuleMetadata({
- type: this._getTypeMetadata(moduleType),
- providers: providers,
- entryComponents: entryComponents,
- bootstrapComponents: bootstrapComponents,
- schemas: schemas,
- declaredDirectives: declaredDirectives,
- exportedDirectives: exportedDirectives,
- declaredPipes: declaredPipes,
- exportedPipes: exportedPipes,
- importedModules: importedModules,
- exportedModules: exportedModules,
- transitiveModule: transitiveModule,
- id: meta.id || null,
- });
- entryComponents.forEach(function (id) { return transitiveModule.addEntryComponent(id); });
- providers.forEach(function (provider) { return transitiveModule.addProvider(provider, compileMeta.type); });
- transitiveModule.addModule(compileMeta.type);
- this._ngModuleCache.set(moduleType, compileMeta);
- return compileMeta;
- };
- CompileMetadataResolver.prototype._checkSelfImport = function (moduleType, importedModuleType) {
- if (moduleType === importedModuleType) {
- this._reportError(syntaxError("'" + stringifyType(moduleType) + "' module can't import itself"), moduleType);
- return true;
- }
- return false;
- };
- CompileMetadataResolver.prototype._getTypeDescriptor = function (type) {
- if (isValidType(type)) {
- if (this.isDirective(type)) {
- return 'directive';
- }
- if (this.isPipe(type)) {
- return 'pipe';
- }
- if (this.isNgModule(type)) {
- return 'module';
- }
- }
- if (type.provide) {
- return 'provider';
- }
- return 'value';
- };
- CompileMetadataResolver.prototype._addTypeToModule = function (type, moduleType) {
- var oldModule = this._ngModuleOfTypes.get(type);
- if (oldModule && oldModule !== moduleType) {
- this._reportError(syntaxError("Type " + stringifyType(type) + " is part of the declarations of 2 modules: " + stringifyType(oldModule) + " and " + stringifyType(moduleType) + "! " +
- ("Please consider moving " + stringifyType(type) + " to a higher module that imports " + stringifyType(oldModule) + " and " + stringifyType(moduleType) + ". ") +
- ("You can also create a new NgModule that exports and includes " + stringifyType(type) + " then import that NgModule in " + stringifyType(oldModule) + " and " + stringifyType(moduleType) + ".")), moduleType);
- return;
- }
- this._ngModuleOfTypes.set(type, moduleType);
- };
- CompileMetadataResolver.prototype._getTransitiveNgModuleMetadata = function (importedModules, exportedModules) {
- // collect `providers` / `entryComponents` from all imported and all exported modules
- var result = new TransitiveCompileNgModuleMetadata();
- var modulesByToken = new Map();
- importedModules.concat(exportedModules).forEach(function (modSummary) {
- modSummary.modules.forEach(function (mod) { return result.addModule(mod); });
- modSummary.entryComponents.forEach(function (comp) { return result.addEntryComponent(comp); });
- var addedTokens = new Set();
- modSummary.providers.forEach(function (entry) {
- var tokenRef = tokenReference(entry.provider.token);
- var prevModules = modulesByToken.get(tokenRef);
- if (!prevModules) {
- prevModules = new Set();
- modulesByToken.set(tokenRef, prevModules);
- }
- var moduleRef = entry.module.reference;
- // Note: the providers of one module may still contain multiple providers
- // per token (e.g. for multi providers), and we need to preserve these.
- if (addedTokens.has(tokenRef) || !prevModules.has(moduleRef)) {
- prevModules.add(moduleRef);
- addedTokens.add(tokenRef);
- result.addProvider(entry.provider, entry.module);
- }
- });
- });
- exportedModules.forEach(function (modSummary) {
- modSummary.exportedDirectives.forEach(function (id) { return result.addExportedDirective(id); });
- modSummary.exportedPipes.forEach(function (id) { return result.addExportedPipe(id); });
- });
- importedModules.forEach(function (modSummary) {
- modSummary.exportedDirectives.forEach(function (id) { return result.addDirective(id); });
- modSummary.exportedPipes.forEach(function (id) { return result.addPipe(id); });
- });
- return result;
- };
- CompileMetadataResolver.prototype._getIdentifierMetadata = function (type) {
- type = resolveForwardRef(type);
- return { reference: type };
- };
- CompileMetadataResolver.prototype.isInjectable = function (type) {
- var annotations = this._reflector.tryAnnotations(type);
- return annotations.some(function (ann) { return createInjectable.isTypeOf(ann); });
- };
- CompileMetadataResolver.prototype.getInjectableSummary = function (type) {
- return {
- summaryKind: CompileSummaryKind.Injectable,
- type: this._getTypeMetadata(type, null, false)
- };
- };
- CompileMetadataResolver.prototype.getInjectableMetadata = function (type, dependencies, throwOnUnknownDeps) {
- if (dependencies === void 0) { dependencies = null; }
- if (throwOnUnknownDeps === void 0) { throwOnUnknownDeps = true; }
- var typeSummary = this._loadSummary(type, CompileSummaryKind.Injectable);
- var typeMetadata = typeSummary ?
- typeSummary.type :
- this._getTypeMetadata(type, dependencies, throwOnUnknownDeps);
- var annotations = this._reflector.annotations(type).filter(function (ann) { return createInjectable.isTypeOf(ann); });
- if (annotations.length === 0) {
- return null;
- }
- var meta = annotations[annotations.length - 1];
- return {
- symbol: type,
- type: typeMetadata,
- providedIn: meta.providedIn,
- useValue: meta.useValue,
- useClass: meta.useClass,
- useExisting: meta.useExisting,
- useFactory: meta.useFactory,
- deps: meta.deps,
- };
- };
- CompileMetadataResolver.prototype._getTypeMetadata = function (type, dependencies, throwOnUnknownDeps) {
- if (dependencies === void 0) { dependencies = null; }
- if (throwOnUnknownDeps === void 0) { throwOnUnknownDeps = true; }
- var identifier = this._getIdentifierMetadata(type);
- return {
- reference: identifier.reference,
- diDeps: this._getDependenciesMetadata(identifier.reference, dependencies, throwOnUnknownDeps),
- lifecycleHooks: getAllLifecycleHooks(this._reflector, identifier.reference),
- };
- };
- CompileMetadataResolver.prototype._getFactoryMetadata = function (factory, dependencies) {
- if (dependencies === void 0) { dependencies = null; }
- factory = resolveForwardRef(factory);
- return { reference: factory, diDeps: this._getDependenciesMetadata(factory, dependencies) };
- };
- /**
- * Gets the metadata for the given pipe.
- * This assumes `loadNgModuleDirectiveAndPipeMetadata` has been called first.
- */
- CompileMetadataResolver.prototype.getPipeMetadata = function (pipeType) {
- var pipeMeta = this._pipeCache.get(pipeType);
- if (!pipeMeta) {
- this._reportError(syntaxError("Illegal state: getPipeMetadata can only be called after loadNgModuleDirectiveAndPipeMetadata for a module that declares it. Pipe " + stringifyType(pipeType) + "."), pipeType);
- }
- return pipeMeta || null;
- };
- CompileMetadataResolver.prototype.getPipeSummary = function (pipeType) {
- var pipeSummary = this._loadSummary(pipeType, CompileSummaryKind.Pipe);
- if (!pipeSummary) {
- this._reportError(syntaxError("Illegal state: Could not load the summary for pipe " + stringifyType(pipeType) + "."), pipeType);
- }
- return pipeSummary;
- };
- CompileMetadataResolver.prototype.getOrLoadPipeMetadata = function (pipeType) {
- var pipeMeta = this._pipeCache.get(pipeType);
- if (!pipeMeta) {
- pipeMeta = this._loadPipeMetadata(pipeType);
- }
- return pipeMeta;
- };
- CompileMetadataResolver.prototype._loadPipeMetadata = function (pipeType) {
- pipeType = resolveForwardRef(pipeType);
- var pipeAnnotation = this._pipeResolver.resolve(pipeType);
- var pipeMeta = new CompilePipeMetadata({
- type: this._getTypeMetadata(pipeType),
- name: pipeAnnotation.name,
- pure: !!pipeAnnotation.pure
- });
- this._pipeCache.set(pipeType, pipeMeta);
- this._summaryCache.set(pipeType, pipeMeta.toSummary());
- return pipeMeta;
- };
- CompileMetadataResolver.prototype._getDependenciesMetadata = function (typeOrFunc, dependencies, throwOnUnknownDeps) {
- var _this = this;
- if (throwOnUnknownDeps === void 0) { throwOnUnknownDeps = true; }
- var hasUnknownDeps = false;
- var params = dependencies || this._reflector.parameters(typeOrFunc) || [];
- var dependenciesMetadata = params.map(function (param) {
- var isAttribute = false;
- var isHost = false;
- var isSelf = false;
- var isSkipSelf = false;
- var isOptional = false;
- var token = null;
- if (Array.isArray(param)) {
- param.forEach(function (paramEntry) {
- if (createHost.isTypeOf(paramEntry)) {
- isHost = true;
- }
- else if (createSelf.isTypeOf(paramEntry)) {
- isSelf = true;
- }
- else if (createSkipSelf.isTypeOf(paramEntry)) {
- isSkipSelf = true;
- }
- else if (createOptional.isTypeOf(paramEntry)) {
- isOptional = true;
- }
- else if (createAttribute.isTypeOf(paramEntry)) {
- isAttribute = true;
- token = paramEntry.attributeName;
- }
- else if (createInject.isTypeOf(paramEntry)) {
- token = paramEntry.token;
- }
- else if (createInjectionToken.isTypeOf(paramEntry) ||
- paramEntry instanceof StaticSymbol) {
- token = paramEntry;
- }
- else if (isValidType(paramEntry) && token == null) {
- token = paramEntry;
- }
- });
- }
- else {
- token = param;
- }
- if (token == null) {
- hasUnknownDeps = true;
- return {};
- }
- return {
- isAttribute: isAttribute,
- isHost: isHost,
- isSelf: isSelf,
- isSkipSelf: isSkipSelf,
- isOptional: isOptional,
- token: _this._getTokenMetadata(token)
- };
- });
- if (hasUnknownDeps) {
- var depsTokens = dependenciesMetadata.map(function (dep) { return dep.token ? stringifyType(dep.token) : '?'; }).join(', ');
- var message = "Can't resolve all parameters for " + stringifyType(typeOrFunc) + ": (" + depsTokens + ").";
- if (throwOnUnknownDeps || this._config.strictInjectionParameters) {
- this._reportError(syntaxError(message), typeOrFunc);
- }
- else {
- this._console.warn("Warning: " + message + " This will become an error in Angular v6.x");
- }
- }
- return dependenciesMetadata;
- };
- CompileMetadataResolver.prototype._getTokenMetadata = function (token) {
- token = resolveForwardRef(token);
- var compileToken;
- if (typeof token === 'string') {
- compileToken = { value: token };
- }
- else {
- compileToken = { identifier: { reference: token } };
- }
- return compileToken;
- };
- CompileMetadataResolver.prototype._getProvidersMetadata = function (providers, targetEntryComponents, debugInfo, compileProviders, type) {
- var _this = this;
- if (compileProviders === void 0) { compileProviders = []; }
- providers.forEach(function (provider, providerIdx) {
- if (Array.isArray(provider)) {
- _this._getProvidersMetadata(provider, targetEntryComponents, debugInfo, compileProviders);
- }
- else {
- provider = resolveForwardRef(provider);
- var providerMeta = undefined;
- if (provider && typeof provider === 'object' && provider.hasOwnProperty('provide')) {
- _this._validateProvider(provider);
- providerMeta = new ProviderMeta(provider.provide, provider);
- }
- else if (isValidType(provider)) {
- providerMeta = new ProviderMeta(provider, { useClass: provider });
- }
- else if (provider === void 0) {
- _this._reportError(syntaxError("Encountered undefined provider! Usually this means you have a circular dependencies. This might be caused by using 'barrel' index.ts files."));
- return;
- }
- else {
- var providersInfo = providers.reduce(function (soFar, seenProvider, seenProviderIdx) {
- if (seenProviderIdx < providerIdx) {
- soFar.push("" + stringifyType(seenProvider));
- }
- else if (seenProviderIdx == providerIdx) {
- soFar.push("?" + stringifyType(seenProvider) + "?");
- }
- else if (seenProviderIdx == providerIdx + 1) {
- soFar.push('...');
- }
- return soFar;
- }, [])
- .join(', ');
- _this._reportError(syntaxError("Invalid " + (debugInfo ? debugInfo : 'provider') + " - only instances of Provider and Type are allowed, got: [" + providersInfo + "]"), type);
- return;
- }
- if (providerMeta.token ===
- _this._reflector.resolveExternalReference(Identifiers.ANALYZE_FOR_ENTRY_COMPONENTS)) {
- targetEntryComponents.push.apply(targetEntryComponents, __spread(_this._getEntryComponentsFromProvider(providerMeta, type)));
- }
- else {
- compileProviders.push(_this.getProviderMetadata(providerMeta));
- }
- }
- });
- return compileProviders;
- };
- CompileMetadataResolver.prototype._validateProvider = function (provider) {
- if (provider.hasOwnProperty('useClass') && provider.useClass == null) {
- this._reportError(syntaxError("Invalid provider for " + stringifyType(provider.provide) + ". useClass cannot be " + provider.useClass + ".\n Usually it happens when:\n 1. There's a circular dependency (might be caused by using index.ts (barrel) files).\n 2. Class was used before it was declared. Use forwardRef in this case."));
- }
- };
- CompileMetadataResolver.prototype._getEntryComponentsFromProvider = function (provider, type) {
- var _this = this;
- var components = [];
- var collectedIdentifiers = [];
- if (provider.useFactory || provider.useExisting || provider.useClass) {
- this._reportError(syntaxError("The ANALYZE_FOR_ENTRY_COMPONENTS token only supports useValue!"), type);
- return [];
- }
- if (!provider.multi) {
- this._reportError(syntaxError("The ANALYZE_FOR_ENTRY_COMPONENTS token only supports 'multi = true'!"), type);
- return [];
- }
- extractIdentifiers(provider.useValue, collectedIdentifiers);
- collectedIdentifiers.forEach(function (identifier) {
- var entry = _this._getEntryComponentMetadata(identifier.reference, false);
- if (entry) {
- components.push(entry);
- }
- });
- return components;
- };
- CompileMetadataResolver.prototype._getEntryComponentMetadata = function (dirType, throwIfNotFound) {
- if (throwIfNotFound === void 0) { throwIfNotFound = true; }
- var dirMeta = this.getNonNormalizedDirectiveMetadata(dirType);
- if (dirMeta && dirMeta.metadata.isComponent) {
- return { componentType: dirType, componentFactory: dirMeta.metadata.componentFactory };
- }
- var dirSummary = this._loadSummary(dirType, CompileSummaryKind.Directive);
- if (dirSummary && dirSummary.isComponent) {
- return { componentType: dirType, componentFactory: dirSummary.componentFactory };
- }
- if (throwIfNotFound) {
- throw syntaxError(dirType.name + " cannot be used as an entry component.");
- }
- return null;
- };
- CompileMetadataResolver.prototype._getInjectableTypeMetadata = function (type, dependencies) {
- if (dependencies === void 0) { dependencies = null; }
- var typeSummary = this._loadSummary(type, CompileSummaryKind.Injectable);
- if (typeSummary) {
- return typeSummary.type;
- }
- return this._getTypeMetadata(type, dependencies);
- };
- CompileMetadataResolver.prototype.getProviderMetadata = function (provider) {
- var compileDeps = undefined;
- var compileTypeMetadata = null;
- var compileFactoryMetadata = null;
- var token = this._getTokenMetadata(provider.token);
- if (provider.useClass) {
- compileTypeMetadata =
- this._getInjectableTypeMetadata(provider.useClass, provider.dependencies);
- compileDeps = compileTypeMetadata.diDeps;
- if (provider.token === provider.useClass) {
- // use the compileTypeMetadata as it contains information about lifecycleHooks...
- token = { identifier: compileTypeMetadata };
- }
- }
- else if (provider.useFactory) {
- compileFactoryMetadata = this._getFactoryMetadata(provider.useFactory, provider.dependencies);
- compileDeps = compileFactoryMetadata.diDeps;
- }
- return {
- token: token,
- useClass: compileTypeMetadata,
- useValue: provider.useValue,
- useFactory: compileFactoryMetadata,
- useExisting: provider.useExisting ? this._getTokenMetadata(provider.useExisting) : undefined,
- deps: compileDeps,
- multi: provider.multi
- };
- };
- CompileMetadataResolver.prototype._getQueriesMetadata = function (queries, isViewQuery, directiveType) {
- var _this = this;
- var res = [];
- Object.keys(queries).forEach(function (propertyName) {
- var query = queries[propertyName];
- if (query.isViewQuery === isViewQuery) {
- res.push(_this._getQueryMetadata(query, propertyName, directiveType));
- }
- });
- return res;
- };
- CompileMetadataResolver.prototype._queryVarBindings = function (selector) { return selector.split(/\s*,\s*/); };
- CompileMetadataResolver.prototype._getQueryMetadata = function (q, propertyName, typeOrFunc) {
- var _this = this;
- var selectors;
- if (typeof q.selector === 'string') {
- selectors =
- this._queryVarBindings(q.selector).map(function (varName) { return _this._getTokenMetadata(varName); });
- }
- else {
- if (!q.selector) {
- this._reportError(syntaxError("Can't construct a query for the property \"" + propertyName + "\" of \"" + stringifyType(typeOrFunc) + "\" since the query selector wasn't defined."), typeOrFunc);
- selectors = [];
- }
- else {
- selectors = [this._getTokenMetadata(q.selector)];
- }
- }
- return {
- selectors: selectors,
- first: q.first,
- descendants: q.descendants, propertyName: propertyName,
- read: q.read ? this._getTokenMetadata(q.read) : null,
- static: q.static
- };
- };
- CompileMetadataResolver.prototype._reportError = function (error, type, otherType) {
- if (this._errorCollector) {
- this._errorCollector(error, type);
- if (otherType) {
- this._errorCollector(error, otherType);
- }
- }
- else {
- throw error;
- }
- };
- return CompileMetadataResolver;
- }());
- function flattenArray(tree, out) {
- if (out === void 0) { out = []; }
- if (tree) {
- for (var i = 0; i < tree.length; i++) {
- var item = resolveForwardRef(tree[i]);
- if (Array.isArray(item)) {
- flattenArray(item, out);
- }
- else {
- out.push(item);
- }
- }
- }
- return out;
- }
- function dedupeArray(array) {
- if (array) {
- return Array.from(new Set(array));
- }
- return [];
- }
- function flattenAndDedupeArray(tree) {
- return dedupeArray(flattenArray(tree));
- }
- function isValidType(value) {
- return (value instanceof StaticSymbol) || (value instanceof Type);
- }
- function extractIdentifiers(value, targetIdentifiers) {
- visitValue(value, new _CompileValueConverter(), targetIdentifiers);
- }
- var _CompileValueConverter = /** @class */ (function (_super) {
- __extends(_CompileValueConverter, _super);
- function _CompileValueConverter() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- _CompileValueConverter.prototype.visitOther = function (value, targetIdentifiers) {
- targetIdentifiers.push({ reference: value });
- };
- return _CompileValueConverter;
- }(ValueTransformer));
- function stringifyType(type) {
- if (type instanceof StaticSymbol) {
- return type.name + " in " + type.filePath;
- }
- else {
- return stringify(type);
- }
- }
- /**
- * Indicates that a component is still being loaded in a synchronous compile.
- */
- function componentStillLoadingError(compType) {
- var error = Error("Can't compile synchronously as " + stringify(compType) + " is still being loaded!");
- error[ERROR_COMPONENT_TYPE] = compType;
- return error;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var LOG_VAR = variable('_l');
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Resolves types to {@link NgModule}.
- */
- var NgModuleResolver = /** @class */ (function () {
- function NgModuleResolver(_reflector) {
- this._reflector = _reflector;
- }
- NgModuleResolver.prototype.isNgModule = function (type) { return this._reflector.annotations(type).some(createNgModule.isTypeOf); };
- NgModuleResolver.prototype.resolve = function (type, throwIfNotFound) {
- if (throwIfNotFound === void 0) { throwIfNotFound = true; }
- var ngModuleMeta = findLast(this._reflector.annotations(type), createNgModule.isTypeOf);
- if (ngModuleMeta) {
- return ngModuleMeta;
- }
- else {
- if (throwIfNotFound) {
- throw new Error("No NgModule metadata found for '" + stringify(type) + "'.");
- }
- return null;
- }
- };
- return NgModuleResolver;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _TsEmitterVisitor = /** @class */ (function (_super) {
- __extends(_TsEmitterVisitor, _super);
- function _TsEmitterVisitor(referenceFilter, importFilter) {
- var _this = _super.call(this, false) || this;
- _this.referenceFilter = referenceFilter;
- _this.importFilter = importFilter;
- _this.typeExpression = 0;
- _this.importsWithPrefixes = new Map();
- _this.reexports = new Map();
- return _this;
- }
- _TsEmitterVisitor.prototype.visitType = function (t, ctx, defaultType) {
- if (defaultType === void 0) { defaultType = 'any'; }
- if (t) {
- this.typeExpression++;
- t.visitType(this, ctx);
- this.typeExpression--;
- }
- else {
- ctx.print(null, defaultType);
- }
- };
- _TsEmitterVisitor.prototype.visitLiteralExpr = function (ast, ctx) {
- var value = ast.value;
- if (value == null && ast.type != INFERRED_TYPE) {
- ctx.print(ast, "(" + value + " as any)");
- return null;
- }
- return _super.prototype.visitLiteralExpr.call(this, ast, ctx);
- };
- // Temporary workaround to support strictNullCheck enabled consumers of ngc emit.
- // In SNC mode, [] have the type never[], so we cast here to any[].
- // TODO: narrow the cast to a more explicit type, or use a pattern that does not
- // start with [].concat. see https://github.com/angular/angular/pull/11846
- _TsEmitterVisitor.prototype.visitLiteralArrayExpr = function (ast, ctx) {
- if (ast.entries.length === 0) {
- ctx.print(ast, '(');
- }
- var result = _super.prototype.visitLiteralArrayExpr.call(this, ast, ctx);
- if (ast.entries.length === 0) {
- ctx.print(ast, ' as any[])');
- }
- return result;
- };
- _TsEmitterVisitor.prototype.visitExternalExpr = function (ast, ctx) {
- this._visitIdentifier(ast.value, ast.typeParams, ctx);
- return null;
- };
- _TsEmitterVisitor.prototype.visitAssertNotNullExpr = function (ast, ctx) {
- var result = _super.prototype.visitAssertNotNullExpr.call(this, ast, ctx);
- ctx.print(ast, '!');
- return result;
- };
- _TsEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) {
- if (stmt.hasModifier(StmtModifier.Exported) && stmt.value instanceof ExternalExpr &&
- !stmt.type) {
- // check for a reexport
- var _a = stmt.value.value, name_1 = _a.name, moduleName = _a.moduleName;
- if (moduleName) {
- var reexports = this.reexports.get(moduleName);
- if (!reexports) {
- reexports = [];
- this.reexports.set(moduleName, reexports);
- }
- reexports.push({ name: name_1, as: stmt.name });
- return null;
- }
- }
- if (stmt.hasModifier(StmtModifier.Exported)) {
- ctx.print(stmt, "export ");
- }
- if (stmt.hasModifier(StmtModifier.Final)) {
- ctx.print(stmt, "const");
- }
- else {
- ctx.print(stmt, "var");
- }
- ctx.print(stmt, " " + stmt.name);
- this._printColonType(stmt.type, ctx);
- if (stmt.value) {
- ctx.print(stmt, " = ");
- stmt.value.visitExpression(this, ctx);
- }
- ctx.println(stmt, ";");
- return null;
- };
- _TsEmitterVisitor.prototype.visitWrappedNodeExpr = function (ast, ctx) {
- throw new Error('Cannot visit a WrappedNodeExpr when outputting Typescript.');
- };
- _TsEmitterVisitor.prototype.visitCastExpr = function (ast, ctx) {
- ctx.print(ast, "(<");
- ast.type.visitType(this, ctx);
- ctx.print(ast, ">");
- ast.value.visitExpression(this, ctx);
- ctx.print(ast, ")");
- return null;
- };
- _TsEmitterVisitor.prototype.visitInstantiateExpr = function (ast, ctx) {
- ctx.print(ast, "new ");
- this.typeExpression++;
- ast.classExpr.visitExpression(this, ctx);
- this.typeExpression--;
- ctx.print(ast, "(");
- this.visitAllExpressions(ast.args, ctx, ',');
- ctx.print(ast, ")");
- return null;
- };
- _TsEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) {
- var _this = this;
- ctx.pushClass(stmt);
- if (stmt.hasModifier(StmtModifier.Exported)) {
- ctx.print(stmt, "export ");
- }
- ctx.print(stmt, "class " + stmt.name);
- if (stmt.parent != null) {
- ctx.print(stmt, " extends ");
- this.typeExpression++;
- stmt.parent.visitExpression(this, ctx);
- this.typeExpression--;
- }
- ctx.println(stmt, " {");
- ctx.incIndent();
- stmt.fields.forEach(function (field) { return _this._visitClassField(field, ctx); });
- if (stmt.constructorMethod != null) {
- this._visitClassConstructor(stmt, ctx);
- }
- stmt.getters.forEach(function (getter) { return _this._visitClassGetter(getter, ctx); });
- stmt.methods.forEach(function (method) { return _this._visitClassMethod(method, ctx); });
- ctx.decIndent();
- ctx.println(stmt, "}");
- ctx.popClass();
- return null;
- };
- _TsEmitterVisitor.prototype._visitClassField = function (field, ctx) {
- if (field.hasModifier(StmtModifier.Private)) {
- // comment out as a workaround for #10967
- ctx.print(null, "/*private*/ ");
- }
- if (field.hasModifier(StmtModifier.Static)) {
- ctx.print(null, 'static ');
- }
- ctx.print(null, field.name);
- this._printColonType(field.type, ctx);
- if (field.initializer) {
- ctx.print(null, ' = ');
- field.initializer.visitExpression(this, ctx);
- }
- ctx.println(null, ";");
- };
- _TsEmitterVisitor.prototype._visitClassGetter = function (getter, ctx) {
- if (getter.hasModifier(StmtModifier.Private)) {
- ctx.print(null, "private ");
- }
- ctx.print(null, "get " + getter.name + "()");
- this._printColonType(getter.type, ctx);
- ctx.println(null, " {");
- ctx.incIndent();
- this.visitAllStatements(getter.body, ctx);
- ctx.decIndent();
- ctx.println(null, "}");
- };
- _TsEmitterVisitor.prototype._visitClassConstructor = function (stmt, ctx) {
- ctx.print(stmt, "constructor(");
- this._visitParams(stmt.constructorMethod.params, ctx);
- ctx.println(stmt, ") {");
- ctx.incIndent();
- this.visitAllStatements(stmt.constructorMethod.body, ctx);
- ctx.decIndent();
- ctx.println(stmt, "}");
- };
- _TsEmitterVisitor.prototype._visitClassMethod = function (method, ctx) {
- if (method.hasModifier(StmtModifier.Private)) {
- ctx.print(null, "private ");
- }
- ctx.print(null, method.name + "(");
- this._visitParams(method.params, ctx);
- ctx.print(null, ")");
- this._printColonType(method.type, ctx, 'void');
- ctx.println(null, " {");
- ctx.incIndent();
- this.visitAllStatements(method.body, ctx);
- ctx.decIndent();
- ctx.println(null, "}");
- };
- _TsEmitterVisitor.prototype.visitFunctionExpr = function (ast, ctx) {
- if (ast.name) {
- ctx.print(ast, 'function ');
- ctx.print(ast, ast.name);
- }
- ctx.print(ast, "(");
- this._visitParams(ast.params, ctx);
- ctx.print(ast, ")");
- this._printColonType(ast.type, ctx, 'void');
- if (!ast.name) {
- ctx.print(ast, " => ");
- }
- ctx.println(ast, '{');
- ctx.incIndent();
- this.visitAllStatements(ast.statements, ctx);
- ctx.decIndent();
- ctx.print(ast, "}");
- return null;
- };
- _TsEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {
- if (stmt.hasModifier(StmtModifier.Exported)) {
- ctx.print(stmt, "export ");
- }
- ctx.print(stmt, "function " + stmt.name + "(");
- this._visitParams(stmt.params, ctx);
- ctx.print(stmt, ")");
- this._printColonType(stmt.type, ctx, 'void');
- ctx.println(stmt, " {");
- ctx.incIndent();
- this.visitAllStatements(stmt.statements, ctx);
- ctx.decIndent();
- ctx.println(stmt, "}");
- return null;
- };
- _TsEmitterVisitor.prototype.visitTryCatchStmt = function (stmt, ctx) {
- ctx.println(stmt, "try {");
- ctx.incIndent();
- this.visitAllStatements(stmt.bodyStmts, ctx);
- ctx.decIndent();
- ctx.println(stmt, "} catch (" + CATCH_ERROR_VAR$1.name + ") {");
- ctx.incIndent();
- var catchStmts = [CATCH_STACK_VAR$1.set(CATCH_ERROR_VAR$1.prop('stack', null)).toDeclStmt(null, [
- StmtModifier.Final
- ])].concat(stmt.catchStmts);
- this.visitAllStatements(catchStmts, ctx);
- ctx.decIndent();
- ctx.println(stmt, "}");
- return null;
- };
- _TsEmitterVisitor.prototype.visitBuiltinType = function (type, ctx) {
- var typeStr;
- switch (type.name) {
- case BuiltinTypeName.Bool:
- typeStr = 'boolean';
- break;
- case BuiltinTypeName.Dynamic:
- typeStr = 'any';
- break;
- case BuiltinTypeName.Function:
- typeStr = 'Function';
- break;
- case BuiltinTypeName.Number:
- typeStr = 'number';
- break;
- case BuiltinTypeName.Int:
- typeStr = 'number';
- break;
- case BuiltinTypeName.String:
- typeStr = 'string';
- break;
- case BuiltinTypeName.None:
- typeStr = 'never';
- break;
- default:
- throw new Error("Unsupported builtin type " + type.name);
- }
- ctx.print(null, typeStr);
- return null;
- };
- _TsEmitterVisitor.prototype.visitExpressionType = function (ast, ctx) {
- var _this = this;
- ast.value.visitExpression(this, ctx);
- if (ast.typeParams !== null) {
- ctx.print(null, '<');
- this.visitAllObjects(function (type) { return _this.visitType(type, ctx); }, ast.typeParams, ctx, ',');
- ctx.print(null, '>');
- }
- return null;
- };
- _TsEmitterVisitor.prototype.visitArrayType = function (type, ctx) {
- this.visitType(type.of, ctx);
- ctx.print(null, "[]");
- return null;
- };
- _TsEmitterVisitor.prototype.visitMapType = function (type, ctx) {
- ctx.print(null, "{[key: string]:");
- this.visitType(type.valueType, ctx);
- ctx.print(null, "}");
- return null;
- };
- _TsEmitterVisitor.prototype.getBuiltinMethodName = function (method) {
- var name;
- switch (method) {
- case BuiltinMethod.ConcatArray:
- name = 'concat';
- break;
- case BuiltinMethod.SubscribeObservable:
- name = 'subscribe';
- break;
- case BuiltinMethod.Bind:
- name = 'bind';
- break;
- default:
- throw new Error("Unknown builtin method: " + method);
- }
- return name;
- };
- _TsEmitterVisitor.prototype._visitParams = function (params, ctx) {
- var _this = this;
- this.visitAllObjects(function (param) {
- ctx.print(null, param.name);
- _this._printColonType(param.type, ctx);
- }, params, ctx, ',');
- };
- _TsEmitterVisitor.prototype._visitIdentifier = function (value, typeParams, ctx) {
- var _this = this;
- var name = value.name, moduleName = value.moduleName;
- if (this.referenceFilter && this.referenceFilter(value)) {
- ctx.print(null, '(null as any)');
- return;
- }
- if (moduleName && (!this.importFilter || !this.importFilter(value))) {
- var prefix = this.importsWithPrefixes.get(moduleName);
- if (prefix == null) {
- prefix = "i" + this.importsWithPrefixes.size;
- this.importsWithPrefixes.set(moduleName, prefix);
- }
- ctx.print(null, prefix + ".");
- }
- ctx.print(null, name);
- if (this.typeExpression > 0) {
- // If we are in a type expression that refers to a generic type then supply
- // the required type parameters. If there were not enough type parameters
- // supplied, supply any as the type. Outside a type expression the reference
- // should not supply type parameters and be treated as a simple value reference
- // to the constructor function itself.
- var suppliedParameters = typeParams || [];
- if (suppliedParameters.length > 0) {
- ctx.print(null, "<");
- this.visitAllObjects(function (type) { return type.visitType(_this, ctx); }, typeParams, ctx, ',');
- ctx.print(null, ">");
- }
- }
- };
- _TsEmitterVisitor.prototype._printColonType = function (type, ctx, defaultType) {
- if (type !== INFERRED_TYPE) {
- ctx.print(null, ':');
- this.visitType(type, ctx, defaultType);
- }
- };
- return _TsEmitterVisitor;
- }(AbstractEmitterVisitor));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Resolve a `Type` for {@link Pipe}.
- *
- * This interface can be overridden by the application developer to create custom behavior.
- *
- * See {@link Compiler}
- */
- var PipeResolver = /** @class */ (function () {
- function PipeResolver(_reflector) {
- this._reflector = _reflector;
- }
- PipeResolver.prototype.isPipe = function (type) {
- var typeMetadata = this._reflector.annotations(resolveForwardRef(type));
- return typeMetadata && typeMetadata.some(createPipe.isTypeOf);
- };
- /**
- * Return {@link Pipe} for a given `Type`.
- */
- PipeResolver.prototype.resolve = function (type, throwIfNotFound) {
- if (throwIfNotFound === void 0) { throwIfNotFound = true; }
- var metas = this._reflector.annotations(resolveForwardRef(type));
- if (metas) {
- var annotation = findLast(metas, createPipe.isTypeOf);
- if (annotation) {
- return annotation;
- }
- }
- if (throwIfNotFound) {
- throw new Error("No Pipe decorator found on " + stringify(type));
- }
- return null;
- };
- return PipeResolver;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var LOG_VAR$1 = variable('_l');
- var VIEW_VAR = variable('_v');
- var CHECK_VAR = variable('_ck');
- var COMP_VAR = variable('_co');
- var EVENT_NAME_VAR = variable('en');
- var ALLOW_DEFAULT_VAR = variable("ad");
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // Transform an i18n AST by renaming the placeholder nodes with the given mapper
- var MapPlaceholderNames = /** @class */ (function (_super) {
- __extends(MapPlaceholderNames, _super);
- function MapPlaceholderNames() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- MapPlaceholderNames.prototype.convert = function (nodes, mapper) {
- var _this = this;
- return mapper ? nodes.map(function (n) { return n.visit(_this, mapper); }) : nodes;
- };
- MapPlaceholderNames.prototype.visitTagPlaceholder = function (ph, mapper) {
- var _this = this;
- var startName = mapper.toPublicName(ph.startName);
- var closeName = ph.closeName ? mapper.toPublicName(ph.closeName) : ph.closeName;
- var children = ph.children.map(function (n) { return n.visit(_this, mapper); });
- return new TagPlaceholder(ph.tag, ph.attrs, startName, closeName, children, ph.isVoid, ph.sourceSpan);
- };
- MapPlaceholderNames.prototype.visitPlaceholder = function (ph, mapper) {
- return new Placeholder(ph.value, mapper.toPublicName(ph.name), ph.sourceSpan);
- };
- MapPlaceholderNames.prototype.visitIcuPlaceholder = function (ph, mapper) {
- return new IcuPlaceholder(ph.value, mapper.toPublicName(ph.name), ph.sourceSpan);
- };
- return MapPlaceholderNames;
- }(CloneVisitor));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TS = /^(?!.*\.d\.ts$).*\.ts$/;
- var ResolvedStaticSymbol = /** @class */ (function () {
- function ResolvedStaticSymbol(symbol, metadata) {
- this.symbol = symbol;
- this.metadata = metadata;
- }
- return ResolvedStaticSymbol;
- }());
- var SUPPORTED_SCHEMA_VERSION = 4;
- /**
- * This class is responsible for loading metadata per symbol,
- * and normalizing references between symbols.
- *
- * Internally, it only uses symbols without members,
- * and deduces the values for symbols with members based
- * on these symbols.
- */
- var StaticSymbolResolver = /** @class */ (function () {
- function StaticSymbolResolver(host, staticSymbolCache, summaryResolver, errorRecorder) {
- this.host = host;
- this.staticSymbolCache = staticSymbolCache;
- this.summaryResolver = summaryResolver;
- this.errorRecorder = errorRecorder;
- this.metadataCache = new Map();
- // Note: this will only contain StaticSymbols without members!
- this.resolvedSymbols = new Map();
- this.resolvedFilePaths = new Set();
- // Note: this will only contain StaticSymbols without members!
- this.importAs = new Map();
- this.symbolResourcePaths = new Map();
- this.symbolFromFile = new Map();
- this.knownFileNameToModuleNames = new Map();
- }
- StaticSymbolResolver.prototype.resolveSymbol = function (staticSymbol) {
- if (staticSymbol.members.length > 0) {
- return this._resolveSymbolMembers(staticSymbol);
- }
- // Note: always ask for a summary first,
- // as we might have read shallow metadata via a .d.ts file
- // for the symbol.
- var resultFromSummary = this._resolveSymbolFromSummary(staticSymbol);
- if (resultFromSummary) {
- return resultFromSummary;
- }
- var resultFromCache = this.resolvedSymbols.get(staticSymbol);
- if (resultFromCache) {
- return resultFromCache;
- }
- // Note: Some users use libraries that were not compiled with ngc, i.e. they don't
- // have summaries, only .d.ts files. So we always need to check both, the summary
- // and metadata.
- this._createSymbolsOf(staticSymbol.filePath);
- return this.resolvedSymbols.get(staticSymbol);
- };
- /**
- * getImportAs produces a symbol that can be used to import the given symbol.
- * The import might be different than the symbol if the symbol is exported from
- * a library with a summary; in which case we want to import the symbol from the
- * ngfactory re-export instead of directly to avoid introducing a direct dependency
- * on an otherwise indirect dependency.
- *
- * @param staticSymbol the symbol for which to generate a import symbol
- */
- StaticSymbolResolver.prototype.getImportAs = function (staticSymbol, useSummaries) {
- if (useSummaries === void 0) { useSummaries = true; }
- if (staticSymbol.members.length) {
- var baseSymbol = this.getStaticSymbol(staticSymbol.filePath, staticSymbol.name);
- var baseImportAs = this.getImportAs(baseSymbol, useSummaries);
- return baseImportAs ?
- this.getStaticSymbol(baseImportAs.filePath, baseImportAs.name, staticSymbol.members) :
- null;
- }
- var summarizedFileName = stripSummaryForJitFileSuffix(staticSymbol.filePath);
- if (summarizedFileName !== staticSymbol.filePath) {
- var summarizedName = stripSummaryForJitNameSuffix(staticSymbol.name);
- var baseSymbol = this.getStaticSymbol(summarizedFileName, summarizedName, staticSymbol.members);
- var baseImportAs = this.getImportAs(baseSymbol, useSummaries);
- return baseImportAs ?
- this.getStaticSymbol(summaryForJitFileName(baseImportAs.filePath), summaryForJitName(baseImportAs.name), baseSymbol.members) :
- null;
- }
- var result = (useSummaries && this.summaryResolver.getImportAs(staticSymbol)) || null;
- if (!result) {
- result = this.importAs.get(staticSymbol);
- }
- return result;
- };
- /**
- * getResourcePath produces the path to the original location of the symbol and should
- * be used to determine the relative location of resource references recorded in
- * symbol metadata.
- */
- StaticSymbolResolver.prototype.getResourcePath = function (staticSymbol) {
- return this.symbolResourcePaths.get(staticSymbol) || staticSymbol.filePath;
- };
- /**
- * getTypeArity returns the number of generic type parameters the given symbol
- * has. If the symbol is not a type the result is null.
- */
- StaticSymbolResolver.prototype.getTypeArity = function (staticSymbol) {
- // If the file is a factory/ngsummary file, don't resolve the symbol as doing so would
- // cause the metadata for an factory/ngsummary file to be loaded which doesn't exist.
- // All references to generated classes must include the correct arity whenever
- // generating code.
- if (isGeneratedFile(staticSymbol.filePath)) {
- return null;
- }
- var resolvedSymbol = unwrapResolvedMetadata(this.resolveSymbol(staticSymbol));
- while (resolvedSymbol && resolvedSymbol.metadata instanceof StaticSymbol) {
- resolvedSymbol = unwrapResolvedMetadata(this.resolveSymbol(resolvedSymbol.metadata));
- }
- return (resolvedSymbol && resolvedSymbol.metadata && resolvedSymbol.metadata.arity) || null;
- };
- StaticSymbolResolver.prototype.getKnownModuleName = function (filePath) {
- return this.knownFileNameToModuleNames.get(filePath) || null;
- };
- StaticSymbolResolver.prototype.recordImportAs = function (sourceSymbol, targetSymbol) {
- sourceSymbol.assertNoMembers();
- targetSymbol.assertNoMembers();
- this.importAs.set(sourceSymbol, targetSymbol);
- };
- StaticSymbolResolver.prototype.recordModuleNameForFileName = function (fileName, moduleName) {
- this.knownFileNameToModuleNames.set(fileName, moduleName);
- };
- /**
- * Invalidate all information derived from the given file.
- *
- * @param fileName the file to invalidate
- */
- StaticSymbolResolver.prototype.invalidateFile = function (fileName) {
- var e_1, _a;
- this.metadataCache.delete(fileName);
- this.resolvedFilePaths.delete(fileName);
- var symbols = this.symbolFromFile.get(fileName);
- if (symbols) {
- this.symbolFromFile.delete(fileName);
- try {
- for (var symbols_1 = __values(symbols), symbols_1_1 = symbols_1.next(); !symbols_1_1.done; symbols_1_1 = symbols_1.next()) {
- var symbol = symbols_1_1.value;
- this.resolvedSymbols.delete(symbol);
- this.importAs.delete(symbol);
- this.symbolResourcePaths.delete(symbol);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (symbols_1_1 && !symbols_1_1.done && (_a = symbols_1.return)) _a.call(symbols_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- };
- /** @internal */
- StaticSymbolResolver.prototype.ignoreErrorsFor = function (cb) {
- var recorder = this.errorRecorder;
- this.errorRecorder = function () { };
- try {
- return cb();
- }
- finally {
- this.errorRecorder = recorder;
- }
- };
- StaticSymbolResolver.prototype._resolveSymbolMembers = function (staticSymbol) {
- var members = staticSymbol.members;
- var baseResolvedSymbol = this.resolveSymbol(this.getStaticSymbol(staticSymbol.filePath, staticSymbol.name));
- if (!baseResolvedSymbol) {
- return null;
- }
- var baseMetadata = unwrapResolvedMetadata(baseResolvedSymbol.metadata);
- if (baseMetadata instanceof StaticSymbol) {
- return new ResolvedStaticSymbol(staticSymbol, this.getStaticSymbol(baseMetadata.filePath, baseMetadata.name, members));
- }
- else if (baseMetadata && baseMetadata.__symbolic === 'class') {
- if (baseMetadata.statics && members.length === 1) {
- return new ResolvedStaticSymbol(staticSymbol, baseMetadata.statics[members[0]]);
- }
- }
- else {
- var value = baseMetadata;
- for (var i = 0; i < members.length && value; i++) {
- value = value[members[i]];
- }
- return new ResolvedStaticSymbol(staticSymbol, value);
- }
- return null;
- };
- StaticSymbolResolver.prototype._resolveSymbolFromSummary = function (staticSymbol) {
- var summary = this.summaryResolver.resolveSummary(staticSymbol);
- return summary ? new ResolvedStaticSymbol(staticSymbol, summary.metadata) : null;
- };
- /**
- * getStaticSymbol produces a Type whose metadata is known but whose implementation is not loaded.
- * All types passed to the StaticResolver should be pseudo-types returned by this method.
- *
- * @param declarationFile the absolute path of the file where the symbol is declared
- * @param name the name of the type.
- * @param members a symbol for a static member of the named type
- */
- StaticSymbolResolver.prototype.getStaticSymbol = function (declarationFile, name, members) {
- return this.staticSymbolCache.get(declarationFile, name, members);
- };
- /**
- * hasDecorators checks a file's metadata for the presence of decorators without evaluating the
- * metadata.
- *
- * @param filePath the absolute path to examine for decorators.
- * @returns true if any class in the file has a decorator.
- */
- StaticSymbolResolver.prototype.hasDecorators = function (filePath) {
- var metadata = this.getModuleMetadata(filePath);
- if (metadata['metadata']) {
- return Object.keys(metadata['metadata']).some(function (metadataKey) {
- var entry = metadata['metadata'][metadataKey];
- return entry && entry.__symbolic === 'class' && entry.decorators;
- });
- }
- return false;
- };
- StaticSymbolResolver.prototype.getSymbolsOf = function (filePath) {
- var summarySymbols = this.summaryResolver.getSymbolsOf(filePath);
- if (summarySymbols) {
- return summarySymbols;
- }
- // Note: Some users use libraries that were not compiled with ngc, i.e. they don't
- // have summaries, only .d.ts files, but `summaryResolver.isLibraryFile` returns true.
- this._createSymbolsOf(filePath);
- var metadataSymbols = [];
- this.resolvedSymbols.forEach(function (resolvedSymbol) {
- if (resolvedSymbol.symbol.filePath === filePath) {
- metadataSymbols.push(resolvedSymbol.symbol);
- }
- });
- return metadataSymbols;
- };
- StaticSymbolResolver.prototype._createSymbolsOf = function (filePath) {
- var _this = this;
- var e_2, _a;
- if (this.resolvedFilePaths.has(filePath)) {
- return;
- }
- this.resolvedFilePaths.add(filePath);
- var resolvedSymbols = [];
- var metadata = this.getModuleMetadata(filePath);
- if (metadata['importAs']) {
- // Index bundle indices should use the importAs module name defined
- // in the bundle.
- this.knownFileNameToModuleNames.set(filePath, metadata['importAs']);
- }
- // handle the symbols in one of the re-export location
- if (metadata['exports']) {
- var _loop_1 = function (moduleExport) {
- // handle the symbols in the list of explicitly re-exported symbols.
- if (moduleExport.export) {
- moduleExport.export.forEach(function (exportSymbol) {
- var symbolName;
- if (typeof exportSymbol === 'string') {
- symbolName = exportSymbol;
- }
- else {
- symbolName = exportSymbol.as;
- }
- symbolName = unescapeIdentifier(symbolName);
- var symName = symbolName;
- if (typeof exportSymbol !== 'string') {
- symName = unescapeIdentifier(exportSymbol.name);
- }
- var resolvedModule = _this.resolveModule(moduleExport.from, filePath);
- if (resolvedModule) {
- var targetSymbol = _this.getStaticSymbol(resolvedModule, symName);
- var sourceSymbol = _this.getStaticSymbol(filePath, symbolName);
- resolvedSymbols.push(_this.createExport(sourceSymbol, targetSymbol));
- }
- });
- }
- else {
- // handle the symbols via export * directives.
- var resolvedModule = this_1.resolveModule(moduleExport.from, filePath);
- if (resolvedModule) {
- var nestedExports = this_1.getSymbolsOf(resolvedModule);
- nestedExports.forEach(function (targetSymbol) {
- var sourceSymbol = _this.getStaticSymbol(filePath, targetSymbol.name);
- resolvedSymbols.push(_this.createExport(sourceSymbol, targetSymbol));
- });
- }
- }
- };
- var this_1 = this;
- try {
- for (var _b = __values(metadata['exports']), _c = _b.next(); !_c.done; _c = _b.next()) {
- var moduleExport = _c.value;
- _loop_1(moduleExport);
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- // handle the actual metadata. Has to be after the exports
- // as there might be collisions in the names, and we want the symbols
- // of the current module to win ofter reexports.
- if (metadata['metadata']) {
- // handle direct declarations of the symbol
- var topLevelSymbolNames_1 = new Set(Object.keys(metadata['metadata']).map(unescapeIdentifier));
- var origins_1 = metadata['origins'] || {};
- Object.keys(metadata['metadata']).forEach(function (metadataKey) {
- var symbolMeta = metadata['metadata'][metadataKey];
- var name = unescapeIdentifier(metadataKey);
- var symbol = _this.getStaticSymbol(filePath, name);
- var origin = origins_1.hasOwnProperty(metadataKey) && origins_1[metadataKey];
- if (origin) {
- // If the symbol is from a bundled index, use the declaration location of the
- // symbol so relative references (such as './my.html') will be calculated
- // correctly.
- var originFilePath = _this.resolveModule(origin, filePath);
- if (!originFilePath) {
- _this.reportError(new Error("Couldn't resolve original symbol for " + origin + " from " + _this.host.getOutputName(filePath)));
- }
- else {
- _this.symbolResourcePaths.set(symbol, originFilePath);
- }
- }
- resolvedSymbols.push(_this.createResolvedSymbol(symbol, filePath, topLevelSymbolNames_1, symbolMeta));
- });
- }
- resolvedSymbols.forEach(function (resolvedSymbol) { return _this.resolvedSymbols.set(resolvedSymbol.symbol, resolvedSymbol); });
- this.symbolFromFile.set(filePath, resolvedSymbols.map(function (resolvedSymbol) { return resolvedSymbol.symbol; }));
- };
- StaticSymbolResolver.prototype.createResolvedSymbol = function (sourceSymbol, topLevelPath, topLevelSymbolNames, metadata) {
- var _this = this;
- // For classes that don't have Angular summaries / metadata,
- // we only keep their arity, but nothing else
- // (e.g. their constructor parameters).
- // We do this to prevent introducing deep imports
- // as we didn't generate .ngfactory.ts files with proper reexports.
- var isTsFile = TS.test(sourceSymbol.filePath);
- if (this.summaryResolver.isLibraryFile(sourceSymbol.filePath) && !isTsFile && metadata &&
- metadata['__symbolic'] === 'class') {
- var transformedMeta_1 = { __symbolic: 'class', arity: metadata.arity };
- return new ResolvedStaticSymbol(sourceSymbol, transformedMeta_1);
- }
- var _originalFileMemo;
- var getOriginalName = function () {
- if (!_originalFileMemo) {
- // Guess what the original file name is from the reference. If it has a `.d.ts` extension
- // replace it with `.ts`. If it already has `.ts` just leave it in place. If it doesn't have
- // .ts or .d.ts, append `.ts'. Also, if it is in `node_modules`, trim the `node_module`
- // location as it is not important to finding the file.
- _originalFileMemo =
- _this.host.getOutputName(topLevelPath.replace(/((\.ts)|(\.d\.ts)|)$/, '.ts')
- .replace(/^.*node_modules[/\\]/, ''));
- }
- return _originalFileMemo;
- };
- var self = this;
- var ReferenceTransformer = /** @class */ (function (_super) {
- __extends(ReferenceTransformer, _super);
- function ReferenceTransformer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- ReferenceTransformer.prototype.visitStringMap = function (map, functionParams) {
- var symbolic = map['__symbolic'];
- if (symbolic === 'function') {
- var oldLen = functionParams.length;
- functionParams.push.apply(functionParams, __spread((map['parameters'] || [])));
- var result = _super.prototype.visitStringMap.call(this, map, functionParams);
- functionParams.length = oldLen;
- return result;
- }
- else if (symbolic === 'reference') {
- var module = map['module'];
- var name_1 = map['name'] ? unescapeIdentifier(map['name']) : map['name'];
- if (!name_1) {
- return null;
- }
- var filePath = void 0;
- if (module) {
- filePath = self.resolveModule(module, sourceSymbol.filePath);
- if (!filePath) {
- return {
- __symbolic: 'error',
- message: "Could not resolve " + module + " relative to " + self.host.getMetadataFor(sourceSymbol.filePath) + ".",
- line: map['line'],
- character: map['character'],
- fileName: getOriginalName()
- };
- }
- return {
- __symbolic: 'resolved',
- symbol: self.getStaticSymbol(filePath, name_1),
- line: map['line'],
- character: map['character'],
- fileName: getOriginalName()
- };
- }
- else if (functionParams.indexOf(name_1) >= 0) {
- // reference to a function parameter
- return { __symbolic: 'reference', name: name_1 };
- }
- else {
- if (topLevelSymbolNames.has(name_1)) {
- return self.getStaticSymbol(topLevelPath, name_1);
- }
- }
- }
- else if (symbolic === 'error') {
- return __assign({}, map, { fileName: getOriginalName() });
- }
- else {
- return _super.prototype.visitStringMap.call(this, map, functionParams);
- }
- };
- return ReferenceTransformer;
- }(ValueTransformer));
- var transformedMeta = visitValue(metadata, new ReferenceTransformer(), []);
- var unwrappedTransformedMeta = unwrapResolvedMetadata(transformedMeta);
- if (unwrappedTransformedMeta instanceof StaticSymbol) {
- return this.createExport(sourceSymbol, unwrappedTransformedMeta);
- }
- return new ResolvedStaticSymbol(sourceSymbol, transformedMeta);
- };
- StaticSymbolResolver.prototype.createExport = function (sourceSymbol, targetSymbol) {
- sourceSymbol.assertNoMembers();
- targetSymbol.assertNoMembers();
- if (this.summaryResolver.isLibraryFile(sourceSymbol.filePath) &&
- this.summaryResolver.isLibraryFile(targetSymbol.filePath)) {
- // This case is for an ng library importing symbols from a plain ts library
- // transitively.
- // Note: We rely on the fact that we discover symbols in the direction
- // from source files to library files
- this.importAs.set(targetSymbol, this.getImportAs(sourceSymbol) || sourceSymbol);
- }
- return new ResolvedStaticSymbol(sourceSymbol, targetSymbol);
- };
- StaticSymbolResolver.prototype.reportError = function (error, context, path) {
- if (this.errorRecorder) {
- this.errorRecorder(error, (context && context.filePath) || path);
- }
- else {
- throw error;
- }
- };
- /**
- * @param module an absolute path to a module file.
- */
- StaticSymbolResolver.prototype.getModuleMetadata = function (module) {
- var moduleMetadata = this.metadataCache.get(module);
- if (!moduleMetadata) {
- var moduleMetadatas = this.host.getMetadataFor(module);
- if (moduleMetadatas) {
- var maxVersion_1 = -1;
- moduleMetadatas.forEach(function (md) {
- if (md && md['version'] > maxVersion_1) {
- maxVersion_1 = md['version'];
- moduleMetadata = md;
- }
- });
- }
- if (!moduleMetadata) {
- moduleMetadata =
- { __symbolic: 'module', version: SUPPORTED_SCHEMA_VERSION, module: module, metadata: {} };
- }
- if (moduleMetadata['version'] != SUPPORTED_SCHEMA_VERSION) {
- var errorMessage = moduleMetadata['version'] == 2 ?
- "Unsupported metadata version " + moduleMetadata['version'] + " for module " + module + ". This module should be compiled with a newer version of ngc" :
- "Metadata version mismatch for module " + this.host.getOutputName(module) + ", found version " + moduleMetadata['version'] + ", expected " + SUPPORTED_SCHEMA_VERSION;
- this.reportError(new Error(errorMessage));
- }
- this.metadataCache.set(module, moduleMetadata);
- }
- return moduleMetadata;
- };
- StaticSymbolResolver.prototype.getSymbolByModule = function (module, symbolName, containingFile) {
- var filePath = this.resolveModule(module, containingFile);
- if (!filePath) {
- this.reportError(new Error("Could not resolve module " + module + (containingFile ? ' relative to ' +
- this.host.getOutputName(containingFile) : '')));
- return this.getStaticSymbol("ERROR:" + module, symbolName);
- }
- return this.getStaticSymbol(filePath, symbolName);
- };
- StaticSymbolResolver.prototype.resolveModule = function (module, containingFile) {
- try {
- return this.host.moduleNameToFileName(module, containingFile);
- }
- catch (e) {
- console.error("Could not resolve module '" + module + "' relative to file " + containingFile);
- this.reportError(e, undefined, containingFile);
- }
- return null;
- };
- return StaticSymbolResolver;
- }());
- // Remove extra underscore from escaped identifier.
- // See https://github.com/Microsoft/TypeScript/blob/master/src/compiler/utilities.ts
- function unescapeIdentifier(identifier) {
- return identifier.startsWith('___') ? identifier.substr(1) : identifier;
- }
- function unwrapResolvedMetadata(metadata) {
- if (metadata && metadata.__symbolic === 'resolved') {
- return metadata.symbol;
- }
- return metadata;
- }
- function deserializeSummaries(symbolCache, summaryResolver, libraryFileName, json) {
- var deserializer = new FromJsonDeserializer(symbolCache, summaryResolver);
- return deserializer.deserialize(libraryFileName, json);
- }
- var ToJsonSerializer = /** @class */ (function (_super) {
- __extends(ToJsonSerializer, _super);
- function ToJsonSerializer(symbolResolver, summaryResolver, srcFileName) {
- var _this = _super.call(this) || this;
- _this.symbolResolver = symbolResolver;
- _this.summaryResolver = summaryResolver;
- _this.srcFileName = srcFileName;
- // Note: This only contains symbols without members.
- _this.symbols = [];
- _this.indexBySymbol = new Map();
- _this.reexportedBy = new Map();
- // This now contains a `__symbol: number` in the place of
- // StaticSymbols, but otherwise has the same shape as the original objects.
- _this.processedSummaryBySymbol = new Map();
- _this.processedSummaries = [];
- _this.unprocessedSymbolSummariesBySymbol = new Map();
- _this.moduleName = symbolResolver.getKnownModuleName(srcFileName);
- return _this;
- }
- ToJsonSerializer.prototype.addSummary = function (summary) {
- var _this = this;
- var unprocessedSummary = this.unprocessedSymbolSummariesBySymbol.get(summary.symbol);
- var processedSummary = this.processedSummaryBySymbol.get(summary.symbol);
- if (!unprocessedSummary) {
- unprocessedSummary = { symbol: summary.symbol, metadata: undefined };
- this.unprocessedSymbolSummariesBySymbol.set(summary.symbol, unprocessedSummary);
- processedSummary = { symbol: this.processValue(summary.symbol, 0 /* None */) };
- this.processedSummaries.push(processedSummary);
- this.processedSummaryBySymbol.set(summary.symbol, processedSummary);
- }
- if (!unprocessedSummary.metadata && summary.metadata) {
- var metadata_1 = summary.metadata || {};
- if (metadata_1.__symbolic === 'class') {
- // For classes, we keep everything except their class decorators.
- // We need to keep e.g. the ctor args, method names, method decorators
- // so that the class can be extended in another compilation unit.
- // We don't keep the class decorators as
- // 1) they refer to data
- // that should not cause a rebuild of downstream compilation units
- // (e.g. inline templates of @Component, or @NgModule.declarations)
- // 2) their data is already captured in TypeSummaries, e.g. DirectiveSummary.
- var clone_1 = {};
- Object.keys(metadata_1).forEach(function (propName) {
- if (propName !== 'decorators') {
- clone_1[propName] = metadata_1[propName];
- }
- });
- metadata_1 = clone_1;
- }
- else if (isCall(metadata_1)) {
- if (!isFunctionCall(metadata_1) && !isMethodCallOnVariable(metadata_1)) {
- // Don't store complex calls as we won't be able to simplify them anyways later on.
- metadata_1 = {
- __symbolic: 'error',
- message: 'Complex function calls are not supported.',
- };
- }
- }
- // Note: We need to keep storing ctor calls for e.g.
- // `export const x = new InjectionToken(...)`
- unprocessedSummary.metadata = metadata_1;
- processedSummary.metadata = this.processValue(metadata_1, 1 /* ResolveValue */);
- if (metadata_1 instanceof StaticSymbol &&
- this.summaryResolver.isLibraryFile(metadata_1.filePath)) {
- var declarationSymbol = this.symbols[this.indexBySymbol.get(metadata_1)];
- if (!isLoweredSymbol(declarationSymbol.name)) {
- // Note: symbols that were introduced during codegen in the user file can have a reexport
- // if a user used `export *`. However, we can't rely on this as tsickle will change
- // `export *` into named exports, using only the information from the typechecker.
- // As we introduce the new symbols after typecheck, Tsickle does not know about them,
- // and omits them when expanding `export *`.
- // So we have to keep reexporting these symbols manually via .ngfactory files.
- this.reexportedBy.set(declarationSymbol, summary.symbol);
- }
- }
- }
- if (!unprocessedSummary.type && summary.type) {
- unprocessedSummary.type = summary.type;
- // Note: We don't add the summaries of all referenced symbols as for the ResolvedSymbols,
- // as the type summaries already contain the transitive data that they require
- // (in a minimal way).
- processedSummary.type = this.processValue(summary.type, 0 /* None */);
- // except for reexported directives / pipes, so we need to store
- // their summaries explicitly.
- if (summary.type.summaryKind === CompileSummaryKind.NgModule) {
- var ngModuleSummary = summary.type;
- ngModuleSummary.exportedDirectives.concat(ngModuleSummary.exportedPipes).forEach(function (id) {
- var symbol = id.reference;
- if (_this.summaryResolver.isLibraryFile(symbol.filePath) &&
- !_this.unprocessedSymbolSummariesBySymbol.has(symbol)) {
- var summary_1 = _this.summaryResolver.resolveSummary(symbol);
- if (summary_1) {
- _this.addSummary(summary_1);
- }
- }
- });
- }
- }
- };
- /**
- * @param createExternalSymbolReexports Whether external static symbols should be re-exported.
- * This can be enabled if external symbols should be re-exported by the current module in
- * order to avoid dynamically generated module dependencies which can break strict dependency
- * enforcements (as in Google3). Read more here: https://github.com/angular/angular/issues/25644
- */
- ToJsonSerializer.prototype.serialize = function (createExternalSymbolReexports) {
- var _this = this;
- var exportAs = [];
- var json = JSON.stringify({
- moduleName: this.moduleName,
- summaries: this.processedSummaries,
- symbols: this.symbols.map(function (symbol, index) {
- symbol.assertNoMembers();
- var importAs = undefined;
- if (_this.summaryResolver.isLibraryFile(symbol.filePath)) {
- var reexportSymbol = _this.reexportedBy.get(symbol);
- if (reexportSymbol) {
- // In case the given external static symbol is already manually exported by the
- // user, we just proxy the external static symbol reference to the manual export.
- // This ensures that the AOT compiler imports the external symbol through the
- // user export and does not introduce another dependency which is not needed.
- importAs = _this.indexBySymbol.get(reexportSymbol);
- }
- else if (createExternalSymbolReexports) {
- // In this case, the given external static symbol is *not* manually exported by
- // the user, and we manually create a re-export in the factory file so that we
- // don't introduce another module dependency. This is useful when running within
- // Bazel so that the AOT compiler does not introduce any module dependencies
- // which can break the strict dependency enforcement. (e.g. as in Google3)
- // Read more about this here: https://github.com/angular/angular/issues/25644
- var summary = _this.unprocessedSymbolSummariesBySymbol.get(symbol);
- if (!summary || !summary.metadata || summary.metadata.__symbolic !== 'interface') {
- importAs = symbol.name + "_" + index;
- exportAs.push({ symbol: symbol, exportAs: importAs });
- }
- }
- }
- return {
- __symbol: index,
- name: symbol.name,
- filePath: _this.summaryResolver.toSummaryFileName(symbol.filePath, _this.srcFileName),
- importAs: importAs
- };
- })
- });
- return { json: json, exportAs: exportAs };
- };
- ToJsonSerializer.prototype.processValue = function (value, flags) {
- return visitValue(value, this, flags);
- };
- ToJsonSerializer.prototype.visitOther = function (value, context) {
- if (value instanceof StaticSymbol) {
- var baseSymbol = this.symbolResolver.getStaticSymbol(value.filePath, value.name);
- var index = this.visitStaticSymbol(baseSymbol, context);
- return { __symbol: index, members: value.members };
- }
- };
- /**
- * Strip line and character numbers from ngsummaries.
- * Emitting them causes white spaces changes to retrigger upstream
- * recompilations in bazel.
- * TODO: find out a way to have line and character numbers in errors without
- * excessive recompilation in bazel.
- */
- ToJsonSerializer.prototype.visitStringMap = function (map, context) {
- if (map['__symbolic'] === 'resolved') {
- return visitValue(map['symbol'], this, context);
- }
- if (map['__symbolic'] === 'error') {
- delete map['line'];
- delete map['character'];
- }
- return _super.prototype.visitStringMap.call(this, map, context);
- };
- /**
- * Returns null if the options.resolveValue is true, and the summary for the symbol
- * resolved to a type or could not be resolved.
- */
- ToJsonSerializer.prototype.visitStaticSymbol = function (baseSymbol, flags) {
- var index = this.indexBySymbol.get(baseSymbol);
- var summary = null;
- if (flags & 1 /* ResolveValue */ &&
- this.summaryResolver.isLibraryFile(baseSymbol.filePath)) {
- if (this.unprocessedSymbolSummariesBySymbol.has(baseSymbol)) {
- // the summary for this symbol was already added
- // -> nothing to do.
- return index;
- }
- summary = this.loadSummary(baseSymbol);
- if (summary && summary.metadata instanceof StaticSymbol) {
- // The summary is a reexport
- index = this.visitStaticSymbol(summary.metadata, flags);
- // reset the summary as it is just a reexport, so we don't want to store it.
- summary = null;
- }
- }
- else if (index != null) {
- // Note: == on purpose to compare with undefined!
- // No summary and the symbol is already added -> nothing to do.
- return index;
- }
- // Note: == on purpose to compare with undefined!
- if (index == null) {
- index = this.symbols.length;
- this.symbols.push(baseSymbol);
- }
- this.indexBySymbol.set(baseSymbol, index);
- if (summary) {
- this.addSummary(summary);
- }
- return index;
- };
- ToJsonSerializer.prototype.loadSummary = function (symbol) {
- var summary = this.summaryResolver.resolveSummary(symbol);
- if (!summary) {
- // some symbols might originate from a plain typescript library
- // that just exported .d.ts and .metadata.json files, i.e. where no summary
- // files were created.
- var resolvedSymbol = this.symbolResolver.resolveSymbol(symbol);
- if (resolvedSymbol) {
- summary = { symbol: resolvedSymbol.symbol, metadata: resolvedSymbol.metadata };
- }
- }
- return summary;
- };
- return ToJsonSerializer;
- }(ValueTransformer));
- var FromJsonDeserializer = /** @class */ (function (_super) {
- __extends(FromJsonDeserializer, _super);
- function FromJsonDeserializer(symbolCache, summaryResolver) {
- var _this = _super.call(this) || this;
- _this.symbolCache = symbolCache;
- _this.summaryResolver = summaryResolver;
- return _this;
- }
- FromJsonDeserializer.prototype.deserialize = function (libraryFileName, json) {
- var _this = this;
- var data = JSON.parse(json);
- var allImportAs = [];
- this.symbols = data.symbols.map(function (serializedSymbol) { return _this.symbolCache.get(_this.summaryResolver.fromSummaryFileName(serializedSymbol.filePath, libraryFileName), serializedSymbol.name); });
- data.symbols.forEach(function (serializedSymbol, index) {
- var symbol = _this.symbols[index];
- var importAs = serializedSymbol.importAs;
- if (typeof importAs === 'number') {
- allImportAs.push({ symbol: symbol, importAs: _this.symbols[importAs] });
- }
- else if (typeof importAs === 'string') {
- allImportAs.push({ symbol: symbol, importAs: _this.symbolCache.get(ngfactoryFilePath(libraryFileName), importAs) });
- }
- });
- var summaries = visitValue(data.summaries, this, null);
- return { moduleName: data.moduleName, summaries: summaries, importAs: allImportAs };
- };
- FromJsonDeserializer.prototype.visitStringMap = function (map, context) {
- if ('__symbol' in map) {
- var baseSymbol = this.symbols[map['__symbol']];
- var members = map['members'];
- return members.length ? this.symbolCache.get(baseSymbol.filePath, baseSymbol.name, members) :
- baseSymbol;
- }
- else {
- return _super.prototype.visitStringMap.call(this, map, context);
- }
- };
- return FromJsonDeserializer;
- }(ValueTransformer));
- function isCall(metadata) {
- return metadata && metadata.__symbolic === 'call';
- }
- function isFunctionCall(metadata) {
- return isCall(metadata) && unwrapResolvedMetadata(metadata.expression) instanceof StaticSymbol;
- }
- function isMethodCallOnVariable(metadata) {
- return isCall(metadata) && metadata.expression && metadata.expression.__symbolic === 'select' &&
- unwrapResolvedMetadata(metadata.expression.expression) instanceof StaticSymbol;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function analyzeNgModules(fileNames, host, staticSymbolResolver, metadataResolver) {
- var files = _analyzeFilesIncludingNonProgramFiles(fileNames, host, staticSymbolResolver, metadataResolver);
- return mergeAnalyzedFiles(files);
- }
- // Analyzes all of the program files,
- // including files that are not part of the program
- // but are referenced by an NgModule.
- function _analyzeFilesIncludingNonProgramFiles(fileNames, host, staticSymbolResolver, metadataResolver) {
- var seenFiles = new Set();
- var files = [];
- var visitFile = function (fileName) {
- if (seenFiles.has(fileName) || !host.isSourceFile(fileName)) {
- return false;
- }
- seenFiles.add(fileName);
- var analyzedFile = analyzeFile(host, staticSymbolResolver, metadataResolver, fileName);
- files.push(analyzedFile);
- analyzedFile.ngModules.forEach(function (ngModule) {
- ngModule.transitiveModule.modules.forEach(function (modMeta) { return visitFile(modMeta.reference.filePath); });
- });
- };
- fileNames.forEach(function (fileName) { return visitFile(fileName); });
- return files;
- }
- function analyzeFile(host, staticSymbolResolver, metadataResolver, fileName) {
- var directives = [];
- var pipes = [];
- var injectables = [];
- var ngModules = [];
- var hasDecorators = staticSymbolResolver.hasDecorators(fileName);
- var exportsNonSourceFiles = false;
- // Don't analyze .d.ts files that have no decorators as a shortcut
- // to speed up the analysis. This prevents us from
- // resolving the references in these files.
- // Note: exportsNonSourceFiles is only needed when compiling with summaries,
- // which is not the case when .d.ts files are treated as input files.
- if (!fileName.endsWith('.d.ts') || hasDecorators) {
- staticSymbolResolver.getSymbolsOf(fileName).forEach(function (symbol) {
- var resolvedSymbol = staticSymbolResolver.resolveSymbol(symbol);
- var symbolMeta = resolvedSymbol.metadata;
- if (!symbolMeta || symbolMeta.__symbolic === 'error') {
- return;
- }
- var isNgSymbol = false;
- if (symbolMeta.__symbolic === 'class') {
- if (metadataResolver.isDirective(symbol)) {
- isNgSymbol = true;
- directives.push(symbol);
- }
- else if (metadataResolver.isPipe(symbol)) {
- isNgSymbol = true;
- pipes.push(symbol);
- }
- else if (metadataResolver.isNgModule(symbol)) {
- var ngModule = metadataResolver.getNgModuleMetadata(symbol, false);
- if (ngModule) {
- isNgSymbol = true;
- ngModules.push(ngModule);
- }
- }
- else if (metadataResolver.isInjectable(symbol)) {
- isNgSymbol = true;
- var injectable = metadataResolver.getInjectableMetadata(symbol, null, false);
- if (injectable) {
- injectables.push(injectable);
- }
- }
- }
- if (!isNgSymbol) {
- exportsNonSourceFiles =
- exportsNonSourceFiles || isValueExportingNonSourceFile(host, symbolMeta);
- }
- });
- }
- return {
- fileName: fileName, directives: directives, pipes: pipes, ngModules: ngModules, injectables: injectables, exportsNonSourceFiles: exportsNonSourceFiles,
- };
- }
- function isValueExportingNonSourceFile(host, metadata) {
- var exportsNonSourceFiles = false;
- var Visitor = /** @class */ (function () {
- function Visitor() {
- }
- Visitor.prototype.visitArray = function (arr, context) {
- var _this = this;
- arr.forEach(function (v) { return visitValue(v, _this, context); });
- };
- Visitor.prototype.visitStringMap = function (map, context) {
- var _this = this;
- Object.keys(map).forEach(function (key) { return visitValue(map[key], _this, context); });
- };
- Visitor.prototype.visitPrimitive = function (value, context) { };
- Visitor.prototype.visitOther = function (value, context) {
- if (value instanceof StaticSymbol && !host.isSourceFile(value.filePath)) {
- exportsNonSourceFiles = true;
- }
- };
- return Visitor;
- }());
- visitValue(metadata, new Visitor(), null);
- return exportsNonSourceFiles;
- }
- function mergeAnalyzedFiles(analyzedFiles) {
- var allNgModules = [];
- var ngModuleByPipeOrDirective = new Map();
- var allPipesAndDirectives = new Set();
- analyzedFiles.forEach(function (af) {
- af.ngModules.forEach(function (ngModule) {
- allNgModules.push(ngModule);
- ngModule.declaredDirectives.forEach(function (d) { return ngModuleByPipeOrDirective.set(d.reference, ngModule); });
- ngModule.declaredPipes.forEach(function (p) { return ngModuleByPipeOrDirective.set(p.reference, ngModule); });
- });
- af.directives.forEach(function (d) { return allPipesAndDirectives.add(d); });
- af.pipes.forEach(function (p) { return allPipesAndDirectives.add(p); });
- });
- var symbolsMissingModule = [];
- allPipesAndDirectives.forEach(function (ref) {
- if (!ngModuleByPipeOrDirective.has(ref)) {
- symbolsMissingModule.push(ref);
- }
- });
- return {
- ngModules: allNgModules,
- ngModuleByPipeOrDirective: ngModuleByPipeOrDirective,
- symbolsMissingModule: symbolsMissingModule,
- files: analyzedFiles
- };
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var FORMATTED_MESSAGE = 'ngFormattedMessage';
- function indentStr(level) {
- if (level <= 0)
- return '';
- if (level < 6)
- return ['', ' ', ' ', ' ', ' ', ' '][level];
- var half = indentStr(Math.floor(level / 2));
- return half + half + (level % 2 === 1 ? ' ' : '');
- }
- function formatChain(chain, indent) {
- if (indent === void 0) { indent = 0; }
- if (!chain)
- return '';
- var position = chain.position ?
- chain.position.fileName + "(" + (chain.position.line + 1) + "," + (chain.position.column + 1) + ")" :
- '';
- var prefix = position && indent === 0 ? position + ": " : '';
- var postfix = position && indent !== 0 ? " at " + position : '';
- var message = "" + prefix + chain.message + postfix;
- return "" + indentStr(indent) + message + ((chain.next && ('\n' + formatChain(chain.next, indent + 2))) || '');
- }
- function formattedError(chain) {
- var message = formatChain(chain) + '.';
- var error = syntaxError(message);
- error[FORMATTED_MESSAGE] = true;
- error.chain = chain;
- error.position = chain.position;
- return error;
- }
- function isFormattedError(error) {
- return !!error[FORMATTED_MESSAGE];
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ANGULAR_CORE = '@angular/core';
- var ANGULAR_ROUTER = '@angular/router';
- var HIDDEN_KEY = /^\$.*\$$/;
- var IGNORE = {
- __symbolic: 'ignore'
- };
- var USE_VALUE$1 = 'useValue';
- var PROVIDE = 'provide';
- var REFERENCE_SET = new Set([USE_VALUE$1, 'useFactory', 'data', 'id', 'loadChildren']);
- var TYPEGUARD_POSTFIX = 'TypeGuard';
- var USE_IF = 'UseIf';
- function shouldIgnore(value) {
- return value && value.__symbolic == 'ignore';
- }
- /**
- * A static reflector implements enough of the Reflector API that is necessary to compile
- * templates statically.
- */
- var StaticReflector = /** @class */ (function () {
- function StaticReflector(summaryResolver, symbolResolver, knownMetadataClasses, knownMetadataFunctions, errorRecorder) {
- var _this = this;
- if (knownMetadataClasses === void 0) { knownMetadataClasses = []; }
- if (knownMetadataFunctions === void 0) { knownMetadataFunctions = []; }
- this.summaryResolver = summaryResolver;
- this.symbolResolver = symbolResolver;
- this.errorRecorder = errorRecorder;
- this.annotationCache = new Map();
- this.shallowAnnotationCache = new Map();
- this.propertyCache = new Map();
- this.parameterCache = new Map();
- this.methodCache = new Map();
- this.staticCache = new Map();
- this.conversionMap = new Map();
- this.resolvedExternalReferences = new Map();
- this.annotationForParentClassWithSummaryKind = new Map();
- this.initializeConversionMap();
- knownMetadataClasses.forEach(function (kc) { return _this._registerDecoratorOrConstructor(_this.getStaticSymbol(kc.filePath, kc.name), kc.ctor); });
- knownMetadataFunctions.forEach(function (kf) { return _this._registerFunction(_this.getStaticSymbol(kf.filePath, kf.name), kf.fn); });
- this.annotationForParentClassWithSummaryKind.set(CompileSummaryKind.Directive, [createDirective, createComponent]);
- this.annotationForParentClassWithSummaryKind.set(CompileSummaryKind.Pipe, [createPipe]);
- this.annotationForParentClassWithSummaryKind.set(CompileSummaryKind.NgModule, [createNgModule]);
- this.annotationForParentClassWithSummaryKind.set(CompileSummaryKind.Injectable, [createInjectable, createPipe, createDirective, createComponent, createNgModule]);
- }
- StaticReflector.prototype.componentModuleUrl = function (typeOrFunc) {
- var staticSymbol = this.findSymbolDeclaration(typeOrFunc);
- return this.symbolResolver.getResourcePath(staticSymbol);
- };
- StaticReflector.prototype.resolveExternalReference = function (ref, containingFile) {
- var key = undefined;
- if (!containingFile) {
- key = ref.moduleName + ":" + ref.name;
- var declarationSymbol_1 = this.resolvedExternalReferences.get(key);
- if (declarationSymbol_1)
- return declarationSymbol_1;
- }
- var refSymbol = this.symbolResolver.getSymbolByModule(ref.moduleName, ref.name, containingFile);
- var declarationSymbol = this.findSymbolDeclaration(refSymbol);
- if (!containingFile) {
- this.symbolResolver.recordModuleNameForFileName(refSymbol.filePath, ref.moduleName);
- this.symbolResolver.recordImportAs(declarationSymbol, refSymbol);
- }
- if (key) {
- this.resolvedExternalReferences.set(key, declarationSymbol);
- }
- return declarationSymbol;
- };
- StaticReflector.prototype.findDeclaration = function (moduleUrl, name, containingFile) {
- return this.findSymbolDeclaration(this.symbolResolver.getSymbolByModule(moduleUrl, name, containingFile));
- };
- StaticReflector.prototype.tryFindDeclaration = function (moduleUrl, name, containingFile) {
- var _this = this;
- return this.symbolResolver.ignoreErrorsFor(function () { return _this.findDeclaration(moduleUrl, name, containingFile); });
- };
- StaticReflector.prototype.findSymbolDeclaration = function (symbol) {
- var resolvedSymbol = this.symbolResolver.resolveSymbol(symbol);
- if (resolvedSymbol) {
- var resolvedMetadata = resolvedSymbol.metadata;
- if (resolvedMetadata && resolvedMetadata.__symbolic === 'resolved') {
- resolvedMetadata = resolvedMetadata.symbol;
- }
- if (resolvedMetadata instanceof StaticSymbol) {
- return this.findSymbolDeclaration(resolvedSymbol.metadata);
- }
- }
- return symbol;
- };
- StaticReflector.prototype.tryAnnotations = function (type) {
- var originalRecorder = this.errorRecorder;
- this.errorRecorder = function (error, fileName) { };
- try {
- return this.annotations(type);
- }
- finally {
- this.errorRecorder = originalRecorder;
- }
- };
- StaticReflector.prototype.annotations = function (type) {
- var _this = this;
- return this._annotations(type, function (type, decorators) { return _this.simplify(type, decorators); }, this.annotationCache);
- };
- StaticReflector.prototype.shallowAnnotations = function (type) {
- var _this = this;
- return this._annotations(type, function (type, decorators) { return _this.simplify(type, decorators, true); }, this.shallowAnnotationCache);
- };
- StaticReflector.prototype._annotations = function (type, simplify, annotationCache) {
- var annotations = annotationCache.get(type);
- if (!annotations) {
- annotations = [];
- var classMetadata = this.getTypeMetadata(type);
- var parentType = this.findParentType(type, classMetadata);
- if (parentType) {
- var parentAnnotations = this.annotations(parentType);
- annotations.push.apply(annotations, __spread(parentAnnotations));
- }
- var ownAnnotations_1 = [];
- if (classMetadata['decorators']) {
- ownAnnotations_1 = simplify(type, classMetadata['decorators']);
- if (ownAnnotations_1) {
- annotations.push.apply(annotations, __spread(ownAnnotations_1));
- }
- }
- if (parentType && !this.summaryResolver.isLibraryFile(type.filePath) &&
- this.summaryResolver.isLibraryFile(parentType.filePath)) {
- var summary = this.summaryResolver.resolveSummary(parentType);
- if (summary && summary.type) {
- var requiredAnnotationTypes = this.annotationForParentClassWithSummaryKind.get(summary.type.summaryKind);
- var typeHasRequiredAnnotation = requiredAnnotationTypes.some(function (requiredType) { return ownAnnotations_1.some(function (ann) { return requiredType.isTypeOf(ann); }); });
- if (!typeHasRequiredAnnotation) {
- this.reportError(formatMetadataError(metadataError("Class " + type.name + " in " + type.filePath + " extends from a " + CompileSummaryKind[summary.type.summaryKind] + " in another compilation unit without duplicating the decorator",
- /* summary */ undefined, "Please add a " + requiredAnnotationTypes.map(function (type) { return type.ngMetadataName; }).join(' or ') + " decorator to the class"), type), type);
- }
- }
- }
- annotationCache.set(type, annotations.filter(function (ann) { return !!ann; }));
- }
- return annotations;
- };
- StaticReflector.prototype.propMetadata = function (type) {
- var _this = this;
- var propMetadata = this.propertyCache.get(type);
- if (!propMetadata) {
- var classMetadata = this.getTypeMetadata(type);
- propMetadata = {};
- var parentType = this.findParentType(type, classMetadata);
- if (parentType) {
- var parentPropMetadata_1 = this.propMetadata(parentType);
- Object.keys(parentPropMetadata_1).forEach(function (parentProp) {
- propMetadata[parentProp] = parentPropMetadata_1[parentProp];
- });
- }
- var members_1 = classMetadata['members'] || {};
- Object.keys(members_1).forEach(function (propName) {
- var propData = members_1[propName];
- var prop = propData
- .find(function (a) { return a['__symbolic'] == 'property' || a['__symbolic'] == 'method'; });
- var decorators = [];
- if (propMetadata[propName]) {
- decorators.push.apply(decorators, __spread(propMetadata[propName]));
- }
- propMetadata[propName] = decorators;
- if (prop && prop['decorators']) {
- decorators.push.apply(decorators, __spread(_this.simplify(type, prop['decorators'])));
- }
- });
- this.propertyCache.set(type, propMetadata);
- }
- return propMetadata;
- };
- StaticReflector.prototype.parameters = function (type) {
- var _this = this;
- if (!(type instanceof StaticSymbol)) {
- this.reportError(new Error("parameters received " + JSON.stringify(type) + " which is not a StaticSymbol"), type);
- return [];
- }
- try {
- var parameters_1 = this.parameterCache.get(type);
- if (!parameters_1) {
- var classMetadata = this.getTypeMetadata(type);
- var parentType = this.findParentType(type, classMetadata);
- var members = classMetadata ? classMetadata['members'] : null;
- var ctorData = members ? members['__ctor__'] : null;
- if (ctorData) {
- var ctor = ctorData.find(function (a) { return a['__symbolic'] == 'constructor'; });
- var rawParameterTypes = ctor['parameters'] || [];
- var parameterDecorators_1 = this.simplify(type, ctor['parameterDecorators'] || []);
- parameters_1 = [];
- rawParameterTypes.forEach(function (rawParamType, index) {
- var nestedResult = [];
- var paramType = _this.trySimplify(type, rawParamType);
- if (paramType)
- nestedResult.push(paramType);
- var decorators = parameterDecorators_1 ? parameterDecorators_1[index] : null;
- if (decorators) {
- nestedResult.push.apply(nestedResult, __spread(decorators));
- }
- parameters_1.push(nestedResult);
- });
- }
- else if (parentType) {
- parameters_1 = this.parameters(parentType);
- }
- if (!parameters_1) {
- parameters_1 = [];
- }
- this.parameterCache.set(type, parameters_1);
- }
- return parameters_1;
- }
- catch (e) {
- console.error("Failed on type " + JSON.stringify(type) + " with error " + e);
- throw e;
- }
- };
- StaticReflector.prototype._methodNames = function (type) {
- var methodNames = this.methodCache.get(type);
- if (!methodNames) {
- var classMetadata = this.getTypeMetadata(type);
- methodNames = {};
- var parentType = this.findParentType(type, classMetadata);
- if (parentType) {
- var parentMethodNames_1 = this._methodNames(parentType);
- Object.keys(parentMethodNames_1).forEach(function (parentProp) {
- methodNames[parentProp] = parentMethodNames_1[parentProp];
- });
- }
- var members_2 = classMetadata['members'] || {};
- Object.keys(members_2).forEach(function (propName) {
- var propData = members_2[propName];
- var isMethod = propData.some(function (a) { return a['__symbolic'] == 'method'; });
- methodNames[propName] = methodNames[propName] || isMethod;
- });
- this.methodCache.set(type, methodNames);
- }
- return methodNames;
- };
- StaticReflector.prototype._staticMembers = function (type) {
- var staticMembers = this.staticCache.get(type);
- if (!staticMembers) {
- var classMetadata = this.getTypeMetadata(type);
- var staticMemberData = classMetadata['statics'] || {};
- staticMembers = Object.keys(staticMemberData);
- this.staticCache.set(type, staticMembers);
- }
- return staticMembers;
- };
- StaticReflector.prototype.findParentType = function (type, classMetadata) {
- var parentType = this.trySimplify(type, classMetadata['extends']);
- if (parentType instanceof StaticSymbol) {
- return parentType;
- }
- };
- StaticReflector.prototype.hasLifecycleHook = function (type, lcProperty) {
- if (!(type instanceof StaticSymbol)) {
- this.reportError(new Error("hasLifecycleHook received " + JSON.stringify(type) + " which is not a StaticSymbol"), type);
- }
- try {
- return !!this._methodNames(type)[lcProperty];
- }
- catch (e) {
- console.error("Failed on type " + JSON.stringify(type) + " with error " + e);
- throw e;
- }
- };
- StaticReflector.prototype.guards = function (type) {
- var e_1, _a;
- if (!(type instanceof StaticSymbol)) {
- this.reportError(new Error("guards received " + JSON.stringify(type) + " which is not a StaticSymbol"), type);
- return {};
- }
- var staticMembers = this._staticMembers(type);
- var result = {};
- try {
- for (var staticMembers_1 = __values(staticMembers), staticMembers_1_1 = staticMembers_1.next(); !staticMembers_1_1.done; staticMembers_1_1 = staticMembers_1.next()) {
- var name_1 = staticMembers_1_1.value;
- if (name_1.endsWith(TYPEGUARD_POSTFIX)) {
- var property = name_1.substr(0, name_1.length - TYPEGUARD_POSTFIX.length);
- var value = void 0;
- if (property.endsWith(USE_IF)) {
- property = name_1.substr(0, property.length - USE_IF.length);
- value = USE_IF;
- }
- else {
- value = this.getStaticSymbol(type.filePath, type.name, [name_1]);
- }
- result[property] = value;
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (staticMembers_1_1 && !staticMembers_1_1.done && (_a = staticMembers_1.return)) _a.call(staticMembers_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return result;
- };
- StaticReflector.prototype._registerDecoratorOrConstructor = function (type, ctor) {
- this.conversionMap.set(type, function (context, args) { return new (ctor.bind.apply(ctor, __spread([void 0], args)))(); });
- };
- StaticReflector.prototype._registerFunction = function (type, fn) {
- this.conversionMap.set(type, function (context, args) { return fn.apply(undefined, args); });
- };
- StaticReflector.prototype.initializeConversionMap = function () {
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Injectable'), createInjectable);
- this.injectionToken = this.findDeclaration(ANGULAR_CORE, 'InjectionToken');
- this.opaqueToken = this.findDeclaration(ANGULAR_CORE, 'OpaqueToken');
- this.ROUTES = this.tryFindDeclaration(ANGULAR_ROUTER, 'ROUTES');
- this.ANALYZE_FOR_ENTRY_COMPONENTS =
- this.findDeclaration(ANGULAR_CORE, 'ANALYZE_FOR_ENTRY_COMPONENTS');
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Host'), createHost);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Self'), createSelf);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'SkipSelf'), createSkipSelf);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Inject'), createInject);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Optional'), createOptional);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Attribute'), createAttribute);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'ContentChild'), createContentChild);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'ContentChildren'), createContentChildren);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'ViewChild'), createViewChild);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'ViewChildren'), createViewChildren);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Input'), createInput);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Output'), createOutput);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Pipe'), createPipe);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'HostBinding'), createHostBinding);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'HostListener'), createHostListener);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Directive'), createDirective);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Component'), createComponent);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'NgModule'), createNgModule);
- // Note: Some metadata classes can be used directly with Provider.deps.
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Host'), createHost);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Self'), createSelf);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'SkipSelf'), createSkipSelf);
- this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE, 'Optional'), createOptional);
- };
- /**
- * getStaticSymbol produces a Type whose metadata is known but whose implementation is not loaded.
- * All types passed to the StaticResolver should be pseudo-types returned by this method.
- *
- * @param declarationFile the absolute path of the file where the symbol is declared
- * @param name the name of the type.
- */
- StaticReflector.prototype.getStaticSymbol = function (declarationFile, name, members) {
- return this.symbolResolver.getStaticSymbol(declarationFile, name, members);
- };
- /**
- * Simplify but discard any errors
- */
- StaticReflector.prototype.trySimplify = function (context, value) {
- var originalRecorder = this.errorRecorder;
- this.errorRecorder = function (error, fileName) { };
- var result = this.simplify(context, value);
- this.errorRecorder = originalRecorder;
- return result;
- };
- /** @internal */
- StaticReflector.prototype.simplify = function (context, value, lazy) {
- if (lazy === void 0) { lazy = false; }
- var self = this;
- var scope = BindingScope$1.empty;
- var calling = new Map();
- function simplifyInContext(context, value, depth, references) {
- function resolveReferenceValue(staticSymbol) {
- var resolvedSymbol = self.symbolResolver.resolveSymbol(staticSymbol);
- return resolvedSymbol ? resolvedSymbol.metadata : null;
- }
- function simplifyEagerly(value) {
- return simplifyInContext(context, value, depth, 0);
- }
- function simplifyLazily(value) {
- return simplifyInContext(context, value, depth, references + 1);
- }
- function simplifyNested(nestedContext, value) {
- if (nestedContext === context) {
- // If the context hasn't changed let the exception propagate unmodified.
- return simplifyInContext(nestedContext, value, depth + 1, references);
- }
- try {
- return simplifyInContext(nestedContext, value, depth + 1, references);
- }
- catch (e) {
- if (isMetadataError(e)) {
- // Propagate the message text up but add a message to the chain that explains how we got
- // here.
- // e.chain implies e.symbol
- var summaryMsg = e.chain ? 'references \'' + e.symbol.name + '\'' : errorSummary(e);
- var summary = "'" + nestedContext.name + "' " + summaryMsg;
- var chain = { message: summary, position: e.position, next: e.chain };
- // TODO(chuckj): retrieve the position information indirectly from the collectors node
- // map if the metadata is from a .ts file.
- self.error({
- message: e.message,
- advise: e.advise,
- context: e.context, chain: chain,
- symbol: nestedContext
- }, context);
- }
- else {
- // It is probably an internal error.
- throw e;
- }
- }
- }
- function simplifyCall(functionSymbol, targetFunction, args, targetExpression) {
- if (targetFunction && targetFunction['__symbolic'] == 'function') {
- if (calling.get(functionSymbol)) {
- self.error({
- message: 'Recursion is not supported',
- summary: "called '" + functionSymbol.name + "' recursively",
- value: targetFunction
- }, functionSymbol);
- }
- try {
- var value_1 = targetFunction['value'];
- if (value_1 && (depth != 0 || value_1.__symbolic != 'error')) {
- var parameters = targetFunction['parameters'];
- var defaults = targetFunction.defaults;
- args = args.map(function (arg) { return simplifyNested(context, arg); })
- .map(function (arg) { return shouldIgnore(arg) ? undefined : arg; });
- if (defaults && defaults.length > args.length) {
- args.push.apply(args, __spread(defaults.slice(args.length).map(function (value) { return simplify(value); })));
- }
- calling.set(functionSymbol, true);
- var functionScope = BindingScope$1.build();
- for (var i = 0; i < parameters.length; i++) {
- functionScope.define(parameters[i], args[i]);
- }
- var oldScope = scope;
- var result_1;
- try {
- scope = functionScope.done();
- result_1 = simplifyNested(functionSymbol, value_1);
- }
- finally {
- scope = oldScope;
- }
- return result_1;
- }
- }
- finally {
- calling.delete(functionSymbol);
- }
- }
- if (depth === 0) {
- // If depth is 0 we are evaluating the top level expression that is describing element
- // decorator. In this case, it is a decorator we don't understand, such as a custom
- // non-angular decorator, and we should just ignore it.
- return IGNORE;
- }
- var position = undefined;
- if (targetExpression && targetExpression.__symbolic == 'resolved') {
- var line = targetExpression.line;
- var character = targetExpression.character;
- var fileName = targetExpression.fileName;
- if (fileName != null && line != null && character != null) {
- position = { fileName: fileName, line: line, column: character };
- }
- }
- self.error({
- message: FUNCTION_CALL_NOT_SUPPORTED,
- context: functionSymbol,
- value: targetFunction, position: position
- }, context);
- }
- function simplify(expression) {
- var e_2, _a, e_3, _b;
- if (isPrimitive(expression)) {
- return expression;
- }
- if (expression instanceof Array) {
- var result_2 = [];
- try {
- for (var _c = __values(expression), _d = _c.next(); !_d.done; _d = _c.next()) {
- var item = _d.value;
- // Check for a spread expression
- if (item && item.__symbolic === 'spread') {
- // We call with references as 0 because we require the actual value and cannot
- // tolerate a reference here.
- var spreadArray = simplifyEagerly(item.expression);
- if (Array.isArray(spreadArray)) {
- try {
- for (var spreadArray_1 = __values(spreadArray), spreadArray_1_1 = spreadArray_1.next(); !spreadArray_1_1.done; spreadArray_1_1 = spreadArray_1.next()) {
- var spreadItem = spreadArray_1_1.value;
- result_2.push(spreadItem);
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (spreadArray_1_1 && !spreadArray_1_1.done && (_b = spreadArray_1.return)) _b.call(spreadArray_1);
- }
- finally { if (e_3) throw e_3.error; }
- }
- continue;
- }
- }
- var value_2 = simplify(item);
- if (shouldIgnore(value_2)) {
- continue;
- }
- result_2.push(value_2);
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_2) throw e_2.error; }
- }
- return result_2;
- }
- if (expression instanceof StaticSymbol) {
- // Stop simplification at builtin symbols or if we are in a reference context and
- // the symbol doesn't have members.
- if (expression === self.injectionToken || self.conversionMap.has(expression) ||
- (references > 0 && !expression.members.length)) {
- return expression;
- }
- else {
- var staticSymbol = expression;
- var declarationValue = resolveReferenceValue(staticSymbol);
- if (declarationValue != null) {
- return simplifyNested(staticSymbol, declarationValue);
- }
- else {
- return staticSymbol;
- }
- }
- }
- if (expression) {
- if (expression['__symbolic']) {
- var staticSymbol = void 0;
- switch (expression['__symbolic']) {
- case 'binop':
- var left = simplify(expression['left']);
- if (shouldIgnore(left))
- return left;
- var right = simplify(expression['right']);
- if (shouldIgnore(right))
- return right;
- switch (expression['operator']) {
- case '&&':
- return left && right;
- case '||':
- return left || right;
- case '|':
- return left | right;
- case '^':
- return left ^ right;
- case '&':
- return left & right;
- case '==':
- return left == right;
- case '!=':
- return left != right;
- case '===':
- return left === right;
- case '!==':
- return left !== right;
- case '<':
- return left < right;
- case '>':
- return left > right;
- case '<=':
- return left <= right;
- case '>=':
- return left >= right;
- case '<<':
- return left << right;
- case '>>':
- return left >> right;
- case '+':
- return left + right;
- case '-':
- return left - right;
- case '*':
- return left * right;
- case '/':
- return left / right;
- case '%':
- return left % right;
- }
- return null;
- case 'if':
- var condition = simplify(expression['condition']);
- return condition ? simplify(expression['thenExpression']) :
- simplify(expression['elseExpression']);
- case 'pre':
- var operand = simplify(expression['operand']);
- if (shouldIgnore(operand))
- return operand;
- switch (expression['operator']) {
- case '+':
- return operand;
- case '-':
- return -operand;
- case '!':
- return !operand;
- case '~':
- return ~operand;
- }
- return null;
- case 'index':
- var indexTarget = simplifyEagerly(expression['expression']);
- var index = simplifyEagerly(expression['index']);
- if (indexTarget && isPrimitive(index))
- return indexTarget[index];
- return null;
- case 'select':
- var member = expression['member'];
- var selectContext = context;
- var selectTarget = simplify(expression['expression']);
- if (selectTarget instanceof StaticSymbol) {
- var members = selectTarget.members.concat(member);
- selectContext =
- self.getStaticSymbol(selectTarget.filePath, selectTarget.name, members);
- var declarationValue = resolveReferenceValue(selectContext);
- if (declarationValue != null) {
- return simplifyNested(selectContext, declarationValue);
- }
- else {
- return selectContext;
- }
- }
- if (selectTarget && isPrimitive(member))
- return simplifyNested(selectContext, selectTarget[member]);
- return null;
- case 'reference':
- // Note: This only has to deal with variable references, as symbol references have
- // been converted into 'resolved'
- // in the StaticSymbolResolver.
- var name_2 = expression['name'];
- var localValue = scope.resolve(name_2);
- if (localValue != BindingScope$1.missing) {
- return localValue;
- }
- break;
- case 'resolved':
- try {
- return simplify(expression.symbol);
- }
- catch (e) {
- // If an error is reported evaluating the symbol record the position of the
- // reference in the error so it can
- // be reported in the error message generated from the exception.
- if (isMetadataError(e) && expression.fileName != null &&
- expression.line != null && expression.character != null) {
- e.position = {
- fileName: expression.fileName,
- line: expression.line,
- column: expression.character
- };
- }
- throw e;
- }
- case 'class':
- return context;
- case 'function':
- return context;
- case 'new':
- case 'call':
- // Determine if the function is a built-in conversion
- staticSymbol = simplifyInContext(context, expression['expression'], depth + 1, /* references */ 0);
- if (staticSymbol instanceof StaticSymbol) {
- if (staticSymbol === self.injectionToken || staticSymbol === self.opaqueToken) {
- // if somebody calls new InjectionToken, don't create an InjectionToken,
- // but rather return the symbol to which the InjectionToken is assigned to.
- // OpaqueToken is supported too as it is required by the language service to
- // support v4 and prior versions of Angular.
- return context;
- }
- var argExpressions = expression['arguments'] || [];
- var converter = self.conversionMap.get(staticSymbol);
- if (converter) {
- var args = argExpressions.map(function (arg) { return simplifyNested(context, arg); })
- .map(function (arg) { return shouldIgnore(arg) ? undefined : arg; });
- return converter(context, args);
- }
- else {
- // Determine if the function is one we can simplify.
- var targetFunction = resolveReferenceValue(staticSymbol);
- return simplifyCall(staticSymbol, targetFunction, argExpressions, expression['expression']);
- }
- }
- return IGNORE;
- case 'error':
- var message = expression.message;
- if (expression['line'] != null) {
- self.error({
- message: message,
- context: expression.context,
- value: expression,
- position: {
- fileName: expression['fileName'],
- line: expression['line'],
- column: expression['character']
- }
- }, context);
- }
- else {
- self.error({ message: message, context: expression.context }, context);
- }
- return IGNORE;
- case 'ignore':
- return expression;
- }
- return null;
- }
- return mapStringMap(expression, function (value, name) {
- if (REFERENCE_SET.has(name)) {
- if (name === USE_VALUE$1 && PROVIDE in expression) {
- // If this is a provider expression, check for special tokens that need the value
- // during analysis.
- var provide = simplify(expression.provide);
- if (provide === self.ROUTES || provide == self.ANALYZE_FOR_ENTRY_COMPONENTS) {
- return simplify(value);
- }
- }
- return simplifyLazily(value);
- }
- return simplify(value);
- });
- }
- return IGNORE;
- }
- return simplify(value);
- }
- var result;
- try {
- result = simplifyInContext(context, value, 0, lazy ? 1 : 0);
- }
- catch (e) {
- if (this.errorRecorder) {
- this.reportError(e, context);
- }
- else {
- throw formatMetadataError(e, context);
- }
- }
- if (shouldIgnore(result)) {
- return undefined;
- }
- return result;
- };
- StaticReflector.prototype.getTypeMetadata = function (type) {
- var resolvedSymbol = this.symbolResolver.resolveSymbol(type);
- return resolvedSymbol && resolvedSymbol.metadata ? resolvedSymbol.metadata :
- { __symbolic: 'class' };
- };
- StaticReflector.prototype.reportError = function (error, context, path) {
- if (this.errorRecorder) {
- this.errorRecorder(formatMetadataError(error, context), (context && context.filePath) || path);
- }
- else {
- throw error;
- }
- };
- StaticReflector.prototype.error = function (_a, reportingContext) {
- var message = _a.message, summary = _a.summary, advise = _a.advise, position = _a.position, context = _a.context, value = _a.value, symbol = _a.symbol, chain = _a.chain;
- this.reportError(metadataError(message, summary, advise, position, symbol, context, chain), reportingContext);
- };
- return StaticReflector;
- }());
- var METADATA_ERROR = 'ngMetadataError';
- function metadataError(message, summary, advise, position, symbol, context, chain) {
- var error = syntaxError(message);
- error[METADATA_ERROR] = true;
- if (advise)
- error.advise = advise;
- if (position)
- error.position = position;
- if (summary)
- error.summary = summary;
- if (context)
- error.context = context;
- if (chain)
- error.chain = chain;
- if (symbol)
- error.symbol = symbol;
- return error;
- }
- function isMetadataError(error) {
- return !!error[METADATA_ERROR];
- }
- var REFERENCE_TO_NONEXPORTED_CLASS = 'Reference to non-exported class';
- var VARIABLE_NOT_INITIALIZED = 'Variable not initialized';
- var DESTRUCTURE_NOT_SUPPORTED = 'Destructuring not supported';
- var COULD_NOT_RESOLVE_TYPE = 'Could not resolve type';
- var FUNCTION_CALL_NOT_SUPPORTED = 'Function call not supported';
- var REFERENCE_TO_LOCAL_SYMBOL = 'Reference to a local symbol';
- var LAMBDA_NOT_SUPPORTED = 'Lambda not supported';
- function expandedMessage(message, context) {
- switch (message) {
- case REFERENCE_TO_NONEXPORTED_CLASS:
- if (context && context.className) {
- return "References to a non-exported class are not supported in decorators but " + context.className + " was referenced.";
- }
- break;
- case VARIABLE_NOT_INITIALIZED:
- return 'Only initialized variables and constants can be referenced in decorators because the value of this variable is needed by the template compiler';
- case DESTRUCTURE_NOT_SUPPORTED:
- return 'Referencing an exported destructured variable or constant is not supported in decorators and this value is needed by the template compiler';
- case COULD_NOT_RESOLVE_TYPE:
- if (context && context.typeName) {
- return "Could not resolve type " + context.typeName;
- }
- break;
- case FUNCTION_CALL_NOT_SUPPORTED:
- if (context && context.name) {
- return "Function calls are not supported in decorators but '" + context.name + "' was called";
- }
- return 'Function calls are not supported in decorators';
- case REFERENCE_TO_LOCAL_SYMBOL:
- if (context && context.name) {
- return "Reference to a local (non-exported) symbols are not supported in decorators but '" + context.name + "' was referenced";
- }
- break;
- case LAMBDA_NOT_SUPPORTED:
- return "Function expressions are not supported in decorators";
- }
- return message;
- }
- function messageAdvise(message, context) {
- switch (message) {
- case REFERENCE_TO_NONEXPORTED_CLASS:
- if (context && context.className) {
- return "Consider exporting '" + context.className + "'";
- }
- break;
- case DESTRUCTURE_NOT_SUPPORTED:
- return 'Consider simplifying to avoid destructuring';
- case REFERENCE_TO_LOCAL_SYMBOL:
- if (context && context.name) {
- return "Consider exporting '" + context.name + "'";
- }
- break;
- case LAMBDA_NOT_SUPPORTED:
- return "Consider changing the function expression into an exported function";
- }
- return undefined;
- }
- function errorSummary(error) {
- if (error.summary) {
- return error.summary;
- }
- switch (error.message) {
- case REFERENCE_TO_NONEXPORTED_CLASS:
- if (error.context && error.context.className) {
- return "references non-exported class " + error.context.className;
- }
- break;
- case VARIABLE_NOT_INITIALIZED:
- return 'is not initialized';
- case DESTRUCTURE_NOT_SUPPORTED:
- return 'is a destructured variable';
- case COULD_NOT_RESOLVE_TYPE:
- return 'could not be resolved';
- case FUNCTION_CALL_NOT_SUPPORTED:
- if (error.context && error.context.name) {
- return "calls '" + error.context.name + "'";
- }
- return "calls a function";
- case REFERENCE_TO_LOCAL_SYMBOL:
- if (error.context && error.context.name) {
- return "references local variable " + error.context.name;
- }
- return "references a local variable";
- }
- return 'contains the error';
- }
- function mapStringMap(input, transform) {
- if (!input)
- return {};
- var result = {};
- Object.keys(input).forEach(function (key) {
- var value = transform(input[key], key);
- if (!shouldIgnore(value)) {
- if (HIDDEN_KEY.test(key)) {
- Object.defineProperty(result, key, { enumerable: false, configurable: true, value: value });
- }
- else {
- result[key] = value;
- }
- }
- });
- return result;
- }
- function isPrimitive(o) {
- return o === null || (typeof o !== 'function' && typeof o !== 'object');
- }
- var BindingScope$1 = /** @class */ (function () {
- function BindingScope() {
- }
- BindingScope.build = function () {
- var current = new Map();
- return {
- define: function (name, value) {
- current.set(name, value);
- return this;
- },
- done: function () {
- return current.size > 0 ? new PopulatedScope(current) : BindingScope.empty;
- }
- };
- };
- BindingScope.missing = {};
- BindingScope.empty = { resolve: function (name) { return BindingScope.missing; } };
- return BindingScope;
- }());
- var PopulatedScope = /** @class */ (function (_super) {
- __extends(PopulatedScope, _super);
- function PopulatedScope(bindings) {
- var _this = _super.call(this) || this;
- _this.bindings = bindings;
- return _this;
- }
- PopulatedScope.prototype.resolve = function (name) {
- return this.bindings.has(name) ? this.bindings.get(name) : BindingScope$1.missing;
- };
- return PopulatedScope;
- }(BindingScope$1));
- function formatMetadataMessageChain(chain, advise) {
- var expanded = expandedMessage(chain.message, chain.context);
- var nesting = chain.symbol ? " in '" + chain.symbol.name + "'" : '';
- var message = "" + expanded + nesting;
- var position = chain.position;
- var next = chain.next ?
- formatMetadataMessageChain(chain.next, advise) :
- advise ? { message: advise } : undefined;
- return { message: message, position: position, next: next };
- }
- function formatMetadataError(e, context) {
- if (isMetadataError(e)) {
- // Produce a formatted version of the and leaving enough information in the original error
- // to recover the formatting information to eventually produce a diagnostic error message.
- var position = e.position;
- var chain = {
- message: "Error during template compile of '" + context.name + "'",
- position: position,
- next: { message: e.message, next: e.chain, context: e.context, symbol: e.symbol }
- };
- var advise = e.advise || messageAdvise(e.message, e.context);
- return formattedError(formatMetadataMessageChain(chain, advise));
- }
- return e;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var AotSummaryResolver = /** @class */ (function () {
- function AotSummaryResolver(host, staticSymbolCache) {
- this.host = host;
- this.staticSymbolCache = staticSymbolCache;
- // Note: this will only contain StaticSymbols without members!
- this.summaryCache = new Map();
- this.loadedFilePaths = new Map();
- // Note: this will only contain StaticSymbols without members!
- this.importAs = new Map();
- this.knownFileNameToModuleNames = new Map();
- }
- AotSummaryResolver.prototype.isLibraryFile = function (filePath) {
- // Note: We need to strip the .ngfactory. file path,
- // so this method also works for generated files
- // (for which host.isSourceFile will always return false).
- return !this.host.isSourceFile(stripGeneratedFileSuffix(filePath));
- };
- AotSummaryResolver.prototype.toSummaryFileName = function (filePath, referringSrcFileName) {
- return this.host.toSummaryFileName(filePath, referringSrcFileName);
- };
- AotSummaryResolver.prototype.fromSummaryFileName = function (fileName, referringLibFileName) {
- return this.host.fromSummaryFileName(fileName, referringLibFileName);
- };
- AotSummaryResolver.prototype.resolveSummary = function (staticSymbol) {
- var rootSymbol = staticSymbol.members.length ?
- this.staticSymbolCache.get(staticSymbol.filePath, staticSymbol.name) :
- staticSymbol;
- var summary = this.summaryCache.get(rootSymbol);
- if (!summary) {
- this._loadSummaryFile(staticSymbol.filePath);
- summary = this.summaryCache.get(staticSymbol);
- }
- return (rootSymbol === staticSymbol && summary) || null;
- };
- AotSummaryResolver.prototype.getSymbolsOf = function (filePath) {
- if (this._loadSummaryFile(filePath)) {
- return Array.from(this.summaryCache.keys()).filter(function (symbol) { return symbol.filePath === filePath; });
- }
- return null;
- };
- AotSummaryResolver.prototype.getImportAs = function (staticSymbol) {
- staticSymbol.assertNoMembers();
- return this.importAs.get(staticSymbol);
- };
- /**
- * Converts a file path to a module name that can be used as an `import`.
- */
- AotSummaryResolver.prototype.getKnownModuleName = function (importedFilePath) {
- return this.knownFileNameToModuleNames.get(importedFilePath) || null;
- };
- AotSummaryResolver.prototype.addSummary = function (summary) { this.summaryCache.set(summary.symbol, summary); };
- AotSummaryResolver.prototype._loadSummaryFile = function (filePath) {
- var _this = this;
- var hasSummary = this.loadedFilePaths.get(filePath);
- if (hasSummary != null) {
- return hasSummary;
- }
- var json = null;
- if (this.isLibraryFile(filePath)) {
- var summaryFilePath = summaryFileName(filePath);
- try {
- json = this.host.loadSummary(summaryFilePath);
- }
- catch (e) {
- console.error("Error loading summary file " + summaryFilePath);
- throw e;
- }
- }
- hasSummary = json != null;
- this.loadedFilePaths.set(filePath, hasSummary);
- if (json) {
- var _a = deserializeSummaries(this.staticSymbolCache, this, filePath, json), moduleName = _a.moduleName, summaries = _a.summaries, importAs = _a.importAs;
- summaries.forEach(function (summary) { return _this.summaryCache.set(summary.symbol, summary); });
- if (moduleName) {
- this.knownFileNameToModuleNames.set(filePath, moduleName);
- }
- importAs.forEach(function (importAs) { _this.importAs.set(importAs.symbol, importAs.importAs); });
- }
- return hasSummary;
- };
- return AotSummaryResolver;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var JitSummaryResolver = /** @class */ (function () {
- function JitSummaryResolver() {
- this._summaries = new Map();
- }
- JitSummaryResolver.prototype.isLibraryFile = function () { return false; };
- JitSummaryResolver.prototype.toSummaryFileName = function (fileName) { return fileName; };
- JitSummaryResolver.prototype.fromSummaryFileName = function (fileName) { return fileName; };
- JitSummaryResolver.prototype.resolveSummary = function (reference) {
- return this._summaries.get(reference) || null;
- };
- JitSummaryResolver.prototype.getSymbolsOf = function () { return []; };
- JitSummaryResolver.prototype.getImportAs = function (reference) { return reference; };
- JitSummaryResolver.prototype.getKnownModuleName = function (fileName) { return null; };
- JitSummaryResolver.prototype.addSummary = function (summary) { this._summaries.set(summary.symbol, summary); };
- return JitSummaryResolver;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function createOfflineCompileUrlResolver() {
- return new UrlResolver('.');
- }
- var UrlResolver = /** @class */ (function () {
- function UrlResolverImpl(_packagePrefix) {
- if (_packagePrefix === void 0) { _packagePrefix = null; }
- this._packagePrefix = _packagePrefix;
- }
- /**
- * Resolves the `url` given the `baseUrl`:
- * - when the `url` is null, the `baseUrl` is returned,
- * - if `url` is relative ('path/to/here', './path/to/here'), the resolved url is a combination of
- * `baseUrl` and `url`,
- * - if `url` is absolute (it has a scheme: 'http://', 'https://' or start with '/'), the `url` is
- * returned as is (ignoring the `baseUrl`)
- */
- UrlResolverImpl.prototype.resolve = function (baseUrl, url) {
- var resolvedUrl = url;
- if (baseUrl != null && baseUrl.length > 0) {
- resolvedUrl = _resolveUrl(baseUrl, resolvedUrl);
- }
- var resolvedParts = _split(resolvedUrl);
- var prefix = this._packagePrefix;
- if (prefix != null && resolvedParts != null &&
- resolvedParts[_ComponentIndex.Scheme] == 'package') {
- var path = resolvedParts[_ComponentIndex.Path];
- prefix = prefix.replace(/\/+$/, '');
- path = path.replace(/^\/+/, '');
- return prefix + "/" + path;
- }
- return resolvedUrl;
- };
- return UrlResolverImpl;
- }());
- // The code below is adapted from Traceur:
- // https://github.com/google/traceur-compiler/blob/9511c1dafa972bf0de1202a8a863bad02f0f95a8/src/runtime/url.js
- /**
- * Builds a URI string from already-encoded parts.
- *
- * No encoding is performed. Any component may be omitted as either null or
- * undefined.
- *
- * @param opt_scheme The scheme such as 'http'.
- * @param opt_userInfo The user name before the '@'.
- * @param opt_domain The domain such as 'www.google.com', already
- * URI-encoded.
- * @param opt_port The port number.
- * @param opt_path The path, already URI-encoded. If it is not
- * empty, it must begin with a slash.
- * @param opt_queryData The URI-encoded query data.
- * @param opt_fragment The URI-encoded fragment identifier.
- * @return The fully combined URI.
- */
- function _buildFromEncodedParts(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {
- var out = [];
- if (opt_scheme != null) {
- out.push(opt_scheme + ':');
- }
- if (opt_domain != null) {
- out.push('//');
- if (opt_userInfo != null) {
- out.push(opt_userInfo + '@');
- }
- out.push(opt_domain);
- if (opt_port != null) {
- out.push(':' + opt_port);
- }
- }
- if (opt_path != null) {
- out.push(opt_path);
- }
- if (opt_queryData != null) {
- out.push('?' + opt_queryData);
- }
- if (opt_fragment != null) {
- out.push('#' + opt_fragment);
- }
- return out.join('');
- }
- /**
- * A regular expression for breaking a URI into its component parts.
- *
- * {@link http://www.gbiv.com/protocols/uri/rfc/rfc3986.html#RFC2234} says
- * As the "first-match-wins" algorithm is identical to the "greedy"
- * disambiguation method used by POSIX regular expressions, it is natural and
- * commonplace to use a regular expression for parsing the potential five
- * components of a URI reference.
- *
- * The following line is the regular expression for breaking-down a
- * well-formed URI reference into its components.
- *
- * <pre>
- * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
- * 12 3 4 5 6 7 8 9
- * </pre>
- *
- * The numbers in the second line above are only to assist readability; they
- * indicate the reference points for each subexpression (i.e., each paired
- * parenthesis). We refer to the value matched for subexpression <n> as $<n>.
- * For example, matching the above expression to
- * <pre>
- * http://www.ics.uci.edu/pub/ietf/uri/#Related
- * </pre>
- * results in the following subexpression matches:
- * <pre>
- * $1 = http:
- * $2 = http
- * $3 = //www.ics.uci.edu
- * $4 = www.ics.uci.edu
- * $5 = /pub/ietf/uri/
- * $6 = <undefined>
- * $7 = <undefined>
- * $8 = #Related
- * $9 = Related
- * </pre>
- * where <undefined> indicates that the component is not present, as is the
- * case for the query component in the above example. Therefore, we can
- * determine the value of the five components as
- * <pre>
- * scheme = $2
- * authority = $4
- * path = $5
- * query = $7
- * fragment = $9
- * </pre>
- *
- * The regular expression has been modified slightly to expose the
- * userInfo, domain, and port separately from the authority.
- * The modified version yields
- * <pre>
- * $1 = http scheme
- * $2 = <undefined> userInfo -\
- * $3 = www.ics.uci.edu domain | authority
- * $4 = <undefined> port -/
- * $5 = /pub/ietf/uri/ path
- * $6 = <undefined> query without ?
- * $7 = Related fragment without #
- * </pre>
- * @internal
- */
- var _splitRe = new RegExp('^' +
- '(?:' +
- '([^:/?#.]+)' + // scheme - ignore special characters
- // used by other URL parts such as :,
- // ?, /, #, and .
- ':)?' +
- '(?://' +
- '(?:([^/?#]*)@)?' + // userInfo
- '([\\w\\d\\-\\u0100-\\uffff.%]*)' + // domain - restrict to letters,
- // digits, dashes, dots, percent
- // escapes, and unicode characters.
- '(?::([0-9]+))?' + // port
- ')?' +
- '([^?#]+)?' + // path
- '(?:\\?([^#]*))?' + // query
- '(?:#(.*))?' + // fragment
- '$');
- /**
- * The index of each URI component in the return value of goog.uri.utils.split.
- * @enum {number}
- */
- var _ComponentIndex;
- (function (_ComponentIndex) {
- _ComponentIndex[_ComponentIndex["Scheme"] = 1] = "Scheme";
- _ComponentIndex[_ComponentIndex["UserInfo"] = 2] = "UserInfo";
- _ComponentIndex[_ComponentIndex["Domain"] = 3] = "Domain";
- _ComponentIndex[_ComponentIndex["Port"] = 4] = "Port";
- _ComponentIndex[_ComponentIndex["Path"] = 5] = "Path";
- _ComponentIndex[_ComponentIndex["QueryData"] = 6] = "QueryData";
- _ComponentIndex[_ComponentIndex["Fragment"] = 7] = "Fragment";
- })(_ComponentIndex || (_ComponentIndex = {}));
- /**
- * Splits a URI into its component parts.
- *
- * Each component can be accessed via the component indices; for example:
- * <pre>
- * goog.uri.utils.split(someStr)[goog.uri.utils.CompontentIndex.QUERY_DATA];
- * </pre>
- *
- * @param uri The URI string to examine.
- * @return Each component still URI-encoded.
- * Each component that is present will contain the encoded value, whereas
- * components that are not present will be undefined or empty, depending
- * on the browser's regular expression implementation. Never null, since
- * arbitrary strings may still look like path names.
- */
- function _split(uri) {
- return uri.match(_splitRe);
- }
- /**
- * Removes dot segments in given path component, as described in
- * RFC 3986, section 5.2.4.
- *
- * @param path A non-empty path component.
- * @return Path component with removed dot segments.
- */
- function _removeDotSegments(path) {
- if (path == '/')
- return '/';
- var leadingSlash = path[0] == '/' ? '/' : '';
- var trailingSlash = path[path.length - 1] === '/' ? '/' : '';
- var segments = path.split('/');
- var out = [];
- var up = 0;
- for (var pos = 0; pos < segments.length; pos++) {
- var segment = segments[pos];
- switch (segment) {
- case '':
- case '.':
- break;
- case '..':
- if (out.length > 0) {
- out.pop();
- }
- else {
- up++;
- }
- break;
- default:
- out.push(segment);
- }
- }
- if (leadingSlash == '') {
- while (up-- > 0) {
- out.unshift('..');
- }
- if (out.length === 0)
- out.push('.');
- }
- return leadingSlash + out.join('/') + trailingSlash;
- }
- /**
- * Takes an array of the parts from split and canonicalizes the path part
- * and then joins all the parts.
- */
- function _joinAndCanonicalizePath(parts) {
- var path = parts[_ComponentIndex.Path];
- path = path == null ? '' : _removeDotSegments(path);
- parts[_ComponentIndex.Path] = path;
- return _buildFromEncodedParts(parts[_ComponentIndex.Scheme], parts[_ComponentIndex.UserInfo], parts[_ComponentIndex.Domain], parts[_ComponentIndex.Port], path, parts[_ComponentIndex.QueryData], parts[_ComponentIndex.Fragment]);
- }
- /**
- * Resolves a URL.
- * @param base The URL acting as the base URL.
- * @param to The URL to resolve.
- */
- function _resolveUrl(base, url) {
- var parts = _split(encodeURI(url));
- var baseParts = _split(base);
- if (parts[_ComponentIndex.Scheme] != null) {
- return _joinAndCanonicalizePath(parts);
- }
- else {
- parts[_ComponentIndex.Scheme] = baseParts[_ComponentIndex.Scheme];
- }
- for (var i = _ComponentIndex.Scheme; i <= _ComponentIndex.Port; i++) {
- if (parts[i] == null) {
- parts[i] = baseParts[i];
- }
- }
- if (parts[_ComponentIndex.Path][0] == '/') {
- return _joinAndCanonicalizePath(parts);
- }
- var path = baseParts[_ComponentIndex.Path];
- if (path == null)
- path = '/';
- var index = path.lastIndexOf('/');
- path = path.substring(0, index + 1) + parts[_ComponentIndex.Path];
- parts[_ComponentIndex.Path] = path;
- return _joinAndCanonicalizePath(parts);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Processes a template and extract metadata about expressions and symbols within.
- *
- * This is a companion to the `DirectiveBinder` that doesn't require knowledge of directives matched
- * within the template in order to operate.
- *
- * Expressions are visited by the superclass `RecursiveAstVisitor`, with custom logic provided
- * by overridden methods from that visitor.
- */
- var TemplateBinder = /** @class */ (function (_super) {
- __extends(TemplateBinder, _super);
- function TemplateBinder(bindings, symbols, usedPipes, nestingLevel, scope, template, level) {
- var _this = _super.call(this) || this;
- _this.bindings = bindings;
- _this.symbols = symbols;
- _this.usedPipes = usedPipes;
- _this.nestingLevel = nestingLevel;
- _this.scope = scope;
- _this.template = template;
- _this.level = level;
- _this.pipesUsed = [];
- // Save a bit of processing time by constructing this closure in advance.
- _this.visitNode = function (node) { return node.visit(_this); };
- return _this;
- }
- /**
- * Process a template and extract metadata about expressions and symbols within.
- *
- * @param template the nodes of the template to process
- * @param scope the `Scope` of the template being processed.
- * @returns three maps which contain metadata about the template: `expressions` which interprets
- * special `AST` nodes in expressions as pointing to references or variables declared within the
- * template, `symbols` which maps those variables and references to the nested `Template` which
- * declares them, if any, and `nestingLevel` which associates each `Template` with a integer
- * nesting level (how many levels deep within the template structure the `Template` is), starting
- * at 1.
- */
- TemplateBinder.apply = function (template, scope) {
- var expressions = new Map();
- var symbols = new Map();
- var nestingLevel = new Map();
- var usedPipes = new Set();
- // The top-level template has nesting level 0.
- var binder = new TemplateBinder(expressions, symbols, usedPipes, nestingLevel, scope, template instanceof Template ? template : null, 0);
- binder.ingest(template);
- return { expressions: expressions, symbols: symbols, nestingLevel: nestingLevel, usedPipes: usedPipes };
- };
- TemplateBinder.prototype.ingest = function (template) {
- if (template instanceof Template) {
- // For <ng-template>s, process only variables and child nodes. Inputs, outputs, templateAttrs,
- // and references were all processed in the scope of the containing template.
- template.variables.forEach(this.visitNode);
- template.children.forEach(this.visitNode);
- // Set the nesting level.
- this.nestingLevel.set(template, this.level);
- }
- else {
- // Visit each node from the top-level template.
- template.forEach(this.visitNode);
- }
- };
- TemplateBinder.prototype.visitElement = function (element) {
- // Visit the inputs, outputs, and children of the element.
- element.inputs.forEach(this.visitNode);
- element.outputs.forEach(this.visitNode);
- element.children.forEach(this.visitNode);
- };
- TemplateBinder.prototype.visitTemplate = function (template) {
- // First, visit inputs, outputs and template attributes of the template node.
- template.inputs.forEach(this.visitNode);
- template.outputs.forEach(this.visitNode);
- template.templateAttrs.forEach(this.visitNode);
- // References are also evaluated in the outer context.
- template.references.forEach(this.visitNode);
- // Next, recurse into the template using its scope, and bumping the nesting level up by one.
- var childScope = this.scope.getChildScope(template);
- var binder = new TemplateBinder(this.bindings, this.symbols, this.usedPipes, this.nestingLevel, childScope, template, this.level + 1);
- binder.ingest(template);
- };
- TemplateBinder.prototype.visitVariable = function (variable) {
- // Register the `Variable` as a symbol in the current `Template`.
- if (this.template !== null) {
- this.symbols.set(variable, this.template);
- }
- };
- TemplateBinder.prototype.visitReference = function (reference) {
- // Register the `Reference` as a symbol in the current `Template`.
- if (this.template !== null) {
- this.symbols.set(reference, this.template);
- }
- };
- // Unused template visitors
- TemplateBinder.prototype.visitText = function (text) { };
- TemplateBinder.prototype.visitContent = function (content) { };
- TemplateBinder.prototype.visitTextAttribute = function (attribute) { };
- TemplateBinder.prototype.visitIcu = function (icu) { };
- // The remaining visitors are concerned with processing AST expressions within template bindings
- TemplateBinder.prototype.visitBoundAttribute = function (attribute) { attribute.value.visit(this); };
- TemplateBinder.prototype.visitBoundEvent = function (event) { event.handler.visit(this); };
- TemplateBinder.prototype.visitBoundText = function (text) { text.value.visit(this); };
- TemplateBinder.prototype.visitPipe = function (ast, context) {
- this.usedPipes.add(ast.name);
- return _super.prototype.visitPipe.call(this, ast, context);
- };
- // These five types of AST expressions can refer to expression roots, which could be variables
- // or references in the current scope.
- TemplateBinder.prototype.visitPropertyRead = function (ast, context) {
- this.maybeMap(context, ast, ast.name);
- return _super.prototype.visitPropertyRead.call(this, ast, context);
- };
- TemplateBinder.prototype.visitSafePropertyRead = function (ast, context) {
- this.maybeMap(context, ast, ast.name);
- return _super.prototype.visitSafePropertyRead.call(this, ast, context);
- };
- TemplateBinder.prototype.visitPropertyWrite = function (ast, context) {
- this.maybeMap(context, ast, ast.name);
- return _super.prototype.visitPropertyWrite.call(this, ast, context);
- };
- TemplateBinder.prototype.visitMethodCall = function (ast, context) {
- this.maybeMap(context, ast, ast.name);
- return _super.prototype.visitMethodCall.call(this, ast, context);
- };
- TemplateBinder.prototype.visitSafeMethodCall = function (ast, context) {
- this.maybeMap(context, ast, ast.name);
- return _super.prototype.visitSafeMethodCall.call(this, ast, context);
- };
- TemplateBinder.prototype.maybeMap = function (scope, ast, name) {
- // If the receiver of the expression isn't the `ImplicitReceiver`, this isn't the root of an
- // `AST` expression that maps to a `Variable` or `Reference`.
- if (!(ast.receiver instanceof ImplicitReceiver)) {
- return;
- }
- // Check whether the name exists in the current scope. If so, map it. Otherwise, the name is
- // probably a property on the top-level component context.
- var target = this.scope.lookup(name);
- if (target !== null) {
- this.bindings.set(ast, target);
- }
- };
- return TemplateBinder;
- }(RecursiveAstVisitor$1));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // This file only reexports content of the `src` folder. Keep it that way.
- // This function call has a global side effects and publishes the compiler into global namespace for
- // the late binding of the Compiler to the @angular/core for jit compilation.
- publishFacade(_global);
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // This file only reexports content of the `src` folder. Keep it that way.
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * An enumeration of basic types.
- *
- * @publicApi
- */
- var BuiltinType$1;
- (function (BuiltinType) {
- /**
- * The type is a type that can hold any other type.
- */
- BuiltinType[BuiltinType["Any"] = 0] = "Any";
- /**
- * The type of a string literal.
- */
- BuiltinType[BuiltinType["String"] = 1] = "String";
- /**
- * The type of a numeric literal.
- */
- BuiltinType[BuiltinType["Number"] = 2] = "Number";
- /**
- * The type of the `true` and `false` literals.
- */
- BuiltinType[BuiltinType["Boolean"] = 3] = "Boolean";
- /**
- * The type of the `undefined` literal.
- */
- BuiltinType[BuiltinType["Undefined"] = 4] = "Undefined";
- /**
- * the type of the `null` literal.
- */
- BuiltinType[BuiltinType["Null"] = 5] = "Null";
- /**
- * the type is an unbound type parameter.
- */
- BuiltinType[BuiltinType["Unbound"] = 6] = "Unbound";
- /**
- * Not a built-in type.
- */
- BuiltinType[BuiltinType["Other"] = 7] = "Other";
- })(BuiltinType$1 || (BuiltinType$1 = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var DiagnosticKind;
- (function (DiagnosticKind) {
- DiagnosticKind[DiagnosticKind["Error"] = 0] = "Error";
- DiagnosticKind[DiagnosticKind["Warning"] = 1] = "Warning";
- })(DiagnosticKind || (DiagnosticKind = {}));
- var TypeDiagnostic = /** @class */ (function () {
- function TypeDiagnostic(kind, message, ast) {
- this.kind = kind;
- this.message = message;
- this.ast = ast;
- }
- return TypeDiagnostic;
- }());
- // AstType calculatetype of the ast given AST element.
- var AstType = /** @class */ (function () {
- function AstType(scope, query, context) {
- this.scope = scope;
- this.query = query;
- this.context = context;
- }
- AstType.prototype.getType = function (ast) { return ast.visit(this); };
- AstType.prototype.getDiagnostics = function (ast) {
- this.diagnostics = [];
- var type = ast.visit(this);
- if (this.context.event && type.callable) {
- this.reportWarning('Unexpected callable expression. Expected a method call', ast);
- }
- return this.diagnostics;
- };
- AstType.prototype.visitBinary = function (ast) {
- var _this_1 = this;
- // Treat undefined and null as other.
- function normalize(kind, other) {
- switch (kind) {
- case BuiltinType$1.Undefined:
- case BuiltinType$1.Null:
- return normalize(other, BuiltinType$1.Other);
- }
- return kind;
- }
- var getType = function (ast, operation) {
- var type = _this_1.getType(ast);
- if (type.nullable) {
- switch (operation) {
- case '&&':
- case '||':
- case '==':
- case '!=':
- case '===':
- case '!==':
- // Nullable allowed.
- break;
- default:
- _this_1.reportError("The expression might be null", ast);
- break;
- }
- return _this_1.query.getNonNullableType(type);
- }
- return type;
- };
- var leftType = getType(ast.left, ast.operation);
- var rightType = getType(ast.right, ast.operation);
- var leftRawKind = this.query.getTypeKind(leftType);
- var rightRawKind = this.query.getTypeKind(rightType);
- var leftKind = normalize(leftRawKind, rightRawKind);
- var rightKind = normalize(rightRawKind, leftRawKind);
- // The following swtich implements operator typing similar to the
- // type production tables in the TypeScript specification.
- // https://github.com/Microsoft/TypeScript/blob/v1.8.10/doc/spec.md#4.19
- var operKind = leftKind << 8 | rightKind;
- switch (ast.operation) {
- case '*':
- case '/':
- case '%':
- case '-':
- case '<<':
- case '>>':
- case '>>>':
- case '&':
- case '^':
- case '|':
- switch (operKind) {
- case BuiltinType$1.Any << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Number << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Any << 8 | BuiltinType$1.Number:
- case BuiltinType$1.Number << 8 | BuiltinType$1.Number:
- return this.query.getBuiltinType(BuiltinType$1.Number);
- default:
- var errorAst = ast.left;
- switch (leftKind) {
- case BuiltinType$1.Any:
- case BuiltinType$1.Number:
- errorAst = ast.right;
- break;
- }
- return this.reportError('Expected a numeric type', errorAst);
- }
- case '+':
- switch (operKind) {
- case BuiltinType$1.Any << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Any << 8 | BuiltinType$1.Boolean:
- case BuiltinType$1.Any << 8 | BuiltinType$1.Number:
- case BuiltinType$1.Any << 8 | BuiltinType$1.Other:
- case BuiltinType$1.Boolean << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Number << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Other << 8 | BuiltinType$1.Any:
- return this.anyType;
- case BuiltinType$1.Any << 8 | BuiltinType$1.String:
- case BuiltinType$1.Boolean << 8 | BuiltinType$1.String:
- case BuiltinType$1.Number << 8 | BuiltinType$1.String:
- case BuiltinType$1.String << 8 | BuiltinType$1.Any:
- case BuiltinType$1.String << 8 | BuiltinType$1.Boolean:
- case BuiltinType$1.String << 8 | BuiltinType$1.Number:
- case BuiltinType$1.String << 8 | BuiltinType$1.String:
- case BuiltinType$1.String << 8 | BuiltinType$1.Other:
- case BuiltinType$1.Other << 8 | BuiltinType$1.String:
- return this.query.getBuiltinType(BuiltinType$1.String);
- case BuiltinType$1.Number << 8 | BuiltinType$1.Number:
- return this.query.getBuiltinType(BuiltinType$1.Number);
- case BuiltinType$1.Boolean << 8 | BuiltinType$1.Number:
- case BuiltinType$1.Other << 8 | BuiltinType$1.Number:
- return this.reportError('Expected a number type', ast.left);
- case BuiltinType$1.Number << 8 | BuiltinType$1.Boolean:
- case BuiltinType$1.Number << 8 | BuiltinType$1.Other:
- return this.reportError('Expected a number type', ast.right);
- default:
- return this.reportError('Expected operands to be a string or number type', ast);
- }
- case '>':
- case '<':
- case '<=':
- case '>=':
- case '==':
- case '!=':
- case '===':
- case '!==':
- switch (operKind) {
- case BuiltinType$1.Any << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Any << 8 | BuiltinType$1.Boolean:
- case BuiltinType$1.Any << 8 | BuiltinType$1.Number:
- case BuiltinType$1.Any << 8 | BuiltinType$1.String:
- case BuiltinType$1.Any << 8 | BuiltinType$1.Other:
- case BuiltinType$1.Boolean << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Boolean << 8 | BuiltinType$1.Boolean:
- case BuiltinType$1.Number << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Number << 8 | BuiltinType$1.Number:
- case BuiltinType$1.String << 8 | BuiltinType$1.Any:
- case BuiltinType$1.String << 8 | BuiltinType$1.String:
- case BuiltinType$1.Other << 8 | BuiltinType$1.Any:
- case BuiltinType$1.Other << 8 | BuiltinType$1.Other:
- return this.query.getBuiltinType(BuiltinType$1.Boolean);
- default:
- return this.reportError('Expected the operants to be of similar type or any', ast);
- }
- case '&&':
- return rightType;
- case '||':
- return this.query.getTypeUnion(leftType, rightType);
- }
- return this.reportError("Unrecognized operator " + ast.operation, ast);
- };
- AstType.prototype.visitChain = function (ast) {
- if (this.diagnostics) {
- // If we are producing diagnostics, visit the children
- visitAstChildren(ast, this);
- }
- // The type of a chain is always undefined.
- return this.query.getBuiltinType(BuiltinType$1.Undefined);
- };
- AstType.prototype.visitConditional = function (ast) {
- // The type of a conditional is the union of the true and false conditions.
- if (this.diagnostics) {
- visitAstChildren(ast, this);
- }
- return this.query.getTypeUnion(this.getType(ast.trueExp), this.getType(ast.falseExp));
- };
- AstType.prototype.visitFunctionCall = function (ast) {
- var _this_1 = this;
- // The type of a function call is the return type of the selected signature.
- // The signature is selected based on the types of the arguments. Angular doesn't
- // support contextual typing of arguments so this is simpler than TypeScript's
- // version.
- var args = ast.args.map(function (arg) { return _this_1.getType(arg); });
- var target = this.getType(ast.target);
- if (!target || !target.callable)
- return this.reportError('Call target is not callable', ast);
- var signature = target.selectSignature(args);
- if (signature)
- return signature.result;
- // TODO: Consider a better error message here.
- return this.reportError('Unable no compatible signature found for call', ast);
- };
- AstType.prototype.visitImplicitReceiver = function (ast) {
- var _this = this;
- // Return a pseudo-symbol for the implicit receiver.
- // The members of the implicit receiver are what is defined by the
- // scope passed into this class.
- return {
- name: '$implict',
- kind: 'component',
- language: 'ng-template',
- type: undefined,
- container: undefined,
- callable: false,
- nullable: false,
- public: true,
- definition: undefined,
- members: function () { return _this.scope; },
- signatures: function () { return []; },
- selectSignature: function (types) { return undefined; },
- indexed: function (argument) { return undefined; }
- };
- };
- AstType.prototype.visitInterpolation = function (ast) {
- // If we are producing diagnostics, visit the children.
- if (this.diagnostics) {
- visitAstChildren(ast, this);
- }
- return this.undefinedType;
- };
- AstType.prototype.visitKeyedRead = function (ast) {
- var targetType = this.getType(ast.obj);
- var keyType = this.getType(ast.key);
- var result = targetType.indexed(keyType);
- return result || this.anyType;
- };
- AstType.prototype.visitKeyedWrite = function (ast) {
- // The write of a type is the type of the value being written.
- return this.getType(ast.value);
- };
- AstType.prototype.visitLiteralArray = function (ast) {
- var _this_1 = this;
- var _a;
- // A type literal is an array type of the union of the elements
- return this.query.getArrayType((_a = this.query).getTypeUnion.apply(_a, __spread(ast.expressions.map(function (element) { return _this_1.getType(element); }))));
- };
- AstType.prototype.visitLiteralMap = function (ast) {
- // If we are producing diagnostics, visit the children
- if (this.diagnostics) {
- visitAstChildren(ast, this);
- }
- // TODO: Return a composite type.
- return this.anyType;
- };
- AstType.prototype.visitLiteralPrimitive = function (ast) {
- // The type of a literal primitive depends on the value of the literal.
- switch (ast.value) {
- case true:
- case false:
- return this.query.getBuiltinType(BuiltinType$1.Boolean);
- case null:
- return this.query.getBuiltinType(BuiltinType$1.Null);
- case undefined:
- return this.query.getBuiltinType(BuiltinType$1.Undefined);
- default:
- switch (typeof ast.value) {
- case 'string':
- return this.query.getBuiltinType(BuiltinType$1.String);
- case 'number':
- return this.query.getBuiltinType(BuiltinType$1.Number);
- default:
- return this.reportError('Unrecognized primitive', ast);
- }
- }
- };
- AstType.prototype.visitMethodCall = function (ast) {
- return this.resolveMethodCall(this.getType(ast.receiver), ast);
- };
- AstType.prototype.visitPipe = function (ast) {
- var _this_1 = this;
- // The type of a pipe node is the return type of the pipe's transform method. The table returned
- // by getPipes() is expected to contain symbols with the corresponding transform method type.
- var pipe = this.query.getPipes().get(ast.name);
- if (!pipe)
- return this.reportError("No pipe by the name " + ast.name + " found", ast);
- var expType = this.getType(ast.exp);
- var signature = pipe.selectSignature([expType].concat(ast.args.map(function (arg) { return _this_1.getType(arg); })));
- if (!signature)
- return this.reportError('Unable to resolve signature for pipe invocation', ast);
- return signature.result;
- };
- AstType.prototype.visitPrefixNot = function (ast) {
- // The type of a prefix ! is always boolean.
- return this.query.getBuiltinType(BuiltinType$1.Boolean);
- };
- AstType.prototype.visitNonNullAssert = function (ast) {
- var expressionType = this.getType(ast.expression);
- return this.query.getNonNullableType(expressionType);
- };
- AstType.prototype.visitPropertyRead = function (ast) {
- return this.resolvePropertyRead(this.getType(ast.receiver), ast);
- };
- AstType.prototype.visitPropertyWrite = function (ast) {
- // The type of a write is the type of the value being written.
- return this.getType(ast.value);
- };
- AstType.prototype.visitQuote = function (ast) {
- // The type of a quoted expression is any.
- return this.query.getBuiltinType(BuiltinType$1.Any);
- };
- AstType.prototype.visitSafeMethodCall = function (ast) {
- return this.resolveMethodCall(this.query.getNonNullableType(this.getType(ast.receiver)), ast);
- };
- AstType.prototype.visitSafePropertyRead = function (ast) {
- return this.resolvePropertyRead(this.query.getNonNullableType(this.getType(ast.receiver)), ast);
- };
- Object.defineProperty(AstType.prototype, "anyType", {
- get: function () {
- var result = this._anyType;
- if (!result) {
- result = this._anyType = this.query.getBuiltinType(BuiltinType$1.Any);
- }
- return result;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AstType.prototype, "undefinedType", {
- get: function () {
- var result = this._undefinedType;
- if (!result) {
- result = this._undefinedType = this.query.getBuiltinType(BuiltinType$1.Undefined);
- }
- return result;
- },
- enumerable: true,
- configurable: true
- });
- AstType.prototype.resolveMethodCall = function (receiverType, ast) {
- var _this_1 = this;
- if (this.isAny(receiverType)) {
- return this.anyType;
- }
- // The type of a method is the selected methods result type.
- var method = receiverType.members().get(ast.name);
- if (!method)
- return this.reportError("Unknown method '" + ast.name + "'", ast);
- if (!method.type)
- return this.reportError("Could not find a type for '" + ast.name + "'", ast);
- if (!method.type.callable)
- return this.reportError("Member '" + ast.name + "' is not callable", ast);
- var signature = method.type.selectSignature(ast.args.map(function (arg) { return _this_1.getType(arg); }));
- if (!signature)
- return this.reportError("Unable to resolve signature for call of method " + ast.name, ast);
- return signature.result;
- };
- AstType.prototype.resolvePropertyRead = function (receiverType, ast) {
- if (this.isAny(receiverType)) {
- return this.anyType;
- }
- // The type of a property read is the seelcted member's type.
- var member = receiverType.members().get(ast.name);
- if (!member) {
- var receiverInfo = receiverType.name;
- if (receiverInfo == '$implict') {
- receiverInfo =
- 'The component declaration, template variable declarations, and element references do';
- }
- else if (receiverType.nullable) {
- return this.reportError("The expression might be null", ast.receiver);
- }
- else {
- receiverInfo = "'" + receiverInfo + "' does";
- }
- return this.reportError("Identifier '" + ast.name + "' is not defined. " + receiverInfo + " not contain such a member", ast);
- }
- if (!member.public) {
- var receiverInfo = receiverType.name;
- if (receiverInfo == '$implict') {
- receiverInfo = 'the component';
- }
- else {
- receiverInfo = "'" + receiverInfo + "'";
- }
- this.reportWarning("Identifier '" + ast.name + "' refers to a private member of " + receiverInfo, ast);
- }
- return member.type;
- };
- AstType.prototype.reportError = function (message, ast) {
- if (this.diagnostics) {
- this.diagnostics.push(new TypeDiagnostic(DiagnosticKind.Error, message, ast));
- }
- return this.anyType;
- };
- AstType.prototype.reportWarning = function (message, ast) {
- if (this.diagnostics) {
- this.diagnostics.push(new TypeDiagnostic(DiagnosticKind.Warning, message, ast));
- }
- return this.anyType;
- };
- AstType.prototype.isAny = function (symbol) {
- return !symbol || this.query.getTypeKind(symbol) == BuiltinType$1.Any ||
- (!!symbol.type && this.isAny(symbol.type));
- };
- return AstType;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getTemplateExpressionDiagnostics(info) {
- var visitor = new ExpressionDiagnosticsVisitor(info, function (path, includeEvent) {
- return getExpressionScope(info, path, includeEvent);
- });
- templateVisitAll(visitor, info.templateAst);
- return visitor.diagnostics;
- }
- function getExpressionDiagnostics(scope, ast, query, context) {
- if (context === void 0) { context = {}; }
- var analyzer = new AstType(scope, query, context);
- analyzer.getDiagnostics(ast);
- return analyzer.diagnostics;
- }
- function getReferences(info) {
- var result = [];
- function processReferences(references) {
- var e_1, _a;
- var _loop_1 = function (reference) {
- var type = undefined;
- if (reference.value) {
- type = info.query.getTypeSymbol(tokenReference(reference.value));
- }
- result.push({
- name: reference.name,
- kind: 'reference',
- type: type || info.query.getBuiltinType(BuiltinType$1.Any),
- get definition() { return getDefinitionOf(info, reference); }
- });
- };
- try {
- for (var references_1 = __values(references), references_1_1 = references_1.next(); !references_1_1.done; references_1_1 = references_1.next()) {
- var reference = references_1_1.value;
- _loop_1(reference);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (references_1_1 && !references_1_1.done && (_a = references_1.return)) _a.call(references_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- var visitor = new /** @class */ (function (_super) {
- __extends(class_1, _super);
- function class_1() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- class_1.prototype.visitEmbeddedTemplate = function (ast, context) {
- _super.prototype.visitEmbeddedTemplate.call(this, ast, context);
- processReferences(ast.references);
- };
- class_1.prototype.visitElement = function (ast, context) {
- _super.prototype.visitElement.call(this, ast, context);
- processReferences(ast.references);
- };
- return class_1;
- }(RecursiveTemplateAstVisitor));
- templateVisitAll(visitor, info.templateAst);
- return result;
- }
- function getDefinitionOf(info, ast) {
- if (info.fileName) {
- var templateOffset = info.offset;
- return [{
- fileName: info.fileName,
- span: {
- start: ast.sourceSpan.start.offset + templateOffset,
- end: ast.sourceSpan.end.offset + templateOffset
- }
- }];
- }
- }
- function getVarDeclarations(info, path) {
- var e_2, _a;
- var result = [];
- var current = path.tail;
- while (current) {
- if (current instanceof EmbeddedTemplateAst) {
- var _loop_2 = function (variable) {
- var name = variable.name;
- // Find the first directive with a context.
- var context = current.directives.map(function (d) { return info.query.getTemplateContext(d.directive.type.reference); })
- .find(function (c) { return !!c; });
- // Determine the type of the context field referenced by variable.value.
- var type = undefined;
- if (context) {
- var value = context.get(variable.value);
- if (value) {
- type = value.type;
- var kind = info.query.getTypeKind(type);
- if (kind === BuiltinType$1.Any || kind == BuiltinType$1.Unbound) {
- // The any type is not very useful here. For special cases, such as ngFor, we can do
- // better.
- type = refinedVariableType(type, info, current);
- }
- }
- }
- if (!type) {
- type = info.query.getBuiltinType(BuiltinType$1.Any);
- }
- result.push({
- name: name,
- kind: 'variable', type: type, get definition() { return getDefinitionOf(info, variable); }
- });
- };
- try {
- for (var _b = __values(current.variables), _c = _b.next(); !_c.done; _c = _b.next()) {
- var variable = _c.value;
- _loop_2(variable);
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- current = path.parentOf(current);
- }
- return result;
- }
- function refinedVariableType(type, info, templateElement) {
- // Special case the ngFor directive
- var ngForDirective = templateElement.directives.find(function (d) {
- var name = identifierName(d.directive.type);
- return name == 'NgFor' || name == 'NgForOf';
- });
- if (ngForDirective) {
- var ngForOfBinding = ngForDirective.inputs.find(function (i) { return i.directiveName == 'ngForOf'; });
- if (ngForOfBinding) {
- var bindingType = new AstType(info.members, info.query, {}).getType(ngForOfBinding.value);
- if (bindingType) {
- var result = info.query.getElementType(bindingType);
- if (result) {
- return result;
- }
- }
- }
- }
- // We can't do better, return any
- return info.query.getBuiltinType(BuiltinType$1.Any);
- }
- function getEventDeclaration(info, includeEvent) {
- var result = [];
- if (includeEvent) {
- // TODO: Determine the type of the event parameter based on the Observable<T> or EventEmitter<T>
- // of the event.
- result = [{ name: '$event', kind: 'variable', type: info.query.getBuiltinType(BuiltinType$1.Any) }];
- }
- return result;
- }
- function getExpressionScope(info, path, includeEvent) {
- var result = info.members;
- var references = getReferences(info);
- var variables = getVarDeclarations(info, path);
- var events = getEventDeclaration(info, includeEvent);
- if (references.length || variables.length || events.length) {
- var referenceTable = info.query.createSymbolTable(references);
- var variableTable = info.query.createSymbolTable(variables);
- var eventsTable = info.query.createSymbolTable(events);
- result = info.query.mergeSymbolTable([result, referenceTable, variableTable, eventsTable]);
- }
- return result;
- }
- var ExpressionDiagnosticsVisitor = /** @class */ (function (_super) {
- __extends(ExpressionDiagnosticsVisitor, _super);
- function ExpressionDiagnosticsVisitor(info, getExpressionScope) {
- var _this = _super.call(this) || this;
- _this.info = info;
- _this.getExpressionScope = getExpressionScope;
- _this.diagnostics = [];
- _this.path = new AstPath([]);
- return _this;
- }
- ExpressionDiagnosticsVisitor.prototype.visitDirective = function (ast, context) {
- // Override the default child visitor to ignore the host properties of a directive.
- if (ast.inputs && ast.inputs.length) {
- templateVisitAll(this, ast.inputs, context);
- }
- };
- ExpressionDiagnosticsVisitor.prototype.visitBoundText = function (ast) {
- this.push(ast);
- this.diagnoseExpression(ast.value, ast.sourceSpan.start.offset, false);
- this.pop();
- };
- ExpressionDiagnosticsVisitor.prototype.visitDirectiveProperty = function (ast) {
- this.push(ast);
- this.diagnoseExpression(ast.value, this.attributeValueLocation(ast), false);
- this.pop();
- };
- ExpressionDiagnosticsVisitor.prototype.visitElementProperty = function (ast) {
- this.push(ast);
- this.diagnoseExpression(ast.value, this.attributeValueLocation(ast), false);
- this.pop();
- };
- ExpressionDiagnosticsVisitor.prototype.visitEvent = function (ast) {
- this.push(ast);
- this.diagnoseExpression(ast.handler, this.attributeValueLocation(ast), true);
- this.pop();
- };
- ExpressionDiagnosticsVisitor.prototype.visitVariable = function (ast) {
- var directive = this.directiveSummary;
- if (directive && ast.value) {
- var context = this.info.query.getTemplateContext(directive.type.reference);
- if (context && !context.has(ast.value)) {
- if (ast.value === '$implicit') {
- this.reportError('The template context does not have an implicit value', spanOf$1(ast.sourceSpan));
- }
- else {
- this.reportError("The template context does not defined a member called '" + ast.value + "'", spanOf$1(ast.sourceSpan));
- }
- }
- }
- };
- ExpressionDiagnosticsVisitor.prototype.visitElement = function (ast, context) {
- this.push(ast);
- _super.prototype.visitElement.call(this, ast, context);
- this.pop();
- };
- ExpressionDiagnosticsVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
- var previousDirectiveSummary = this.directiveSummary;
- this.push(ast);
- // Find directive that references this template
- this.directiveSummary =
- ast.directives.map(function (d) { return d.directive; }).find(function (d) { return hasTemplateReference(d.type); });
- // Process children
- _super.prototype.visitEmbeddedTemplate.call(this, ast, context);
- this.pop();
- this.directiveSummary = previousDirectiveSummary;
- };
- ExpressionDiagnosticsVisitor.prototype.attributeValueLocation = function (ast) {
- var path = findNode(this.info.htmlAst, ast.sourceSpan.start.offset);
- var last = path.tail;
- if (last instanceof Attribute && last.valueSpan) {
- return last.valueSpan.start.offset;
- }
- return ast.sourceSpan.start.offset;
- };
- ExpressionDiagnosticsVisitor.prototype.diagnoseExpression = function (ast, offset, includeEvent) {
- var _this = this;
- var _a;
- var scope = this.getExpressionScope(this.path, includeEvent);
- (_a = this.diagnostics).push.apply(_a, __spread(getExpressionDiagnostics(scope, ast, this.info.query, {
- event: includeEvent
- }).map(function (d) { return ({
- span: offsetSpan(d.ast.span, offset + _this.info.offset),
- kind: d.kind,
- message: d.message
- }); })));
- };
- ExpressionDiagnosticsVisitor.prototype.push = function (ast) { this.path.push(ast); };
- ExpressionDiagnosticsVisitor.prototype.pop = function () { this.path.pop(); };
- ExpressionDiagnosticsVisitor.prototype.reportError = function (message, span) {
- if (span) {
- this.diagnostics.push({ span: offsetSpan(span, this.info.offset), kind: DiagnosticKind.Error, message: message });
- }
- };
- ExpressionDiagnosticsVisitor.prototype.reportWarning = function (message, span) {
- this.diagnostics.push({ span: offsetSpan(span, this.info.offset), kind: DiagnosticKind.Warning, message: message });
- };
- return ExpressionDiagnosticsVisitor;
- }(RecursiveTemplateAstVisitor));
- function hasTemplateReference(type) {
- var e_3, _a;
- if (type.diDeps) {
- try {
- for (var _b = __values(type.diDeps), _c = _b.next(); !_c.done; _c = _b.next()) {
- var diDep = _c.value;
- if (diDep.token && diDep.token.identifier &&
- identifierName(diDep.token.identifier) == 'TemplateRef')
- return true;
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_3) throw e_3.error; }
- }
- }
- return false;
- }
- function offsetSpan(span, amount) {
- return { start: span.start + amount, end: span.end + amount };
- }
- function spanOf$1(sourceSpan) {
- return { start: sourceSpan.start.offset, end: sourceSpan.end.offset };
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Converts a `string` version into an array of numbers
- * @example
- * toNumbers('2.0.1'); // returns [2, 0, 1]
- */
- function toNumbers(value) {
- return value.split('.').map(Number);
- }
- /**
- * Compares two arrays of positive numbers with lexicographical order in mind.
- *
- * However - unlike lexicographical order - for arrays of different length we consider:
- * [1, 2, 3] = [1, 2, 3, 0] instead of [1, 2, 3] < [1, 2, 3, 0]
- *
- * @param a The 'left hand' array in the comparison test
- * @param b The 'right hand' in the comparison test
- * @returns {-1|0|1} The comparison result: 1 if a is greater, -1 if b is greater, 0 is the two
- * arrays are equals
- */
- function compareNumbers(a, b) {
- var max = Math.max(a.length, b.length);
- var min = Math.min(a.length, b.length);
- for (var i = 0; i < min; i++) {
- if (a[i] > b[i])
- return 1;
- if (a[i] < b[i])
- return -1;
- }
- if (min !== max) {
- var longestArray = a.length === max ? a : b;
- // The result to return in case the to arrays are considered different (1 if a is greater,
- // -1 if b is greater)
- var comparisonResult = a.length === max ? 1 : -1;
- // Check that at least one of the remaining elements is greater than 0 to consider that the two
- // arrays are different (e.g. [1, 0] and [1] are considered the same but not [1, 0, 1] and [1])
- for (var i = min; i < max; i++) {
- if (longestArray[i] > 0) {
- return comparisonResult;
- }
- }
- }
- return 0;
- }
- /**
- * Checks if a TypeScript version is:
- * - greater or equal than the provided `low` version,
- * - lower or equal than an optional `high` version.
- *
- * @param version The TypeScript version
- * @param low The minimum version
- * @param high The maximum version
- */
- function isVersionBetween(version, low, high) {
- var tsNumbers = toNumbers(version);
- if (high !== undefined) {
- return compareNumbers(toNumbers(low), tsNumbers) <= 0 &&
- compareNumbers(toNumbers(high), tsNumbers) >= 0;
- }
- return compareNumbers(toNumbers(low), tsNumbers) <= 0;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // In TypeScript 2.1 these flags moved
- // These helpers work for both 2.0 and 2.1.
- var isPrivate = ts.ModifierFlags ?
- (function (node) {
- return !!(ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Private);
- }) :
- (function (node) { return !!(node.flags & ts.NodeFlags.Private); });
- var isReferenceType = ts.ObjectFlags ?
- (function (type) {
- return !!(type.flags & ts.TypeFlags.Object &&
- type.objectFlags & ts.ObjectFlags.Reference);
- }) :
- (function (type) { return !!(type.flags & ts.TypeFlags.Reference); });
- function getSymbolQuery(program, checker, source, fetchPipes) {
- return new TypeScriptSymbolQuery(program, checker, source, fetchPipes);
- }
- function getClassMembersFromDeclaration(program, checker, source, declaration) {
- var type = checker.getTypeAtLocation(declaration);
- return new TypeWrapper(type, { node: source, program: program, checker: checker }).members();
- }
- function getPipesTable(source, program, checker, pipes) {
- return new PipesTable(pipes, { program: program, checker: checker, node: source });
- }
- var TypeScriptSymbolQuery = /** @class */ (function () {
- function TypeScriptSymbolQuery(program, checker, source, fetchPipes) {
- this.program = program;
- this.checker = checker;
- this.source = source;
- this.fetchPipes = fetchPipes;
- this.typeCache = new Map();
- }
- TypeScriptSymbolQuery.prototype.getTypeKind = function (symbol) { return typeKindOf(this.getTsTypeOf(symbol)); };
- TypeScriptSymbolQuery.prototype.getBuiltinType = function (kind) {
- var result = this.typeCache.get(kind);
- if (!result) {
- var type = getBuiltinTypeFromTs(kind, { checker: this.checker, node: this.source, program: this.program });
- result =
- new TypeWrapper(type, { program: this.program, checker: this.checker, node: this.source });
- this.typeCache.set(kind, result);
- }
- return result;
- };
- TypeScriptSymbolQuery.prototype.getTypeUnion = function () {
- var types = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- types[_i] = arguments[_i];
- }
- // No API exists so return any if the types are not all the same type.
- var result = undefined;
- if (types.length) {
- result = types[0];
- for (var i = 1; i < types.length; i++) {
- if (types[i] != result) {
- result = undefined;
- break;
- }
- }
- }
- return result || this.getBuiltinType(BuiltinType$1.Any);
- };
- TypeScriptSymbolQuery.prototype.getArrayType = function (type) { return this.getBuiltinType(BuiltinType$1.Any); };
- TypeScriptSymbolQuery.prototype.getElementType = function (type) {
- if (type instanceof TypeWrapper) {
- var elementType = getTypeParameterOf(type.tsType, 'Array');
- if (elementType) {
- return new TypeWrapper(elementType, type.context);
- }
- }
- };
- TypeScriptSymbolQuery.prototype.getNonNullableType = function (symbol) {
- if (symbol instanceof TypeWrapper && (typeof this.checker.getNonNullableType == 'function')) {
- var tsType = symbol.tsType;
- var nonNullableType = this.checker.getNonNullableType(tsType);
- if (nonNullableType != tsType) {
- return new TypeWrapper(nonNullableType, symbol.context);
- }
- else if (nonNullableType == tsType) {
- return symbol;
- }
- }
- return this.getBuiltinType(BuiltinType$1.Any);
- };
- TypeScriptSymbolQuery.prototype.getPipes = function () {
- var result = this.pipesCache;
- if (!result) {
- result = this.pipesCache = this.fetchPipes();
- }
- return result;
- };
- TypeScriptSymbolQuery.prototype.getTemplateContext = function (type) {
- var context = { node: this.source, program: this.program, checker: this.checker };
- var typeSymbol = findClassSymbolInContext(type, context);
- if (typeSymbol) {
- var contextType = this.getTemplateRefContextType(typeSymbol);
- if (contextType)
- return new SymbolWrapper(contextType, context).members();
- }
- };
- TypeScriptSymbolQuery.prototype.getTypeSymbol = function (type) {
- var context = { node: this.source, program: this.program, checker: this.checker };
- var typeSymbol = findClassSymbolInContext(type, context);
- return typeSymbol && new SymbolWrapper(typeSymbol, context);
- };
- TypeScriptSymbolQuery.prototype.createSymbolTable = function (symbols) {
- var result = new MapSymbolTable();
- result.addAll(symbols.map(function (s) { return new DeclaredSymbol(s); }));
- return result;
- };
- TypeScriptSymbolQuery.prototype.mergeSymbolTable = function (symbolTables) {
- var e_1, _a;
- var result = new MapSymbolTable();
- try {
- for (var symbolTables_1 = __values(symbolTables), symbolTables_1_1 = symbolTables_1.next(); !symbolTables_1_1.done; symbolTables_1_1 = symbolTables_1.next()) {
- var symbolTable = symbolTables_1_1.value;
- result.addAll(symbolTable.values());
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (symbolTables_1_1 && !symbolTables_1_1.done && (_a = symbolTables_1.return)) _a.call(symbolTables_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return result;
- };
- TypeScriptSymbolQuery.prototype.getSpanAt = function (line, column) {
- return spanAt(this.source, line, column);
- };
- TypeScriptSymbolQuery.prototype.getTemplateRefContextType = function (typeSymbol) {
- var e_2, _a;
- var type = this.checker.getTypeOfSymbolAtLocation(typeSymbol, this.source);
- var constructor = type.symbol && type.symbol.members &&
- getFromSymbolTable(type.symbol.members, '__constructor');
- if (constructor) {
- var constructorDeclaration = constructor.declarations[0];
- try {
- for (var _b = __values(constructorDeclaration.parameters), _c = _b.next(); !_c.done; _c = _b.next()) {
- var parameter = _c.value;
- var type_1 = this.checker.getTypeAtLocation(parameter.type);
- if (type_1.symbol.name == 'TemplateRef' && isReferenceType(type_1)) {
- var typeReference = type_1;
- if (typeReference.typeArguments && typeReference.typeArguments.length === 1) {
- return typeReference.typeArguments[0].symbol;
- }
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- };
- TypeScriptSymbolQuery.prototype.getTsTypeOf = function (symbol) {
- var type = this.getTypeWrapper(symbol);
- return type && type.tsType;
- };
- TypeScriptSymbolQuery.prototype.getTypeWrapper = function (symbol) {
- var type = undefined;
- if (symbol instanceof TypeWrapper) {
- type = symbol;
- }
- else if (symbol.type instanceof TypeWrapper) {
- type = symbol.type;
- }
- return type;
- };
- return TypeScriptSymbolQuery;
- }());
- function typeCallable(type) {
- var signatures = type.getCallSignatures();
- return signatures && signatures.length != 0;
- }
- function signaturesOf(type, context) {
- return type.getCallSignatures().map(function (s) { return new SignatureWrapper(s, context); });
- }
- function selectSignature(type, context, types) {
- // TODO: Do a better job of selecting the right signature.
- var signatures = type.getCallSignatures();
- return signatures.length ? new SignatureWrapper(signatures[0], context) : undefined;
- }
- var TypeWrapper = /** @class */ (function () {
- function TypeWrapper(tsType, context) {
- this.tsType = tsType;
- this.context = context;
- this.kind = 'type';
- this.language = 'typescript';
- this.type = undefined;
- this.container = undefined;
- this.public = true;
- if (!tsType) {
- throw Error('Internal: null type');
- }
- }
- Object.defineProperty(TypeWrapper.prototype, "name", {
- get: function () {
- var symbol = this.tsType.symbol;
- return (symbol && symbol.name) || '<anonymous>';
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(TypeWrapper.prototype, "callable", {
- get: function () { return typeCallable(this.tsType); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(TypeWrapper.prototype, "nullable", {
- get: function () {
- return this.context.checker.getNonNullableType(this.tsType) != this.tsType;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(TypeWrapper.prototype, "definition", {
- get: function () {
- var symbol = this.tsType.getSymbol();
- return symbol ? definitionFromTsSymbol(symbol) : undefined;
- },
- enumerable: true,
- configurable: true
- });
- TypeWrapper.prototype.members = function () {
- return new SymbolTableWrapper(this.tsType.getProperties(), this.context);
- };
- TypeWrapper.prototype.signatures = function () { return signaturesOf(this.tsType, this.context); };
- TypeWrapper.prototype.selectSignature = function (types) {
- return selectSignature(this.tsType, this.context, types);
- };
- TypeWrapper.prototype.indexed = function (argument) { return undefined; };
- return TypeWrapper;
- }());
- var SymbolWrapper = /** @class */ (function () {
- function SymbolWrapper(symbol, context) {
- this.context = context;
- this.nullable = false;
- this.language = 'typescript';
- this.symbol = symbol && context && (symbol.flags & ts.SymbolFlags.Alias) ?
- context.checker.getAliasedSymbol(symbol) :
- symbol;
- }
- Object.defineProperty(SymbolWrapper.prototype, "name", {
- get: function () { return this.symbol.name; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(SymbolWrapper.prototype, "kind", {
- get: function () { return this.callable ? 'method' : 'property'; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(SymbolWrapper.prototype, "type", {
- get: function () { return new TypeWrapper(this.tsType, this.context); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(SymbolWrapper.prototype, "container", {
- get: function () { return getContainerOf(this.symbol, this.context); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(SymbolWrapper.prototype, "public", {
- get: function () {
- // Symbols that are not explicitly made private are public.
- return !isSymbolPrivate(this.symbol);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(SymbolWrapper.prototype, "callable", {
- get: function () { return typeCallable(this.tsType); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(SymbolWrapper.prototype, "definition", {
- get: function () { return definitionFromTsSymbol(this.symbol); },
- enumerable: true,
- configurable: true
- });
- SymbolWrapper.prototype.members = function () {
- if (!this._members) {
- if ((this.symbol.flags & (ts.SymbolFlags.Class | ts.SymbolFlags.Interface)) != 0) {
- var declaredType = this.context.checker.getDeclaredTypeOfSymbol(this.symbol);
- var typeWrapper = new TypeWrapper(declaredType, this.context);
- this._members = typeWrapper.members();
- }
- else {
- this._members = new SymbolTableWrapper(this.symbol.members, this.context);
- }
- }
- return this._members;
- };
- SymbolWrapper.prototype.signatures = function () { return signaturesOf(this.tsType, this.context); };
- SymbolWrapper.prototype.selectSignature = function (types) {
- return selectSignature(this.tsType, this.context, types);
- };
- SymbolWrapper.prototype.indexed = function (argument) { return undefined; };
- Object.defineProperty(SymbolWrapper.prototype, "tsType", {
- get: function () {
- var type = this._tsType;
- if (!type) {
- type = this._tsType =
- this.context.checker.getTypeOfSymbolAtLocation(this.symbol, this.context.node);
- }
- return type;
- },
- enumerable: true,
- configurable: true
- });
- return SymbolWrapper;
- }());
- var DeclaredSymbol = /** @class */ (function () {
- function DeclaredSymbol(declaration) {
- this.declaration = declaration;
- this.language = 'ng-template';
- this.nullable = false;
- this.public = true;
- }
- Object.defineProperty(DeclaredSymbol.prototype, "name", {
- get: function () { return this.declaration.name; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DeclaredSymbol.prototype, "kind", {
- get: function () { return this.declaration.kind; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DeclaredSymbol.prototype, "container", {
- get: function () { return undefined; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DeclaredSymbol.prototype, "type", {
- get: function () { return this.declaration.type; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DeclaredSymbol.prototype, "callable", {
- get: function () { return this.declaration.type.callable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DeclaredSymbol.prototype, "definition", {
- get: function () { return this.declaration.definition; },
- enumerable: true,
- configurable: true
- });
- DeclaredSymbol.prototype.members = function () { return this.declaration.type.members(); };
- DeclaredSymbol.prototype.signatures = function () { return this.declaration.type.signatures(); };
- DeclaredSymbol.prototype.selectSignature = function (types) {
- return this.declaration.type.selectSignature(types);
- };
- DeclaredSymbol.prototype.indexed = function (argument) { return undefined; };
- return DeclaredSymbol;
- }());
- var SignatureWrapper = /** @class */ (function () {
- function SignatureWrapper(signature, context) {
- this.signature = signature;
- this.context = context;
- }
- Object.defineProperty(SignatureWrapper.prototype, "arguments", {
- get: function () {
- return new SymbolTableWrapper(this.signature.getParameters(), this.context);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(SignatureWrapper.prototype, "result", {
- get: function () { return new TypeWrapper(this.signature.getReturnType(), this.context); },
- enumerable: true,
- configurable: true
- });
- return SignatureWrapper;
- }());
- var SignatureResultOverride = /** @class */ (function () {
- function SignatureResultOverride(signature, resultType) {
- this.signature = signature;
- this.resultType = resultType;
- }
- Object.defineProperty(SignatureResultOverride.prototype, "arguments", {
- get: function () { return this.signature.arguments; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(SignatureResultOverride.prototype, "result", {
- get: function () { return this.resultType; },
- enumerable: true,
- configurable: true
- });
- return SignatureResultOverride;
- }());
- /**
- * Indicates the lower bound TypeScript version supporting `SymbolTable` as an ES6 `Map`.
- * For lower versions, `SymbolTable` is implemented as a dictionary
- */
- var MIN_TS_VERSION_SUPPORTING_MAP = '2.2';
- var toSymbolTableFactory = function (tsVersion) { return function (symbols) {
- var e_3, _a, e_4, _b;
- if (isVersionBetween(tsVersion, MIN_TS_VERSION_SUPPORTING_MAP)) {
- // ∀ Typescript version >= 2.2, `SymbolTable` is implemented as an ES6 `Map`
- var result_1 = new Map();
- try {
- for (var symbols_1 = __values(symbols), symbols_1_1 = symbols_1.next(); !symbols_1_1.done; symbols_1_1 = symbols_1.next()) {
- var symbol = symbols_1_1.value;
- result_1.set(symbol.name, symbol);
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (symbols_1_1 && !symbols_1_1.done && (_a = symbols_1.return)) _a.call(symbols_1);
- }
- finally { if (e_3) throw e_3.error; }
- }
- // First, tell the compiler that `result` is of type `any`. Then, use a second type assertion
- // to `ts.SymbolTable`.
- // Otherwise, `Map<string, ts.Symbol>` and `ts.SymbolTable` will be considered as incompatible
- // types by the compiler
- return result_1;
- }
- // ∀ Typescript version < 2.2, `SymbolTable` is implemented as a dictionary
- var result = {};
- try {
- for (var symbols_2 = __values(symbols), symbols_2_1 = symbols_2.next(); !symbols_2_1.done; symbols_2_1 = symbols_2.next()) {
- var symbol = symbols_2_1.value;
- result[symbol.name] = symbol;
- }
- }
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
- finally {
- try {
- if (symbols_2_1 && !symbols_2_1.done && (_b = symbols_2.return)) _b.call(symbols_2);
- }
- finally { if (e_4) throw e_4.error; }
- }
- return result;
- }; };
- function toSymbols(symbolTable) {
- if (!symbolTable)
- return [];
- var table = symbolTable;
- if (typeof table.values === 'function') {
- return Array.from(table.values());
- }
- var result = [];
- var own = typeof table.hasOwnProperty === 'function' ?
- function (name) { return table.hasOwnProperty(name); } :
- function (name) { return !!table[name]; };
- for (var name in table) {
- if (own(name)) {
- result.push(table[name]);
- }
- }
- return result;
- }
- var SymbolTableWrapper = /** @class */ (function () {
- function SymbolTableWrapper(symbols, context) {
- this.context = context;
- symbols = symbols || [];
- if (Array.isArray(symbols)) {
- this.symbols = symbols;
- var toSymbolTable = toSymbolTableFactory(ts.version);
- this.symbolTable = toSymbolTable(symbols);
- }
- else {
- this.symbols = toSymbols(symbols);
- this.symbolTable = symbols;
- }
- }
- Object.defineProperty(SymbolTableWrapper.prototype, "size", {
- get: function () { return this.symbols.length; },
- enumerable: true,
- configurable: true
- });
- SymbolTableWrapper.prototype.get = function (key) {
- var symbol = getFromSymbolTable(this.symbolTable, key);
- return symbol ? new SymbolWrapper(symbol, this.context) : undefined;
- };
- SymbolTableWrapper.prototype.has = function (key) {
- var table = this.symbolTable;
- return (typeof table.has === 'function') ? table.has(key) : table[key] != null;
- };
- SymbolTableWrapper.prototype.values = function () {
- var _this = this;
- return this.symbols.map(function (s) { return new SymbolWrapper(s, _this.context); });
- };
- return SymbolTableWrapper;
- }());
- var MapSymbolTable = /** @class */ (function () {
- function MapSymbolTable() {
- this.map = new Map();
- this._values = [];
- }
- Object.defineProperty(MapSymbolTable.prototype, "size", {
- get: function () { return this.map.size; },
- enumerable: true,
- configurable: true
- });
- MapSymbolTable.prototype.get = function (key) { return this.map.get(key); };
- MapSymbolTable.prototype.add = function (symbol) {
- if (this.map.has(symbol.name)) {
- var previous = this.map.get(symbol.name);
- this._values[this._values.indexOf(previous)] = symbol;
- }
- this.map.set(symbol.name, symbol);
- this._values.push(symbol);
- };
- MapSymbolTable.prototype.addAll = function (symbols) {
- var e_5, _a;
- try {
- for (var symbols_3 = __values(symbols), symbols_3_1 = symbols_3.next(); !symbols_3_1.done; symbols_3_1 = symbols_3.next()) {
- var symbol = symbols_3_1.value;
- this.add(symbol);
- }
- }
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
- finally {
- try {
- if (symbols_3_1 && !symbols_3_1.done && (_a = symbols_3.return)) _a.call(symbols_3);
- }
- finally { if (e_5) throw e_5.error; }
- }
- };
- MapSymbolTable.prototype.has = function (key) { return this.map.has(key); };
- MapSymbolTable.prototype.values = function () {
- // Switch to this.map.values once iterables are supported by the target language.
- return this._values;
- };
- return MapSymbolTable;
- }());
- var PipesTable = /** @class */ (function () {
- function PipesTable(pipes, context) {
- this.pipes = pipes;
- this.context = context;
- }
- Object.defineProperty(PipesTable.prototype, "size", {
- get: function () { return this.pipes.length; },
- enumerable: true,
- configurable: true
- });
- PipesTable.prototype.get = function (key) {
- var pipe = this.pipes.find(function (pipe) { return pipe.name == key; });
- if (pipe) {
- return new PipeSymbol(pipe, this.context);
- }
- };
- PipesTable.prototype.has = function (key) { return this.pipes.find(function (pipe) { return pipe.name == key; }) != null; };
- PipesTable.prototype.values = function () {
- var _this = this;
- return this.pipes.map(function (pipe) { return new PipeSymbol(pipe, _this.context); });
- };
- return PipesTable;
- }());
- // This matches .d.ts files that look like ".../<package-name>/<package-name>.d.ts",
- var INDEX_PATTERN = /[\\/]([^\\/]+)[\\/]\1\.d\.ts$/;
- var PipeSymbol = /** @class */ (function () {
- function PipeSymbol(pipe, context) {
- this.pipe = pipe;
- this.context = context;
- this.kind = 'pipe';
- this.language = 'typescript';
- this.container = undefined;
- this.callable = true;
- this.nullable = false;
- this.public = true;
- }
- Object.defineProperty(PipeSymbol.prototype, "name", {
- get: function () { return this.pipe.name; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(PipeSymbol.prototype, "type", {
- get: function () { return new TypeWrapper(this.tsType, this.context); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(PipeSymbol.prototype, "definition", {
- get: function () {
- var symbol = this.tsType.getSymbol();
- return symbol ? definitionFromTsSymbol(symbol) : undefined;
- },
- enumerable: true,
- configurable: true
- });
- PipeSymbol.prototype.members = function () { return EmptyTable.instance; };
- PipeSymbol.prototype.signatures = function () { return signaturesOf(this.tsType, this.context); };
- PipeSymbol.prototype.selectSignature = function (types) {
- var signature = selectSignature(this.tsType, this.context, types);
- if (types.length == 1) {
- var parameterType = types[0];
- if (parameterType instanceof TypeWrapper) {
- var resultType = undefined;
- switch (this.name) {
- case 'async':
- switch (parameterType.name) {
- case 'Observable':
- case 'Promise':
- case 'EventEmitter':
- resultType = getTypeParameterOf(parameterType.tsType, parameterType.name);
- break;
- default:
- resultType = getBuiltinTypeFromTs(BuiltinType$1.Any, this.context);
- break;
- }
- break;
- case 'slice':
- resultType = getTypeParameterOf(parameterType.tsType, 'Array');
- break;
- }
- if (resultType) {
- signature = new SignatureResultOverride(signature, new TypeWrapper(resultType, parameterType.context));
- }
- }
- }
- return signature;
- };
- PipeSymbol.prototype.indexed = function (argument) { return undefined; };
- Object.defineProperty(PipeSymbol.prototype, "tsType", {
- get: function () {
- var type = this._tsType;
- if (!type) {
- var classSymbol = this.findClassSymbol(this.pipe.type.reference);
- if (classSymbol) {
- type = this._tsType = this.findTransformMethodType(classSymbol);
- }
- if (!type) {
- type = this._tsType = getBuiltinTypeFromTs(BuiltinType$1.Any, this.context);
- }
- }
- return type;
- },
- enumerable: true,
- configurable: true
- });
- PipeSymbol.prototype.findClassSymbol = function (type) {
- return findClassSymbolInContext(type, this.context);
- };
- PipeSymbol.prototype.findTransformMethodType = function (classSymbol) {
- var classType = this.context.checker.getDeclaredTypeOfSymbol(classSymbol);
- if (classType) {
- var transform = classType.getProperty('transform');
- if (transform) {
- return this.context.checker.getTypeOfSymbolAtLocation(transform, this.context.node);
- }
- }
- };
- return PipeSymbol;
- }());
- function findClassSymbolInContext(type, context) {
- var sourceFile = context.program.getSourceFile(type.filePath);
- if (!sourceFile) {
- // This handles a case where an <packageName>/index.d.ts and a <packageName>/<packageName>.d.ts
- // are in the same directory. If we are looking for <packageName>/<packageName> and didn't
- // find it, look for <packageName>/index.d.ts as the program might have found that instead.
- var p = type.filePath;
- var m = p.match(INDEX_PATTERN);
- if (m) {
- var indexVersion = path.join(path.dirname(p), 'index.d.ts');
- sourceFile = context.program.getSourceFile(indexVersion);
- }
- }
- if (sourceFile) {
- var moduleSymbol = sourceFile.module || sourceFile.symbol;
- var exports_1 = context.checker.getExportsOfModule(moduleSymbol);
- return (exports_1 || []).find(function (symbol) { return symbol.name == type.name; });
- }
- }
- var EmptyTable = /** @class */ (function () {
- function EmptyTable() {
- this.size = 0;
- }
- EmptyTable.prototype.get = function (key) { return undefined; };
- EmptyTable.prototype.has = function (key) { return false; };
- EmptyTable.prototype.values = function () { return []; };
- EmptyTable.instance = new EmptyTable();
- return EmptyTable;
- }());
- function isSymbolPrivate(s) {
- return !!s.valueDeclaration && isPrivate(s.valueDeclaration);
- }
- function getBuiltinTypeFromTs(kind, context) {
- var type;
- var checker = context.checker;
- var node = context.node;
- switch (kind) {
- case BuiltinType$1.Any:
- type = checker.getTypeAtLocation(setParents({
- kind: ts.SyntaxKind.AsExpression,
- expression: { kind: ts.SyntaxKind.TrueKeyword },
- type: { kind: ts.SyntaxKind.AnyKeyword }
- }, node));
- break;
- case BuiltinType$1.Boolean:
- type =
- checker.getTypeAtLocation(setParents({ kind: ts.SyntaxKind.TrueKeyword }, node));
- break;
- case BuiltinType$1.Null:
- type =
- checker.getTypeAtLocation(setParents({ kind: ts.SyntaxKind.NullKeyword }, node));
- break;
- case BuiltinType$1.Number:
- var numeric = {
- kind: ts.SyntaxKind.NumericLiteral,
- text: node.getText(),
- };
- setParents({ kind: ts.SyntaxKind.ExpressionStatement, expression: numeric }, node);
- type = checker.getTypeAtLocation(numeric);
- break;
- case BuiltinType$1.String:
- type = checker.getTypeAtLocation(setParents({
- kind: ts.SyntaxKind.NoSubstitutionTemplateLiteral,
- text: node.getText(),
- }, node));
- break;
- case BuiltinType$1.Undefined:
- type = checker.getTypeAtLocation(setParents({
- kind: ts.SyntaxKind.VoidExpression,
- expression: { kind: ts.SyntaxKind.NumericLiteral }
- }, node));
- break;
- default:
- throw new Error("Internal error, unhandled literal kind " + kind + ":" + BuiltinType$1[kind]);
- }
- return type;
- }
- function setParents(node, parent) {
- node.parent = parent;
- ts.forEachChild(node, function (child) { return setParents(child, node); });
- return node;
- }
- function spanAt(sourceFile, line, column) {
- if (line != null && column != null) {
- var position_1 = ts.getPositionOfLineAndCharacter(sourceFile, line, column);
- var findChild = function findChild(node) {
- if (node.kind > ts.SyntaxKind.LastToken && node.pos <= position_1 && node.end > position_1) {
- var betterNode = ts.forEachChild(node, findChild);
- return betterNode || node;
- }
- };
- var node = ts.forEachChild(sourceFile, findChild);
- if (node) {
- return { start: node.getStart(), end: node.getEnd() };
- }
- }
- }
- function definitionFromTsSymbol(symbol) {
- var declarations = symbol.declarations;
- if (declarations) {
- return declarations.map(function (declaration) {
- var sourceFile = declaration.getSourceFile();
- return {
- fileName: sourceFile.fileName,
- span: { start: declaration.getStart(), end: declaration.getEnd() }
- };
- });
- }
- }
- function parentDeclarationOf(node) {
- while (node) {
- switch (node.kind) {
- case ts.SyntaxKind.ClassDeclaration:
- case ts.SyntaxKind.InterfaceDeclaration:
- return node;
- case ts.SyntaxKind.SourceFile:
- return undefined;
- }
- node = node.parent;
- }
- }
- function getContainerOf(symbol, context) {
- var e_6, _a;
- if (symbol.getFlags() & ts.SymbolFlags.ClassMember && symbol.declarations) {
- try {
- for (var _b = __values(symbol.declarations), _c = _b.next(); !_c.done; _c = _b.next()) {
- var declaration = _c.value;
- var parent = parentDeclarationOf(declaration);
- if (parent) {
- var type = context.checker.getTypeAtLocation(parent);
- if (type) {
- return new TypeWrapper(type, context);
- }
- }
- }
- }
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_6) throw e_6.error; }
- }
- }
- }
- function getTypeParameterOf(type, name) {
- if (type && type.symbol && type.symbol.name == name) {
- var typeArguments = type.typeArguments;
- if (typeArguments && typeArguments.length <= 1) {
- return typeArguments[0];
- }
- }
- }
- function typeKindOf(type) {
- var e_7, _a;
- if (type) {
- if (type.flags & ts.TypeFlags.Any) {
- return BuiltinType$1.Any;
- }
- else if (type.flags & (ts.TypeFlags.String | ts.TypeFlags.StringLike | ts.TypeFlags.StringLiteral)) {
- return BuiltinType$1.String;
- }
- else if (type.flags & (ts.TypeFlags.Number | ts.TypeFlags.NumberLike)) {
- return BuiltinType$1.Number;
- }
- else if (type.flags & (ts.TypeFlags.Undefined)) {
- return BuiltinType$1.Undefined;
- }
- else if (type.flags & (ts.TypeFlags.Null)) {
- return BuiltinType$1.Null;
- }
- else if (type.flags & ts.TypeFlags.Union) {
- // If all the constituent types of a union are the same kind, it is also that kind.
- var candidate = null;
- var unionType_1 = type;
- if (unionType_1.types.length > 0) {
- candidate = typeKindOf(unionType_1.types[0]);
- try {
- for (var _b = __values(unionType_1.types), _c = _b.next(); !_c.done; _c = _b.next()) {
- var subType = _c.value;
- if (candidate != typeKindOf(subType)) {
- return BuiltinType$1.Other;
- }
- }
- }
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_7) throw e_7.error; }
- }
- }
- if (candidate != null) {
- return candidate;
- }
- }
- else if (type.flags & ts.TypeFlags.TypeParameter) {
- return BuiltinType$1.Unbound;
- }
- }
- return BuiltinType$1.Other;
- }
- function getFromSymbolTable(symbolTable, key) {
- var table = symbolTable;
- var symbol;
- if (typeof table.get === 'function') {
- // TS 2.2 uses a Map
- symbol = table.get(key);
- }
- else {
- // TS pre-2.2 uses an object
- symbol = table[key];
- }
- return symbol;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // Metadata Schema
- // If you make a backwards incompatible change to the schema, increment the METADTA_VERSION number.
- // If you make a backwards compatible change to the metadata (such as adding an option field) then
- // leave METADATA_VERSION the same. If possible, supply as many versions of the metadata that can
- // represent the semantics of the file in an array. For example, when generating a version 2 file,
- // if version 1 can accurately represent the metadata, generate both version 1 and version 2 in
- // an array.
- var METADATA_VERSION = 4;
- function isClassMetadata(value) {
- return value && value.__symbolic === 'class';
- }
- function isMethodMetadata(value) {
- return value && (value.__symbolic === 'constructor' || value.__symbolic === 'method');
- }
- function isConstructorMetadata(value) {
- return value && value.__symbolic === 'constructor';
- }
- function isFunctionMetadata(value) {
- return value && value.__symbolic === 'function';
- }
- function isMetadataSymbolicExpression(value) {
- if (value) {
- switch (value.__symbolic) {
- case 'binary':
- case 'call':
- case 'index':
- case 'new':
- case 'pre':
- case 'reference':
- case 'select':
- case 'spread':
- case 'if':
- return true;
- }
- }
- return false;
- }
- function isMetadataGlobalReferenceExpression(value) {
- return value && value.name && !value.module && isMetadataSymbolicReferenceExpression(value);
- }
- function isMetadataModuleReferenceExpression(value) {
- return value && value.module && !value.name && !value.default &&
- isMetadataSymbolicReferenceExpression(value);
- }
- function isMetadataImportedSymbolReferenceExpression(value) {
- return value && value.module && !!value.name && isMetadataSymbolicReferenceExpression(value);
- }
- function isMetadataImportDefaultReference(value) {
- return value && value.module && value.default && isMetadataSymbolicReferenceExpression(value);
- }
- function isMetadataSymbolicReferenceExpression(value) {
- return value && value.__symbolic === 'reference';
- }
- function isMetadataSymbolicSelectExpression(value) {
- return value && value.__symbolic === 'select';
- }
- function isMetadataSymbolicSpreadExpression(value) {
- return value && value.__symbolic === 'spread';
- }
- function isMetadataError$1(value) {
- return value && value.__symbolic === 'error';
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // In TypeScript 2.1 the spread element kind was renamed.
- var spreadElementSyntaxKind = ts.SyntaxKind.SpreadElement || ts.SyntaxKind.SpreadElementExpression;
- function isMethodCallOf(callExpression, memberName) {
- var expression = callExpression.expression;
- if (expression.kind === ts.SyntaxKind.PropertyAccessExpression) {
- var propertyAccessExpression = expression;
- var name = propertyAccessExpression.name;
- if (name.kind == ts.SyntaxKind.Identifier) {
- return name.text === memberName;
- }
- }
- return false;
- }
- function isCallOf(callExpression, ident) {
- var expression = callExpression.expression;
- if (expression.kind === ts.SyntaxKind.Identifier) {
- var identifier = expression;
- return identifier.text === ident;
- }
- return false;
- }
- /* @internal */
- function recordMapEntry(entry, node, nodeMap, sourceFile) {
- if (!nodeMap.has(entry)) {
- nodeMap.set(entry, node);
- if (node && (isMetadataImportedSymbolReferenceExpression(entry) ||
- isMetadataImportDefaultReference(entry)) &&
- entry.line == null) {
- var info = sourceInfo(node, sourceFile);
- if (info.line != null)
- entry.line = info.line;
- if (info.character != null)
- entry.character = info.character;
- }
- }
- return entry;
- }
- /**
- * ts.forEachChild stops iterating children when the callback return a truthy value.
- * This method inverts this to implement an `every` style iterator. It will return
- * true if every call to `cb` returns `true`.
- */
- function everyNodeChild(node, cb) {
- return !ts.forEachChild(node, function (node) { return !cb(node); });
- }
- function isPrimitive$1(value) {
- return Object(value) !== value;
- }
- function isDefined$1(obj) {
- return obj !== undefined;
- }
- function getSourceFileOfNode(node) {
- while (node && node.kind != ts.SyntaxKind.SourceFile) {
- node = node.parent;
- }
- return node;
- }
- /* @internal */
- function sourceInfo(node, sourceFile) {
- if (node) {
- sourceFile = sourceFile || getSourceFileOfNode(node);
- if (sourceFile) {
- return ts.getLineAndCharacterOfPosition(sourceFile, node.getStart(sourceFile));
- }
- }
- return {};
- }
- /* @internal */
- function errorSymbol(message, node, context, sourceFile) {
- var result = __assign({ __symbolic: 'error', message: message }, sourceInfo(node, sourceFile));
- if (context) {
- result.context = context;
- }
- return result;
- }
- /**
- * Produce a symbolic representation of an expression folding values into their final value when
- * possible.
- */
- var Evaluator = /** @class */ (function () {
- function Evaluator(symbols, nodeMap, options, recordExport) {
- if (options === void 0) { options = {}; }
- this.symbols = symbols;
- this.nodeMap = nodeMap;
- this.options = options;
- this.recordExport = recordExport;
- }
- Evaluator.prototype.nameOf = function (node) {
- if (node && node.kind == ts.SyntaxKind.Identifier) {
- return node.text;
- }
- var result = node && this.evaluateNode(node);
- if (isMetadataError$1(result) || typeof result === 'string') {
- return result;
- }
- else {
- return errorSymbol('Name expected', node, { received: (node && node.getText()) || '<missing>' });
- }
- };
- /**
- * Returns true if the expression represented by `node` can be folded into a literal expression.
- *
- * For example, a literal is always foldable. This means that literal expressions such as `1.2`
- * `"Some value"` `true` `false` are foldable.
- *
- * - An object literal is foldable if all the properties in the literal are foldable.
- * - An array literal is foldable if all the elements are foldable.
- * - A call is foldable if it is a call to a Array.prototype.concat or a call to CONST_EXPR.
- * - A property access is foldable if the object is foldable.
- * - A array index is foldable if index expression is foldable and the array is foldable.
- * - Binary operator expressions are foldable if the left and right expressions are foldable and
- * it is one of '+', '-', '*', '/', '%', '||', and '&&'.
- * - An identifier is foldable if a value can be found for its symbol in the evaluator symbol
- * table.
- */
- Evaluator.prototype.isFoldable = function (node) {
- return this.isFoldableWorker(node, new Map());
- };
- Evaluator.prototype.isFoldableWorker = function (node, folding) {
- var _this = this;
- if (node) {
- switch (node.kind) {
- case ts.SyntaxKind.ObjectLiteralExpression:
- return everyNodeChild(node, function (child) {
- if (child.kind === ts.SyntaxKind.PropertyAssignment) {
- var propertyAssignment = child;
- return _this.isFoldableWorker(propertyAssignment.initializer, folding);
- }
- return false;
- });
- case ts.SyntaxKind.ArrayLiteralExpression:
- return everyNodeChild(node, function (child) { return _this.isFoldableWorker(child, folding); });
- case ts.SyntaxKind.CallExpression:
- var callExpression = node;
- // We can fold a <array>.concat(<v>).
- if (isMethodCallOf(callExpression, 'concat') &&
- arrayOrEmpty(callExpression.arguments).length === 1) {
- var arrayNode = callExpression.expression.expression;
- if (this.isFoldableWorker(arrayNode, folding) &&
- this.isFoldableWorker(callExpression.arguments[0], folding)) {
- // It needs to be an array.
- var arrayValue = this.evaluateNode(arrayNode);
- if (arrayValue && Array.isArray(arrayValue)) {
- return true;
- }
- }
- }
- // We can fold a call to CONST_EXPR
- if (isCallOf(callExpression, 'CONST_EXPR') &&
- arrayOrEmpty(callExpression.arguments).length === 1)
- return this.isFoldableWorker(callExpression.arguments[0], folding);
- return false;
- case ts.SyntaxKind.NoSubstitutionTemplateLiteral:
- case ts.SyntaxKind.StringLiteral:
- case ts.SyntaxKind.NumericLiteral:
- case ts.SyntaxKind.NullKeyword:
- case ts.SyntaxKind.TrueKeyword:
- case ts.SyntaxKind.FalseKeyword:
- case ts.SyntaxKind.TemplateHead:
- case ts.SyntaxKind.TemplateMiddle:
- case ts.SyntaxKind.TemplateTail:
- return true;
- case ts.SyntaxKind.ParenthesizedExpression:
- var parenthesizedExpression = node;
- return this.isFoldableWorker(parenthesizedExpression.expression, folding);
- case ts.SyntaxKind.BinaryExpression:
- var binaryExpression = node;
- switch (binaryExpression.operatorToken.kind) {
- case ts.SyntaxKind.PlusToken:
- case ts.SyntaxKind.MinusToken:
- case ts.SyntaxKind.AsteriskToken:
- case ts.SyntaxKind.SlashToken:
- case ts.SyntaxKind.PercentToken:
- case ts.SyntaxKind.AmpersandAmpersandToken:
- case ts.SyntaxKind.BarBarToken:
- return this.isFoldableWorker(binaryExpression.left, folding) &&
- this.isFoldableWorker(binaryExpression.right, folding);
- default:
- return false;
- }
- case ts.SyntaxKind.PropertyAccessExpression:
- var propertyAccessExpression = node;
- return this.isFoldableWorker(propertyAccessExpression.expression, folding);
- case ts.SyntaxKind.ElementAccessExpression:
- var elementAccessExpression = node;
- return this.isFoldableWorker(elementAccessExpression.expression, folding) &&
- this.isFoldableWorker(elementAccessExpression.argumentExpression, folding);
- case ts.SyntaxKind.Identifier:
- var identifier = node;
- var reference = this.symbols.resolve(identifier.text);
- if (reference !== undefined && isPrimitive$1(reference)) {
- return true;
- }
- break;
- case ts.SyntaxKind.TemplateExpression:
- var templateExpression = node;
- return templateExpression.templateSpans.every(function (span) { return _this.isFoldableWorker(span.expression, folding); });
- }
- }
- return false;
- };
- /**
- * Produce a JSON serialiable object representing `node`. The foldable values in the expression
- * tree are folded. For example, a node representing `1 + 2` is folded into `3`.
- */
- Evaluator.prototype.evaluateNode = function (node, preferReference) {
- var _this = this;
- var t = this;
- var error;
- function recordEntry(entry, node) {
- if (t.options.substituteExpression) {
- var newEntry = t.options.substituteExpression(entry, node);
- if (t.recordExport && newEntry != entry && isMetadataGlobalReferenceExpression(newEntry)) {
- t.recordExport(newEntry.name, entry);
- }
- entry = newEntry;
- }
- return recordMapEntry(entry, node, t.nodeMap);
- }
- function isFoldableError(value) {
- return !t.options.verboseInvalidExpression && isMetadataError$1(value);
- }
- var resolveName = function (name, preferReference) {
- var reference = _this.symbols.resolve(name, preferReference);
- if (reference === undefined) {
- // Encode as a global reference. StaticReflector will check the reference.
- return recordEntry({ __symbolic: 'reference', name: name }, node);
- }
- if (reference && isMetadataSymbolicReferenceExpression(reference)) {
- return recordEntry(__assign({}, reference), node);
- }
- return reference;
- };
- switch (node.kind) {
- case ts.SyntaxKind.ObjectLiteralExpression:
- var obj_1 = {};
- var quoted_1 = [];
- ts.forEachChild(node, function (child) {
- switch (child.kind) {
- case ts.SyntaxKind.ShorthandPropertyAssignment:
- case ts.SyntaxKind.PropertyAssignment:
- var assignment = child;
- if (assignment.name.kind == ts.SyntaxKind.StringLiteral) {
- var name_1 = assignment.name.text;
- quoted_1.push(name_1);
- }
- var propertyName = _this.nameOf(assignment.name);
- if (isFoldableError(propertyName)) {
- error = propertyName;
- return true;
- }
- var propertyValue = isPropertyAssignment(assignment) ?
- _this.evaluateNode(assignment.initializer, /* preferReference */ true) :
- resolveName(propertyName, /* preferReference */ true);
- if (isFoldableError(propertyValue)) {
- error = propertyValue;
- return true; // Stop the forEachChild.
- }
- else {
- obj_1[propertyName] = isPropertyAssignment(assignment) ?
- recordEntry(propertyValue, assignment.initializer) :
- propertyValue;
- }
- }
- });
- if (error)
- return error;
- if (this.options.quotedNames && quoted_1.length) {
- obj_1['$quoted$'] = quoted_1;
- }
- return recordEntry(obj_1, node);
- case ts.SyntaxKind.ArrayLiteralExpression:
- var arr_1 = [];
- ts.forEachChild(node, function (child) {
- var e_1, _a;
- var value = _this.evaluateNode(child, /* preferReference */ true);
- // Check for error
- if (isFoldableError(value)) {
- error = value;
- return true; // Stop the forEachChild.
- }
- // Handle spread expressions
- if (isMetadataSymbolicSpreadExpression(value)) {
- if (Array.isArray(value.expression)) {
- try {
- for (var _b = __values(value.expression), _c = _b.next(); !_c.done; _c = _b.next()) {
- var spreadValue = _c.value;
- arr_1.push(spreadValue);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return;
- }
- }
- arr_1.push(value);
- });
- if (error)
- return error;
- return recordEntry(arr_1, node);
- case spreadElementSyntaxKind:
- var spreadExpression = this.evaluateNode(node.expression);
- return recordEntry({ __symbolic: 'spread', expression: spreadExpression }, node);
- case ts.SyntaxKind.CallExpression:
- var callExpression = node;
- if (isCallOf(callExpression, 'forwardRef') &&
- arrayOrEmpty(callExpression.arguments).length === 1) {
- var firstArgument = callExpression.arguments[0];
- if (firstArgument.kind == ts.SyntaxKind.ArrowFunction) {
- var arrowFunction = firstArgument;
- return recordEntry(this.evaluateNode(arrowFunction.body), node);
- }
- }
- var args = arrayOrEmpty(callExpression.arguments).map(function (arg) { return _this.evaluateNode(arg); });
- if (this.isFoldable(callExpression)) {
- if (isMethodCallOf(callExpression, 'concat')) {
- var arrayValue = this.evaluateNode(callExpression.expression.expression);
- if (isFoldableError(arrayValue))
- return arrayValue;
- return arrayValue.concat(args[0]);
- }
- }
- // Always fold a CONST_EXPR even if the argument is not foldable.
- if (isCallOf(callExpression, 'CONST_EXPR') &&
- arrayOrEmpty(callExpression.arguments).length === 1) {
- return recordEntry(args[0], node);
- }
- var expression = this.evaluateNode(callExpression.expression);
- if (isFoldableError(expression)) {
- return recordEntry(expression, node);
- }
- var result = { __symbolic: 'call', expression: expression };
- if (args && args.length) {
- result.arguments = args;
- }
- return recordEntry(result, node);
- case ts.SyntaxKind.NewExpression:
- var newExpression = node;
- var newArgs = arrayOrEmpty(newExpression.arguments).map(function (arg) { return _this.evaluateNode(arg); });
- var newTarget = this.evaluateNode(newExpression.expression);
- if (isMetadataError$1(newTarget)) {
- return recordEntry(newTarget, node);
- }
- var call = { __symbolic: 'new', expression: newTarget };
- if (newArgs.length) {
- call.arguments = newArgs;
- }
- return recordEntry(call, node);
- case ts.SyntaxKind.PropertyAccessExpression: {
- var propertyAccessExpression = node;
- var expression_1 = this.evaluateNode(propertyAccessExpression.expression);
- if (isFoldableError(expression_1)) {
- return recordEntry(expression_1, node);
- }
- var member = this.nameOf(propertyAccessExpression.name);
- if (isFoldableError(member)) {
- return recordEntry(member, node);
- }
- if (expression_1 && this.isFoldable(propertyAccessExpression.expression))
- return expression_1[member];
- if (isMetadataModuleReferenceExpression(expression_1)) {
- // A select into a module reference and be converted into a reference to the symbol
- // in the module
- return recordEntry({ __symbolic: 'reference', module: expression_1.module, name: member }, node);
- }
- return recordEntry({ __symbolic: 'select', expression: expression_1, member: member }, node);
- }
- case ts.SyntaxKind.ElementAccessExpression: {
- var elementAccessExpression = node;
- var expression_2 = this.evaluateNode(elementAccessExpression.expression);
- if (isFoldableError(expression_2)) {
- return recordEntry(expression_2, node);
- }
- if (!elementAccessExpression.argumentExpression) {
- return recordEntry(errorSymbol('Expression form not supported', node), node);
- }
- var index = this.evaluateNode(elementAccessExpression.argumentExpression);
- if (isFoldableError(expression_2)) {
- return recordEntry(expression_2, node);
- }
- if (this.isFoldable(elementAccessExpression.expression) &&
- this.isFoldable(elementAccessExpression.argumentExpression))
- return expression_2[index];
- return recordEntry({ __symbolic: 'index', expression: expression_2, index: index }, node);
- }
- case ts.SyntaxKind.Identifier:
- var identifier = node;
- var name = identifier.text;
- return resolveName(name, preferReference);
- case ts.SyntaxKind.TypeReference:
- var typeReferenceNode = node;
- var typeNameNode_1 = typeReferenceNode.typeName;
- var getReference = function (node) {
- if (typeNameNode_1.kind === ts.SyntaxKind.QualifiedName) {
- var qualifiedName = node;
- var left_1 = _this.evaluateNode(qualifiedName.left);
- if (isMetadataModuleReferenceExpression(left_1)) {
- return recordEntry({
- __symbolic: 'reference',
- module: left_1.module,
- name: qualifiedName.right.text
- }, node);
- }
- // Record a type reference to a declared type as a select.
- return { __symbolic: 'select', expression: left_1, member: qualifiedName.right.text };
- }
- else {
- var identifier_1 = typeNameNode_1;
- var symbol = _this.symbols.resolve(identifier_1.text);
- if (isFoldableError(symbol) || isMetadataSymbolicReferenceExpression(symbol)) {
- return recordEntry(symbol, node);
- }
- return recordEntry(errorSymbol('Could not resolve type', node, { typeName: identifier_1.text }), node);
- }
- };
- var typeReference = getReference(typeNameNode_1);
- if (isFoldableError(typeReference)) {
- return recordEntry(typeReference, node);
- }
- if (!isMetadataModuleReferenceExpression(typeReference) &&
- typeReferenceNode.typeArguments && typeReferenceNode.typeArguments.length) {
- var args_1 = typeReferenceNode.typeArguments.map(function (element) { return _this.evaluateNode(element); });
- // TODO: Remove typecast when upgraded to 2.0 as it will be correctly inferred.
- // Some versions of 1.9 do not infer this correctly.
- typeReference.arguments = args_1;
- }
- return recordEntry(typeReference, node);
- case ts.SyntaxKind.UnionType:
- var unionType_1 = node;
- // Remove null and undefined from the list of unions.
- var references = unionType_1.types
- .filter(function (n) { return n.kind != ts.SyntaxKind.NullKeyword &&
- n.kind != ts.SyntaxKind.UndefinedKeyword; })
- .map(function (n) { return _this.evaluateNode(n); });
- // The remmaining reference must be the same. If two have type arguments consider them
- // different even if the type arguments are the same.
- var candidate = null;
- for (var i = 0; i < references.length; i++) {
- var reference = references[i];
- if (isMetadataSymbolicReferenceExpression(reference)) {
- if (candidate) {
- if (reference.name == candidate.name &&
- reference.module == candidate.module && !reference.arguments) {
- candidate = reference;
- }
- }
- else {
- candidate = reference;
- }
- }
- else {
- return reference;
- }
- }
- if (candidate)
- return candidate;
- break;
- case ts.SyntaxKind.NoSubstitutionTemplateLiteral:
- case ts.SyntaxKind.StringLiteral:
- case ts.SyntaxKind.TemplateHead:
- case ts.SyntaxKind.TemplateTail:
- case ts.SyntaxKind.TemplateMiddle:
- return node.text;
- case ts.SyntaxKind.NumericLiteral:
- return parseFloat(node.text);
- case ts.SyntaxKind.AnyKeyword:
- return recordEntry({ __symbolic: 'reference', name: 'any' }, node);
- case ts.SyntaxKind.StringKeyword:
- return recordEntry({ __symbolic: 'reference', name: 'string' }, node);
- case ts.SyntaxKind.NumberKeyword:
- return recordEntry({ __symbolic: 'reference', name: 'number' }, node);
- case ts.SyntaxKind.BooleanKeyword:
- return recordEntry({ __symbolic: 'reference', name: 'boolean' }, node);
- case ts.SyntaxKind.ArrayType:
- var arrayTypeNode = node;
- return recordEntry({
- __symbolic: 'reference',
- name: 'Array',
- arguments: [this.evaluateNode(arrayTypeNode.elementType)]
- }, node);
- case ts.SyntaxKind.NullKeyword:
- return null;
- case ts.SyntaxKind.TrueKeyword:
- return true;
- case ts.SyntaxKind.FalseKeyword:
- return false;
- case ts.SyntaxKind.ParenthesizedExpression:
- var parenthesizedExpression = node;
- return this.evaluateNode(parenthesizedExpression.expression);
- case ts.SyntaxKind.TypeAssertionExpression:
- var typeAssertion = node;
- return this.evaluateNode(typeAssertion.expression);
- case ts.SyntaxKind.PrefixUnaryExpression:
- var prefixUnaryExpression = node;
- var operand = this.evaluateNode(prefixUnaryExpression.operand);
- if (isDefined$1(operand) && isPrimitive$1(operand)) {
- switch (prefixUnaryExpression.operator) {
- case ts.SyntaxKind.PlusToken:
- return +operand;
- case ts.SyntaxKind.MinusToken:
- return -operand;
- case ts.SyntaxKind.TildeToken:
- return ~operand;
- case ts.SyntaxKind.ExclamationToken:
- return !operand;
- }
- }
- var operatorText = void 0;
- switch (prefixUnaryExpression.operator) {
- case ts.SyntaxKind.PlusToken:
- operatorText = '+';
- break;
- case ts.SyntaxKind.MinusToken:
- operatorText = '-';
- break;
- case ts.SyntaxKind.TildeToken:
- operatorText = '~';
- break;
- case ts.SyntaxKind.ExclamationToken:
- operatorText = '!';
- break;
- default:
- return undefined;
- }
- return recordEntry({ __symbolic: 'pre', operator: operatorText, operand: operand }, node);
- case ts.SyntaxKind.BinaryExpression:
- var binaryExpression = node;
- var left = this.evaluateNode(binaryExpression.left);
- var right = this.evaluateNode(binaryExpression.right);
- if (isDefined$1(left) && isDefined$1(right)) {
- if (isPrimitive$1(left) && isPrimitive$1(right))
- switch (binaryExpression.operatorToken.kind) {
- case ts.SyntaxKind.BarBarToken:
- return left || right;
- case ts.SyntaxKind.AmpersandAmpersandToken:
- return left && right;
- case ts.SyntaxKind.AmpersandToken:
- return left & right;
- case ts.SyntaxKind.BarToken:
- return left | right;
- case ts.SyntaxKind.CaretToken:
- return left ^ right;
- case ts.SyntaxKind.EqualsEqualsToken:
- return left == right;
- case ts.SyntaxKind.ExclamationEqualsToken:
- return left != right;
- case ts.SyntaxKind.EqualsEqualsEqualsToken:
- return left === right;
- case ts.SyntaxKind.ExclamationEqualsEqualsToken:
- return left !== right;
- case ts.SyntaxKind.LessThanToken:
- return left < right;
- case ts.SyntaxKind.GreaterThanToken:
- return left > right;
- case ts.SyntaxKind.LessThanEqualsToken:
- return left <= right;
- case ts.SyntaxKind.GreaterThanEqualsToken:
- return left >= right;
- case ts.SyntaxKind.LessThanLessThanToken:
- return left << right;
- case ts.SyntaxKind.GreaterThanGreaterThanToken:
- return left >> right;
- case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken:
- return left >>> right;
- case ts.SyntaxKind.PlusToken:
- return left + right;
- case ts.SyntaxKind.MinusToken:
- return left - right;
- case ts.SyntaxKind.AsteriskToken:
- return left * right;
- case ts.SyntaxKind.SlashToken:
- return left / right;
- case ts.SyntaxKind.PercentToken:
- return left % right;
- }
- return recordEntry({
- __symbolic: 'binop',
- operator: binaryExpression.operatorToken.getText(),
- left: left,
- right: right
- }, node);
- }
- break;
- case ts.SyntaxKind.ConditionalExpression:
- var conditionalExpression = node;
- var condition = this.evaluateNode(conditionalExpression.condition);
- var thenExpression = this.evaluateNode(conditionalExpression.whenTrue);
- var elseExpression = this.evaluateNode(conditionalExpression.whenFalse);
- if (isPrimitive$1(condition)) {
- return condition ? thenExpression : elseExpression;
- }
- return recordEntry({ __symbolic: 'if', condition: condition, thenExpression: thenExpression, elseExpression: elseExpression }, node);
- case ts.SyntaxKind.FunctionExpression:
- case ts.SyntaxKind.ArrowFunction:
- return recordEntry(errorSymbol('Lambda not supported', node), node);
- case ts.SyntaxKind.TaggedTemplateExpression:
- return recordEntry(errorSymbol('Tagged template expressions are not supported in metadata', node), node);
- case ts.SyntaxKind.TemplateExpression:
- var templateExpression = node;
- if (this.isFoldable(node)) {
- return templateExpression.templateSpans.reduce(function (previous, current) { return previous + _this.evaluateNode(current.expression) +
- _this.evaluateNode(current.literal); }, this.evaluateNode(templateExpression.head));
- }
- else {
- return templateExpression.templateSpans.reduce(function (previous, current) {
- var expr = _this.evaluateNode(current.expression);
- var literal = _this.evaluateNode(current.literal);
- if (isFoldableError(expr))
- return expr;
- if (isFoldableError(literal))
- return literal;
- if (typeof previous === 'string' && typeof expr === 'string' &&
- typeof literal === 'string') {
- return previous + expr + literal;
- }
- var result = expr;
- if (previous !== '') {
- result = { __symbolic: 'binop', operator: '+', left: previous, right: expr };
- }
- if (literal != '') {
- result = { __symbolic: 'binop', operator: '+', left: result, right: literal };
- }
- return result;
- }, this.evaluateNode(templateExpression.head));
- }
- case ts.SyntaxKind.AsExpression:
- var asExpression = node;
- return this.evaluateNode(asExpression.expression);
- case ts.SyntaxKind.ClassExpression:
- return { __symbolic: 'class' };
- }
- return recordEntry(errorSymbol('Expression form not supported', node), node);
- };
- return Evaluator;
- }());
- function isPropertyAssignment(node) {
- return node.kind == ts.SyntaxKind.PropertyAssignment;
- }
- var empty = ts.createNodeArray();
- function arrayOrEmpty(v) {
- return v || empty;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var Symbols = /** @class */ (function () {
- function Symbols(sourceFile) {
- this.sourceFile = sourceFile;
- this.references = new Map();
- }
- Symbols.prototype.resolve = function (name, preferReference) {
- return (preferReference && this.references.get(name)) || this.symbols.get(name);
- };
- Symbols.prototype.define = function (name, value) { this.symbols.set(name, value); };
- Symbols.prototype.defineReference = function (name, value) {
- this.references.set(name, value);
- };
- Symbols.prototype.has = function (name) { return this.symbols.has(name); };
- Object.defineProperty(Symbols.prototype, "symbols", {
- get: function () {
- var result = this._symbols;
- if (!result) {
- result = this._symbols = new Map();
- populateBuiltins(result);
- this.buildImports();
- }
- return result;
- },
- enumerable: true,
- configurable: true
- });
- Symbols.prototype.buildImports = function () {
- var _this = this;
- var symbols = this._symbols;
- // Collect the imported symbols into this.symbols
- var stripQuotes = function (s) { return s.replace(/^['"]|['"]$/g, ''); };
- var visit = function (node) {
- var e_1, _a;
- switch (node.kind) {
- case ts.SyntaxKind.ImportEqualsDeclaration:
- var importEqualsDeclaration = node;
- if (importEqualsDeclaration.moduleReference.kind ===
- ts.SyntaxKind.ExternalModuleReference) {
- var externalReference = importEqualsDeclaration.moduleReference;
- if (externalReference.expression) {
- // An `import <identifier> = require(<module-specifier>);
- if (!externalReference.expression.parent) {
- // The `parent` field of a node is set by the TypeScript binder (run as
- // part of the type checker). Setting it here allows us to call `getText()`
- // even if the `SourceFile` was not type checked (which looks for `SourceFile`
- // in the parent chain). This doesn't damage the node as the binder unconditionally
- // sets the parent.
- externalReference.expression.parent = externalReference;
- externalReference.parent = _this.sourceFile;
- }
- var from_1 = stripQuotes(externalReference.expression.getText());
- symbols.set(importEqualsDeclaration.name.text, { __symbolic: 'reference', module: from_1 });
- break;
- }
- }
- symbols.set(importEqualsDeclaration.name.text, { __symbolic: 'error', message: "Unsupported import syntax" });
- break;
- case ts.SyntaxKind.ImportDeclaration:
- var importDecl = node;
- if (!importDecl.importClause) {
- // An `import <module-specifier>` clause which does not bring symbols into scope.
- break;
- }
- if (!importDecl.moduleSpecifier.parent) {
- // See note above in the `ImportEqualDeclaration` case.
- importDecl.moduleSpecifier.parent = importDecl;
- importDecl.parent = _this.sourceFile;
- }
- var from = stripQuotes(importDecl.moduleSpecifier.getText());
- if (importDecl.importClause.name) {
- // An `import <identifier> form <module-specifier>` clause. Record the default symbol.
- symbols.set(importDecl.importClause.name.text, { __symbolic: 'reference', module: from, default: true });
- }
- var bindings = importDecl.importClause.namedBindings;
- if (bindings) {
- switch (bindings.kind) {
- case ts.SyntaxKind.NamedImports:
- try {
- // An `import { [<identifier> [, <identifier>] } from <module-specifier>` clause
- for (var _b = __values(bindings.elements), _c = _b.next(); !_c.done; _c = _b.next()) {
- var binding = _c.value;
- symbols.set(binding.name.text, {
- __symbolic: 'reference',
- module: from,
- name: binding.propertyName ? binding.propertyName.text : binding.name.text
- });
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- break;
- case ts.SyntaxKind.NamespaceImport:
- // An `input * as <identifier> from <module-specifier>` clause.
- symbols.set(bindings.name.text, { __symbolic: 'reference', module: from });
- break;
- }
- }
- break;
- }
- ts.forEachChild(node, visit);
- };
- if (this.sourceFile) {
- ts.forEachChild(this.sourceFile, visit);
- }
- };
- return Symbols;
- }());
- function populateBuiltins(symbols) {
- // From lib.core.d.ts (all "define const")
- ['Object', 'Function', 'String', 'Number', 'Array', 'Boolean', 'Map', 'NaN', 'Infinity', 'Math',
- 'Date', 'RegExp', 'Error', 'Error', 'EvalError', 'RangeError', 'ReferenceError', 'SyntaxError',
- 'TypeError', 'URIError', 'JSON', 'ArrayBuffer', 'DataView', 'Int8Array', 'Uint8Array',
- 'Uint8ClampedArray', 'Uint16Array', 'Int16Array', 'Int32Array', 'Uint32Array', 'Float32Array',
- 'Float64Array']
- .forEach(function (name) { return symbols.set(name, { __symbolic: 'reference', name: name }); });
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var isStatic = function (node) {
- return ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Static;
- };
- /**
- * Collect decorator metadata from a TypeScript module.
- */
- var MetadataCollector = /** @class */ (function () {
- function MetadataCollector(options) {
- if (options === void 0) { options = {}; }
- this.options = options;
- }
- /**
- * Returns a JSON.stringify friendly form describing the decorators of the exported classes from
- * the source file that is expected to correspond to a module.
- */
- MetadataCollector.prototype.getMetadata = function (sourceFile, strict, substituteExpression) {
- var _this = this;
- if (strict === void 0) { strict = false; }
- var locals = new Symbols(sourceFile);
- var nodeMap = new Map();
- var composedSubstituter = substituteExpression && this.options.substituteExpression ?
- function (value, node) {
- return _this.options.substituteExpression(substituteExpression(value, node), node);
- } :
- substituteExpression;
- var evaluatorOptions = substituteExpression ? __assign({}, this.options, { substituteExpression: composedSubstituter }) :
- this.options;
- var metadata;
- var evaluator = new Evaluator(locals, nodeMap, evaluatorOptions, function (name, value) {
- if (!metadata)
- metadata = {};
- metadata[name] = value;
- });
- var exports = undefined;
- function objFromDecorator(decoratorNode) {
- return evaluator.evaluateNode(decoratorNode.expression);
- }
- function recordEntry(entry, node) {
- if (composedSubstituter) {
- entry = composedSubstituter(entry, node);
- }
- return recordMapEntry(entry, node, nodeMap, sourceFile);
- }
- function errorSym(message, node, context) {
- return errorSymbol(message, node, context, sourceFile);
- }
- function maybeGetSimpleFunction(functionDeclaration) {
- if (functionDeclaration.name && functionDeclaration.name.kind == ts.SyntaxKind.Identifier) {
- var nameNode = functionDeclaration.name;
- var functionName = nameNode.text;
- var functionBody = functionDeclaration.body;
- if (functionBody && functionBody.statements.length == 1) {
- var statement = functionBody.statements[0];
- if (statement.kind === ts.SyntaxKind.ReturnStatement) {
- var returnStatement = statement;
- if (returnStatement.expression) {
- var func = {
- __symbolic: 'function',
- parameters: namesOf(functionDeclaration.parameters),
- value: evaluator.evaluateNode(returnStatement.expression)
- };
- if (functionDeclaration.parameters.some(function (p) { return p.initializer != null; })) {
- func.defaults = functionDeclaration.parameters.map(function (p) { return p.initializer && evaluator.evaluateNode(p.initializer); });
- }
- return recordEntry({ func: func, name: functionName }, functionDeclaration);
- }
- }
- }
- }
- }
- function classMetadataOf(classDeclaration) {
- var e_1, _a, e_2, _b;
- var result = { __symbolic: 'class' };
- function getDecorators(decorators) {
- if (decorators && decorators.length)
- return decorators.map(function (decorator) { return objFromDecorator(decorator); });
- return undefined;
- }
- function referenceFrom(node) {
- var result = evaluator.evaluateNode(node);
- if (isMetadataError$1(result) || isMetadataSymbolicReferenceExpression(result) ||
- isMetadataSymbolicSelectExpression(result)) {
- return result;
- }
- else {
- return errorSym('Symbol reference expected', node);
- }
- }
- // Add class parents
- if (classDeclaration.heritageClauses) {
- classDeclaration.heritageClauses.forEach(function (hc) {
- if (hc.token === ts.SyntaxKind.ExtendsKeyword && hc.types) {
- hc.types.forEach(function (type) { return result.extends = referenceFrom(type.expression); });
- }
- });
- }
- // Add arity if the type is generic
- var typeParameters = classDeclaration.typeParameters;
- if (typeParameters && typeParameters.length) {
- result.arity = typeParameters.length;
- }
- // Add class decorators
- if (classDeclaration.decorators) {
- result.decorators = getDecorators(classDeclaration.decorators);
- }
- // member decorators
- var members = null;
- function recordMember(name, metadata) {
- if (!members)
- members = {};
- var data = members.hasOwnProperty(name) ? members[name] : [];
- data.push(metadata);
- members[name] = data;
- }
- // static member
- var statics = null;
- function recordStaticMember(name, value) {
- if (!statics)
- statics = {};
- statics[name] = value;
- }
- try {
- for (var _c = __values(classDeclaration.members), _d = _c.next(); !_d.done; _d = _c.next()) {
- var member = _d.value;
- var isConstructor = false;
- switch (member.kind) {
- case ts.SyntaxKind.Constructor:
- case ts.SyntaxKind.MethodDeclaration:
- isConstructor = member.kind === ts.SyntaxKind.Constructor;
- var method = member;
- if (isStatic(method)) {
- var maybeFunc = maybeGetSimpleFunction(method);
- if (maybeFunc) {
- recordStaticMember(maybeFunc.name, maybeFunc.func);
- }
- continue;
- }
- var methodDecorators = getDecorators(method.decorators);
- var parameters = method.parameters;
- var parameterDecoratorData = [];
- var parametersData = [];
- var hasDecoratorData = false;
- var hasParameterData = false;
- try {
- for (var parameters_1 = __values(parameters), parameters_1_1 = parameters_1.next(); !parameters_1_1.done; parameters_1_1 = parameters_1.next()) {
- var parameter = parameters_1_1.value;
- var parameterData = getDecorators(parameter.decorators);
- parameterDecoratorData.push(parameterData);
- hasDecoratorData = hasDecoratorData || !!parameterData;
- if (isConstructor) {
- if (parameter.type) {
- parametersData.push(referenceFrom(parameter.type));
- }
- else {
- parametersData.push(null);
- }
- hasParameterData = true;
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (parameters_1_1 && !parameters_1_1.done && (_b = parameters_1.return)) _b.call(parameters_1);
- }
- finally { if (e_2) throw e_2.error; }
- }
- var data = { __symbolic: isConstructor ? 'constructor' : 'method' };
- var name = isConstructor ? '__ctor__' : evaluator.nameOf(member.name);
- if (methodDecorators) {
- data.decorators = methodDecorators;
- }
- if (hasDecoratorData) {
- data.parameterDecorators = parameterDecoratorData;
- }
- if (hasParameterData) {
- data.parameters = parametersData;
- }
- if (!isMetadataError$1(name)) {
- recordMember(name, data);
- }
- break;
- case ts.SyntaxKind.PropertyDeclaration:
- case ts.SyntaxKind.GetAccessor:
- case ts.SyntaxKind.SetAccessor:
- var property = member;
- if (isStatic(property)) {
- var name_1 = evaluator.nameOf(property.name);
- if (!isMetadataError$1(name_1)) {
- if (property.initializer) {
- var value = evaluator.evaluateNode(property.initializer);
- recordStaticMember(name_1, value);
- }
- else {
- recordStaticMember(name_1, errorSym('Variable not initialized', property.name));
- }
- }
- }
- var propertyDecorators = getDecorators(property.decorators);
- if (propertyDecorators) {
- var name_2 = evaluator.nameOf(property.name);
- if (!isMetadataError$1(name_2)) {
- recordMember(name_2, { __symbolic: 'property', decorators: propertyDecorators });
- }
- }
- break;
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_1) throw e_1.error; }
- }
- if (members) {
- result.members = members;
- }
- if (statics) {
- result.statics = statics;
- }
- return recordEntry(result, classDeclaration);
- }
- // Collect all exported symbols from an exports clause.
- var exportMap = new Map();
- ts.forEachChild(sourceFile, function (node) {
- switch (node.kind) {
- case ts.SyntaxKind.ExportDeclaration:
- var exportDeclaration = node;
- var moduleSpecifier = exportDeclaration.moduleSpecifier, exportClause = exportDeclaration.exportClause;
- if (!moduleSpecifier) {
- // If there is a module specifier there is also an exportClause
- exportClause.elements.forEach(function (spec) {
- var exportedAs = spec.name.text;
- var name = (spec.propertyName || spec.name).text;
- exportMap.set(name, exportedAs);
- });
- }
- }
- });
- var isExport = function (node) { return sourceFile.isDeclarationFile ||
- ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export; };
- var isExportedIdentifier = function (identifier) {
- return identifier && exportMap.has(identifier.text);
- };
- var isExported = function (node) {
- return isExport(node) || isExportedIdentifier(node.name);
- };
- var exportedIdentifierName = function (identifier) {
- return identifier && (exportMap.get(identifier.text) || identifier.text);
- };
- var exportedName = function (node) { return exportedIdentifierName(node.name); };
- // Pre-declare classes and functions
- ts.forEachChild(sourceFile, function (node) {
- switch (node.kind) {
- case ts.SyntaxKind.ClassDeclaration:
- var classDeclaration = node;
- if (classDeclaration.name) {
- var className = classDeclaration.name.text;
- if (isExported(classDeclaration)) {
- locals.define(className, { __symbolic: 'reference', name: exportedName(classDeclaration) });
- }
- else {
- locals.define(className, errorSym('Reference to non-exported class', node, { className: className }));
- }
- }
- break;
- case ts.SyntaxKind.InterfaceDeclaration:
- var interfaceDeclaration = node;
- if (interfaceDeclaration.name) {
- var interfaceName = interfaceDeclaration.name.text;
- // All references to interfaces should be converted to references to `any`.
- locals.define(interfaceName, { __symbolic: 'reference', name: 'any' });
- }
- break;
- case ts.SyntaxKind.FunctionDeclaration:
- var functionDeclaration = node;
- if (!isExported(functionDeclaration)) {
- // Report references to this function as an error.
- var nameNode = functionDeclaration.name;
- if (nameNode && nameNode.text) {
- locals.define(nameNode.text, errorSym('Reference to a non-exported function', nameNode, { name: nameNode.text }));
- }
- }
- break;
- }
- });
- ts.forEachChild(sourceFile, function (node) {
- var e_3, _a, e_4, _b;
- switch (node.kind) {
- case ts.SyntaxKind.ExportDeclaration:
- // Record export declarations
- var exportDeclaration = node;
- var moduleSpecifier = exportDeclaration.moduleSpecifier, exportClause = exportDeclaration.exportClause;
- if (!moduleSpecifier) {
- // no module specifier -> export {propName as name};
- if (exportClause) {
- exportClause.elements.forEach(function (spec) {
- var name = spec.name.text;
- // If the symbol was not already exported, export a reference since it is a
- // reference to an import
- if (!metadata || !metadata[name]) {
- var propNode = spec.propertyName || spec.name;
- var value = evaluator.evaluateNode(propNode);
- if (!metadata)
- metadata = {};
- metadata[name] = recordEntry(value, node);
- }
- });
- }
- }
- if (moduleSpecifier && moduleSpecifier.kind == ts.SyntaxKind.StringLiteral) {
- // Ignore exports that don't have string literals as exports.
- // This is allowed by the syntax but will be flagged as an error by the type checker.
- var from = moduleSpecifier.text;
- var moduleExport = { from: from };
- if (exportClause) {
- moduleExport.export = exportClause.elements.map(function (spec) { return spec.propertyName ? { name: spec.propertyName.text, as: spec.name.text } :
- spec.name.text; });
- }
- if (!exports)
- exports = [];
- exports.push(moduleExport);
- }
- break;
- case ts.SyntaxKind.ClassDeclaration:
- var classDeclaration = node;
- if (classDeclaration.name) {
- if (isExported(classDeclaration)) {
- var name = exportedName(classDeclaration);
- if (name) {
- if (!metadata)
- metadata = {};
- metadata[name] = classMetadataOf(classDeclaration);
- }
- }
- }
- // Otherwise don't record metadata for the class.
- break;
- case ts.SyntaxKind.TypeAliasDeclaration:
- var typeDeclaration = node;
- if (typeDeclaration.name && isExported(typeDeclaration)) {
- var name = exportedName(typeDeclaration);
- if (name) {
- if (!metadata)
- metadata = {};
- metadata[name] = { __symbolic: 'interface' };
- }
- }
- break;
- case ts.SyntaxKind.InterfaceDeclaration:
- var interfaceDeclaration = node;
- if (interfaceDeclaration.name && isExported(interfaceDeclaration)) {
- var name = exportedName(interfaceDeclaration);
- if (name) {
- if (!metadata)
- metadata = {};
- metadata[name] = { __symbolic: 'interface' };
- }
- }
- break;
- case ts.SyntaxKind.FunctionDeclaration:
- // Record functions that return a single value. Record the parameter
- // names substitution will be performed by the StaticReflector.
- var functionDeclaration = node;
- if (isExported(functionDeclaration) && functionDeclaration.name) {
- var name = exportedName(functionDeclaration);
- var maybeFunc = maybeGetSimpleFunction(functionDeclaration);
- if (name) {
- if (!metadata)
- metadata = {};
- // TODO(alxhub): The literal here is not valid FunctionMetadata.
- metadata[name] = maybeFunc ? recordEntry(maybeFunc.func, node) :
- { __symbolic: 'function' };
- }
- }
- break;
- case ts.SyntaxKind.EnumDeclaration:
- var enumDeclaration = node;
- if (isExported(enumDeclaration)) {
- var enumValueHolder = {};
- var enumName = exportedName(enumDeclaration);
- var nextDefaultValue = 0;
- var writtenMembers = 0;
- try {
- for (var _c = __values(enumDeclaration.members), _d = _c.next(); !_d.done; _d = _c.next()) {
- var member = _d.value;
- var enumValue = void 0;
- if (!member.initializer) {
- enumValue = nextDefaultValue;
- }
- else {
- enumValue = evaluator.evaluateNode(member.initializer);
- }
- var name = undefined;
- if (member.name.kind == ts.SyntaxKind.Identifier) {
- var identifier = member.name;
- name = identifier.text;
- enumValueHolder[name] = enumValue;
- writtenMembers++;
- }
- if (typeof enumValue === 'number') {
- nextDefaultValue = enumValue + 1;
- }
- else if (name) {
- // TODO(alxhub): 'left' here has a name propery which is not valid for
- // MetadataSymbolicSelectExpression.
- nextDefaultValue = {
- __symbolic: 'binary',
- operator: '+',
- left: {
- __symbolic: 'select',
- expression: recordEntry({ __symbolic: 'reference', name: enumName }, node), name: name
- },
- };
- }
- else {
- nextDefaultValue =
- recordEntry(errorSym('Unsupported enum member name', member.name), node);
- }
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_3) throw e_3.error; }
- }
- if (writtenMembers) {
- if (enumName) {
- if (!metadata)
- metadata = {};
- metadata[enumName] = recordEntry(enumValueHolder, node);
- }
- }
- }
- break;
- case ts.SyntaxKind.VariableStatement:
- var variableStatement = node;
- var _loop_1 = function (variableDeclaration) {
- if (variableDeclaration.name.kind == ts.SyntaxKind.Identifier) {
- var nameNode = variableDeclaration.name;
- var varValue = void 0;
- if (variableDeclaration.initializer) {
- varValue = evaluator.evaluateNode(variableDeclaration.initializer);
- }
- else {
- varValue = recordEntry(errorSym('Variable not initialized', nameNode), nameNode);
- }
- var exported = false;
- if (isExport(variableStatement) || isExport(variableDeclaration) ||
- isExportedIdentifier(nameNode)) {
- var name = exportedIdentifierName(nameNode);
- if (name) {
- if (!metadata)
- metadata = {};
- metadata[name] = recordEntry(varValue, node);
- }
- exported = true;
- }
- if (typeof varValue == 'string' || typeof varValue == 'number' ||
- typeof varValue == 'boolean') {
- locals.define(nameNode.text, varValue);
- if (exported) {
- locals.defineReference(nameNode.text, { __symbolic: 'reference', name: nameNode.text });
- }
- }
- else if (!exported) {
- if (varValue && !isMetadataError$1(varValue)) {
- locals.define(nameNode.text, recordEntry(varValue, node));
- }
- else {
- locals.define(nameNode.text, recordEntry(errorSym('Reference to a local symbol', nameNode, { name: nameNode.text }), node));
- }
- }
- }
- else {
- // Destructuring (or binding) declarations are not supported,
- // var {<identifier>[, <identifier>]+} = <expression>;
- // or
- // var [<identifier>[, <identifier}+] = <expression>;
- // are not supported.
- var report_1 = function (nameNode) {
- switch (nameNode.kind) {
- case ts.SyntaxKind.Identifier:
- var name = nameNode;
- var varValue = errorSym('Destructuring not supported', name);
- locals.define(name.text, varValue);
- if (isExport(node)) {
- if (!metadata)
- metadata = {};
- metadata[name.text] = varValue;
- }
- break;
- case ts.SyntaxKind.BindingElement:
- var bindingElement = nameNode;
- report_1(bindingElement.name);
- break;
- case ts.SyntaxKind.ObjectBindingPattern:
- case ts.SyntaxKind.ArrayBindingPattern:
- var bindings = nameNode;
- bindings.elements.forEach(report_1);
- break;
- }
- };
- report_1(variableDeclaration.name);
- }
- };
- try {
- for (var _e = __values(variableStatement.declarationList.declarations), _f = _e.next(); !_f.done; _f = _e.next()) {
- var variableDeclaration = _f.value;
- _loop_1(variableDeclaration);
- }
- }
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
- finally {
- try {
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
- }
- finally { if (e_4) throw e_4.error; }
- }
- break;
- }
- });
- if (metadata || exports) {
- if (!metadata)
- metadata = {};
- else if (strict) {
- validateMetadata(sourceFile, nodeMap, metadata);
- }
- var result = {
- __symbolic: 'module',
- version: this.options.version || METADATA_VERSION, metadata: metadata
- };
- if (sourceFile.moduleName)
- result.importAs = sourceFile.moduleName;
- if (exports)
- result.exports = exports;
- return result;
- }
- };
- return MetadataCollector;
- }());
- // This will throw if the metadata entry given contains an error node.
- function validateMetadata(sourceFile, nodeMap, metadata) {
- var locals = new Set(['Array', 'Object', 'Set', 'Map', 'string', 'number', 'any']);
- function validateExpression(expression) {
- if (!expression) {
- return;
- }
- else if (Array.isArray(expression)) {
- expression.forEach(validateExpression);
- }
- else if (typeof expression === 'object' && !expression.hasOwnProperty('__symbolic')) {
- Object.getOwnPropertyNames(expression).forEach(function (v) { return validateExpression(expression[v]); });
- }
- else if (isMetadataError$1(expression)) {
- reportError(expression);
- }
- else if (isMetadataGlobalReferenceExpression(expression)) {
- if (!locals.has(expression.name)) {
- var reference = metadata[expression.name];
- if (reference) {
- validateExpression(reference);
- }
- }
- }
- else if (isFunctionMetadata(expression)) {
- validateFunction(expression);
- }
- else if (isMetadataSymbolicExpression(expression)) {
- switch (expression.__symbolic) {
- case 'binary':
- var binaryExpression = expression;
- validateExpression(binaryExpression.left);
- validateExpression(binaryExpression.right);
- break;
- case 'call':
- case 'new':
- var callExpression = expression;
- validateExpression(callExpression.expression);
- if (callExpression.arguments)
- callExpression.arguments.forEach(validateExpression);
- break;
- case 'index':
- var indexExpression = expression;
- validateExpression(indexExpression.expression);
- validateExpression(indexExpression.index);
- break;
- case 'pre':
- var prefixExpression = expression;
- validateExpression(prefixExpression.operand);
- break;
- case 'select':
- var selectExpression = expression;
- validateExpression(selectExpression.expression);
- break;
- case 'spread':
- var spreadExpression = expression;
- validateExpression(spreadExpression.expression);
- break;
- case 'if':
- var ifExpression = expression;
- validateExpression(ifExpression.condition);
- validateExpression(ifExpression.elseExpression);
- validateExpression(ifExpression.thenExpression);
- break;
- }
- }
- }
- function validateMember(classData, member) {
- if (member.decorators) {
- member.decorators.forEach(validateExpression);
- }
- if (isMethodMetadata(member) && member.parameterDecorators) {
- member.parameterDecorators.forEach(validateExpression);
- }
- // Only validate parameters of classes for which we know that are used with our DI
- if (classData.decorators && isConstructorMetadata(member) && member.parameters) {
- member.parameters.forEach(validateExpression);
- }
- }
- function validateClass(classData) {
- if (classData.decorators) {
- classData.decorators.forEach(validateExpression);
- }
- if (classData.members) {
- Object.getOwnPropertyNames(classData.members)
- .forEach(function (name) { return classData.members[name].forEach(function (m) { return validateMember(classData, m); }); });
- }
- if (classData.statics) {
- Object.getOwnPropertyNames(classData.statics).forEach(function (name) {
- var staticMember = classData.statics[name];
- if (isFunctionMetadata(staticMember)) {
- validateExpression(staticMember.value);
- }
- else {
- validateExpression(staticMember);
- }
- });
- }
- }
- function validateFunction(functionDeclaration) {
- if (functionDeclaration.value) {
- var oldLocals = locals;
- if (functionDeclaration.parameters) {
- locals = new Set(oldLocals.values());
- if (functionDeclaration.parameters)
- functionDeclaration.parameters.forEach(function (n) { return locals.add(n); });
- }
- validateExpression(functionDeclaration.value);
- locals = oldLocals;
- }
- }
- function shouldReportNode(node) {
- if (node) {
- var nodeStart = node.getStart();
- return !(node.pos != nodeStart &&
- sourceFile.text.substring(node.pos, nodeStart).indexOf('@dynamic') >= 0);
- }
- return true;
- }
- function reportError(error) {
- var node = nodeMap.get(error);
- if (shouldReportNode(node)) {
- var lineInfo = error.line != undefined ?
- error.character != undefined ? ":" + (error.line + 1) + ":" + (error.character + 1) :
- ":" + (error.line + 1) :
- '';
- throw new Error("" + sourceFile.fileName + lineInfo + ": Metadata collected contains an error that will be reported at runtime: " + expandedMessage$1(error) + ".\n " + JSON.stringify(error));
- }
- }
- Object.getOwnPropertyNames(metadata).forEach(function (name) {
- var entry = metadata[name];
- try {
- if (isClassMetadata(entry)) {
- validateClass(entry);
- }
- }
- catch (e) {
- var node = nodeMap.get(entry);
- if (shouldReportNode(node)) {
- if (node) {
- var _a = sourceFile.getLineAndCharacterOfPosition(node.getStart()), line = _a.line, character = _a.character;
- throw new Error(sourceFile.fileName + ":" + (line + 1) + ":" + (character + 1) + ": Error encountered in metadata generated for exported symbol '" + name + "': \n " + e.message);
- }
- throw new Error("Error encountered in metadata generated for exported symbol " + name + ": \n " + e.message);
- }
- }
- });
- }
- // Collect parameter names from a function.
- function namesOf(parameters) {
- var e_5, _a;
- var result = [];
- function addNamesOf(name) {
- var e_6, _a;
- if (name.kind == ts.SyntaxKind.Identifier) {
- var identifier = name;
- result.push(identifier.text);
- }
- else {
- var bindingPattern = name;
- try {
- for (var _b = __values(bindingPattern.elements), _c = _b.next(); !_c.done; _c = _b.next()) {
- var element = _c.value;
- var name_3 = element.name;
- if (name_3) {
- addNamesOf(name_3);
- }
- }
- }
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_6) throw e_6.error; }
- }
- }
- }
- try {
- for (var parameters_2 = __values(parameters), parameters_2_1 = parameters_2.next(); !parameters_2_1.done; parameters_2_1 = parameters_2.next()) {
- var parameter = parameters_2_1.value;
- addNamesOf(parameter.name);
- }
- }
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
- finally {
- try {
- if (parameters_2_1 && !parameters_2_1.done && (_a = parameters_2.return)) _a.call(parameters_2);
- }
- finally { if (e_5) throw e_5.error; }
- }
- return result;
- }
- function expandedMessage$1(error) {
- switch (error.message) {
- case 'Reference to non-exported class':
- if (error.context && error.context.className) {
- return "Reference to a non-exported class " + error.context.className + ". Consider exporting the class";
- }
- break;
- case 'Variable not initialized':
- return 'Only initialized variables and constants can be referenced because the value of this variable is needed by the template compiler';
- case 'Destructuring not supported':
- return 'Referencing an exported destructured variable or constant is not supported by the template compiler. Consider simplifying this to avoid destructuring';
- case 'Could not resolve type':
- if (error.context && error.context.typeName) {
- return "Could not resolve type " + error.context.typeName;
- }
- break;
- case 'Function call not supported':
- var prefix = error.context && error.context.name ? "Calling function '" + error.context.name + "', f" : 'F';
- return prefix +
- 'unction calls are not supported. Consider replacing the function or lambda with a reference to an exported function';
- case 'Reference to a local symbol':
- if (error.context && error.context.name) {
- return "Reference to a local (non-exported) symbol '" + error.context.name + "'. Consider exporting the symbol";
- }
- }
- return error.message;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var EmitFlags;
- (function (EmitFlags) {
- EmitFlags[EmitFlags["DTS"] = 1] = "DTS";
- EmitFlags[EmitFlags["JS"] = 2] = "JS";
- EmitFlags[EmitFlags["Metadata"] = 4] = "Metadata";
- EmitFlags[EmitFlags["I18nBundle"] = 8] = "I18nBundle";
- EmitFlags[EmitFlags["Codegen"] = 16] = "Codegen";
- EmitFlags[EmitFlags["Default"] = 19] = "Default";
- EmitFlags[EmitFlags["All"] = 31] = "All";
- })(EmitFlags || (EmitFlags = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var DTS = /\.d\.ts$/;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function createMetadataReaderCache() {
- var data = new Map();
- return { data: data };
- }
- function readMetadata(filePath, host, cache) {
- var metadatas = cache && cache.data.get(filePath);
- if (metadatas) {
- return metadatas;
- }
- if (host.fileExists(filePath)) {
- // If the file doesn't exists then we cannot return metadata for the file.
- // This will occur if the user referenced a declared module for which no file
- // exists for the module (i.e. jQuery or angularjs).
- if (DTS.test(filePath)) {
- metadatas = readMetadataFile(host, filePath);
- if (!metadatas) {
- // If there is a .d.ts file but no metadata file we need to produce a
- // metadata from the .d.ts file as metadata files capture reexports
- // (starting with v3).
- metadatas = [upgradeMetadataWithDtsData(host, { '__symbolic': 'module', 'version': 1, 'metadata': {} }, filePath)];
- }
- }
- else {
- var metadata = host.getSourceFileMetadata(filePath);
- metadatas = metadata ? [metadata] : [];
- }
- }
- if (cache && (!host.cacheMetadata || host.cacheMetadata(filePath))) {
- cache.data.set(filePath, metadatas);
- }
- return metadatas;
- }
- function readMetadataFile(host, dtsFilePath) {
- var metadataPath = dtsFilePath.replace(DTS, '.metadata.json');
- if (!host.fileExists(metadataPath)) {
- return undefined;
- }
- try {
- var metadataOrMetadatas = JSON.parse(host.readFile(metadataPath));
- var metadatas = metadataOrMetadatas ?
- (Array.isArray(metadataOrMetadatas) ? metadataOrMetadatas : [metadataOrMetadatas]) :
- [];
- if (metadatas.length) {
- var maxMetadata = metadatas.reduce(function (p, c) { return p.version > c.version ? p : c; });
- if (maxMetadata.version < METADATA_VERSION) {
- metadatas.push(upgradeMetadataWithDtsData(host, maxMetadata, dtsFilePath));
- }
- }
- return metadatas;
- }
- catch (e) {
- console.error("Failed to read JSON file " + metadataPath);
- throw e;
- }
- }
- function upgradeMetadataWithDtsData(host, oldMetadata, dtsFilePath) {
- // patch v1 to v3 by adding exports and the `extends` clause.
- // patch v3 to v4 by adding `interface` symbols for TypeAlias
- var newMetadata = {
- '__symbolic': 'module',
- 'version': METADATA_VERSION,
- 'metadata': __assign({}, oldMetadata.metadata),
- };
- if (oldMetadata.exports) {
- newMetadata.exports = oldMetadata.exports;
- }
- if (oldMetadata.importAs) {
- newMetadata.importAs = oldMetadata.importAs;
- }
- if (oldMetadata.origins) {
- newMetadata.origins = oldMetadata.origins;
- }
- var dtsMetadata = host.getSourceFileMetadata(dtsFilePath);
- if (dtsMetadata) {
- for (var prop in dtsMetadata.metadata) {
- if (!newMetadata.metadata[prop]) {
- newMetadata.metadata[prop] = dtsMetadata.metadata[prop];
- }
- }
- if (dtsMetadata['importAs'])
- newMetadata['importAs'] = dtsMetadata['importAs'];
- // Only copy exports from exports from metadata prior to version 3.
- // Starting with version 3 the collector began collecting exports and
- // this should be redundant. Also, with bundler will rewrite the exports
- // which will hoist the exports from modules referenced indirectly causing
- // the imports to be different than the .d.ts files and using the .d.ts file
- // exports would cause the StaticSymbolResolver to redirect symbols to the
- // incorrect location.
- if ((!oldMetadata.version || oldMetadata.version < 3) && dtsMetadata.exports) {
- newMetadata.exports = dtsMetadata.exports;
- }
- }
- return newMetadata;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * The kind of diagnostic message.
- *
- * @publicApi
- */
- var DiagnosticKind$1;
- (function (DiagnosticKind) {
- DiagnosticKind[DiagnosticKind["Error"] = 0] = "Error";
- DiagnosticKind[DiagnosticKind["Warning"] = 1] = "Warning";
- })(DiagnosticKind$1 || (DiagnosticKind$1 = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function isParseSourceSpan(value) {
- return value && !!value.start;
- }
- function spanOf$2(span) {
- if (!span)
- return undefined;
- if (isParseSourceSpan(span)) {
- return { start: span.start.offset, end: span.end.offset };
- }
- else {
- if (span.endSourceSpan) {
- return { start: span.sourceSpan.start.offset, end: span.endSourceSpan.end.offset };
- }
- else if (span.children && span.children.length) {
- return {
- start: span.sourceSpan.start.offset,
- end: spanOf$2(span.children[span.children.length - 1]).end
- };
- }
- return { start: span.sourceSpan.start.offset, end: span.sourceSpan.end.offset };
- }
- }
- function inSpan(position, span, exclusive) {
- return span != null && (exclusive ? position >= span.start && position < span.end :
- position >= span.start && position <= span.end);
- }
- function offsetSpan$1(span, amount) {
- return { start: span.start + amount, end: span.end + amount };
- }
- function isNarrower(spanA, spanB) {
- return spanA.start >= spanB.start && spanA.end <= spanB.end;
- }
- function hasTemplateReference$1(type) {
- var e_1, _a;
- if (type.diDeps) {
- try {
- for (var _b = __values(type.diDeps), _c = _b.next(); !_c.done; _c = _b.next()) {
- var diDep = _c.value;
- if (diDep.token && diDep.token.identifier &&
- identifierName(diDep.token.identifier) == 'TemplateRef')
- return true;
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- return false;
- }
- function getSelectors(info) {
- var map = new Map();
- var selectors = flatten$1(info.directives.map(function (directive) {
- var selectors = CssSelector.parse(directive.selector);
- selectors.forEach(function (selector) { return map.set(selector, directive); });
- return selectors;
- }));
- return { selectors: selectors, map: map };
- }
- function flatten$1(a) {
- var _a;
- return (_a = []).concat.apply(_a, __spread(a));
- }
- function removeSuffix(value, suffix) {
- if (value.endsWith(suffix))
- return value.substring(0, value.length - suffix.length);
- return value;
- }
- function uniqueByName(elements) {
- var e_2, _a;
- if (elements) {
- var result = [];
- var set = new Set();
- try {
- for (var elements_1 = __values(elements), elements_1_1 = elements_1.next(); !elements_1_1.done; elements_1_1 = elements_1.next()) {
- var element = elements_1_1.value;
- if (!set.has(element.name)) {
- set.add(element.name);
- result.push(element);
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (elements_1_1 && !elements_1_1.done && (_a = elements_1.return)) _a.call(elements_1);
- }
- finally { if (e_2) throw e_2.error; }
- }
- return result;
- }
- }
- function diagnosticInfoFromTemplateInfo(info) {
- return {
- fileName: info.fileName,
- offset: info.template.span.start,
- query: info.template.query,
- members: info.template.members,
- htmlAst: info.htmlAst,
- templateAst: info.templateAst
- };
- }
- function findTemplateAstAt(ast, position, allowWidening) {
- if (allowWidening === void 0) { allowWidening = false; }
- var path = [];
- var visitor = new /** @class */ (function (_super) {
- __extends(class_1, _super);
- function class_1() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- class_1.prototype.visit = function (ast, context) {
- var span = spanOf$2(ast);
- if (inSpan(position, span)) {
- var len = path.length;
- if (!len || allowWidening || isNarrower(span, spanOf$2(path[len - 1]))) {
- path.push(ast);
- }
- }
- else {
- // Returning a value here will result in the children being skipped.
- return true;
- }
- };
- class_1.prototype.visitEmbeddedTemplate = function (ast, context) {
- return this.visitChildren(context, function (visit) {
- // Ignore reference, variable and providers
- visit(ast.attrs);
- visit(ast.directives);
- visit(ast.children);
- });
- };
- class_1.prototype.visitElement = function (ast, context) {
- return this.visitChildren(context, function (visit) {
- // Ingnore providers
- visit(ast.attrs);
- visit(ast.inputs);
- visit(ast.outputs);
- visit(ast.references);
- visit(ast.directives);
- visit(ast.children);
- });
- };
- class_1.prototype.visitDirective = function (ast, context) {
- // Ignore the host properties of a directive
- var result = this.visitChildren(context, function (visit) { visit(ast.inputs); });
- // We never care about the diretive itself, just its inputs.
- if (path[path.length - 1] == ast) {
- path.pop();
- }
- return result;
- };
- return class_1;
- }(RecursiveTemplateAstVisitor));
- templateVisitAll(visitor, ast);
- return new AstPath(path, position);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function findAstAt(ast, position, excludeEmpty) {
- if (excludeEmpty === void 0) { excludeEmpty = false; }
- var path = [];
- var visitor = new /** @class */ (function (_super) {
- __extends(class_1, _super);
- function class_1() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- class_1.prototype.visit = function (ast) {
- if ((!excludeEmpty || ast.span.start < ast.span.end) && inSpan(position, ast.span)) {
- path.push(ast);
- visitAstChildren(ast, this);
- }
- };
- return class_1;
- }(NullAstVisitor));
- // We never care about the ASTWithSource node and its visit() method calls its ast's visit so
- // the visit() method above would never see it.
- if (ast instanceof ASTWithSource) {
- ast = ast.ast;
- }
- visitor.visit(ast);
- return new AstPath(path, position);
- }
- function getExpressionCompletions(scope, ast, position, query) {
- var path = findAstAt(ast, position);
- if (path.empty)
- return undefined;
- var tail = path.tail;
- var result = scope;
- function getType(ast) { return new AstType(scope, query, {}).getType(ast); }
- // If the completion request is in a not in a pipe or property access then the global scope
- // (that is the scope of the implicit receiver) is the right scope as the user is typing the
- // beginning of an expression.
- tail.visit({
- visitBinary: function (ast) { },
- visitChain: function (ast) { },
- visitConditional: function (ast) { },
- visitFunctionCall: function (ast) { },
- visitImplicitReceiver: function (ast) { },
- visitInterpolation: function (ast) { result = undefined; },
- visitKeyedRead: function (ast) { },
- visitKeyedWrite: function (ast) { },
- visitLiteralArray: function (ast) { },
- visitLiteralMap: function (ast) { },
- visitLiteralPrimitive: function (ast) { },
- visitMethodCall: function (ast) { },
- visitPipe: function (ast) {
- if (position >= ast.exp.span.end &&
- (!ast.args || !ast.args.length || position < ast.args[0].span.start)) {
- // We are in a position a pipe name is expected.
- result = query.getPipes();
- }
- },
- visitPrefixNot: function (ast) { },
- visitNonNullAssert: function (ast) { },
- visitPropertyRead: function (ast) {
- var receiverType = getType(ast.receiver);
- result = receiverType ? receiverType.members() : scope;
- },
- visitPropertyWrite: function (ast) {
- var receiverType = getType(ast.receiver);
- result = receiverType ? receiverType.members() : scope;
- },
- visitQuote: function (ast) {
- // For a quote, return the members of any (if there are any).
- result = query.getBuiltinType(BuiltinType$1.Any).members();
- },
- visitSafeMethodCall: function (ast) {
- var receiverType = getType(ast.receiver);
- result = receiverType ? receiverType.members() : scope;
- },
- visitSafePropertyRead: function (ast) {
- var receiverType = getType(ast.receiver);
- result = receiverType ? receiverType.members() : scope;
- },
- });
- return result && result.values();
- }
- function getExpressionSymbol(scope, ast, position, query) {
- var path = findAstAt(ast, position, /* excludeEmpty */ true);
- if (path.empty)
- return undefined;
- var tail = path.tail;
- function getType(ast) { return new AstType(scope, query, {}).getType(ast); }
- var symbol = undefined;
- var span = undefined;
- // If the completion request is in a not in a pipe or property access then the global scope
- // (that is the scope of the implicit receiver) is the right scope as the user is typing the
- // beginning of an expression.
- tail.visit({
- visitBinary: function (ast) { },
- visitChain: function (ast) { },
- visitConditional: function (ast) { },
- visitFunctionCall: function (ast) { },
- visitImplicitReceiver: function (ast) { },
- visitInterpolation: function (ast) { },
- visitKeyedRead: function (ast) { },
- visitKeyedWrite: function (ast) { },
- visitLiteralArray: function (ast) { },
- visitLiteralMap: function (ast) { },
- visitLiteralPrimitive: function (ast) { },
- visitMethodCall: function (ast) {
- var receiverType = getType(ast.receiver);
- symbol = receiverType && receiverType.members().get(ast.name);
- span = ast.span;
- },
- visitPipe: function (ast) {
- if (position >= ast.exp.span.end &&
- (!ast.args || !ast.args.length || position < ast.args[0].span.start)) {
- // We are in a position a pipe name is expected.
- var pipes = query.getPipes();
- if (pipes) {
- symbol = pipes.get(ast.name);
- span = ast.span;
- }
- }
- },
- visitPrefixNot: function (ast) { },
- visitNonNullAssert: function (ast) { },
- visitPropertyRead: function (ast) {
- var receiverType = getType(ast.receiver);
- symbol = receiverType && receiverType.members().get(ast.name);
- span = ast.span;
- },
- visitPropertyWrite: function (ast) {
- var receiverType = getType(ast.receiver);
- symbol = receiverType && receiverType.members().get(ast.name);
- span = ast.span;
- },
- visitQuote: function (ast) { },
- visitSafeMethodCall: function (ast) {
- var receiverType = getType(ast.receiver);
- symbol = receiverType && receiverType.members().get(ast.name);
- span = ast.span;
- },
- visitSafePropertyRead: function (ast) {
- var receiverType = getType(ast.receiver);
- symbol = receiverType && receiverType.members().get(ast.name);
- span = ast.span;
- },
- });
- if (symbol && span) {
- return { symbol: symbol, span: span };
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var values = [
- 'ID',
- 'CDATA',
- 'NAME',
- ['ltr', 'rtl'],
- ['rect', 'circle', 'poly', 'default'],
- 'NUMBER',
- ['nohref'],
- ['ismap'],
- ['declare'],
- ['DATA', 'REF', 'OBJECT'],
- ['GET', 'POST'],
- 'IDREF',
- ['TEXT', 'PASSWORD', 'CHECKBOX', 'RADIO', 'SUBMIT', 'RESET', 'FILE', 'HIDDEN', 'IMAGE', 'BUTTON'],
- ['checked'],
- ['disabled'],
- ['readonly'],
- ['multiple'],
- ['selected'],
- ['button', 'submit', 'reset'],
- ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'],
- ['none', 'groups', 'rows', 'cols', 'all'],
- ['left', 'center', 'right', 'justify', 'char'],
- ['top', 'middle', 'bottom', 'baseline'],
- 'IDREFS',
- ['row', 'col', 'rowgroup', 'colgroup'],
- ['defer']
- ];
- var groups = [
- { id: 0 },
- {
- onclick: 1,
- ondblclick: 1,
- onmousedown: 1,
- onmouseup: 1,
- onmouseover: 1,
- onmousemove: 1,
- onmouseout: 1,
- onkeypress: 1,
- onkeydown: 1,
- onkeyup: 1
- },
- { lang: 2, dir: 3 },
- { onload: 1, onunload: 1 },
- { name: 1 },
- { href: 1 },
- { type: 1 },
- { alt: 1 },
- { tabindex: 5 },
- { media: 1 },
- { nohref: 6 },
- { usemap: 1 },
- { src: 1 },
- { onfocus: 1, onblur: 1 },
- { charset: 1 },
- { declare: 8, classid: 1, codebase: 1, data: 1, codetype: 1, archive: 1, standby: 1 },
- { title: 1 },
- { value: 1 },
- { cite: 1 },
- { datetime: 1 },
- { accept: 1 },
- { shape: 4, coords: 1 },
- { for: 11
- },
- { action: 1, method: 10, enctype: 1, onsubmit: 1, onreset: 1, 'accept-charset': 1 },
- { valuetype: 9 },
- { longdesc: 1 },
- { width: 1 },
- { disabled: 14 },
- { readonly: 15, onselect: 1 },
- { accesskey: 1 },
- { size: 5, multiple: 16 },
- { onchange: 1 },
- { label: 1 },
- { selected: 17 },
- { type: 12, checked: 13, size: 1, maxlength: 5 },
- { rows: 5, cols: 5 },
- { type: 18 },
- { height: 1 },
- { summary: 1, border: 1, frame: 19, rules: 20, cellspacing: 1, cellpadding: 1, datapagesize: 1 },
- { align: 21, char: 1, charoff: 1, valign: 22 },
- { span: 5 },
- { abbr: 1, axis: 1, headers: 23, scope: 24, rowspan: 5, colspan: 5 },
- { profile: 1 },
- { 'http-equiv': 2, name: 2, content: 1, scheme: 1 },
- { class: 1, style: 1 },
- { hreflang: 2, rel: 1, rev: 1 },
- { ismap: 7 },
- { defer: 25, event: 1, for: 1 }
- ];
- var elements = {
- TT: [0, 1, 2, 16, 44],
- I: [0, 1, 2, 16, 44],
- B: [0, 1, 2, 16, 44],
- BIG: [0, 1, 2, 16, 44],
- SMALL: [0, 1, 2, 16, 44],
- EM: [0, 1, 2, 16, 44],
- STRONG: [0, 1, 2, 16, 44],
- DFN: [0, 1, 2, 16, 44],
- CODE: [0, 1, 2, 16, 44],
- SAMP: [0, 1, 2, 16, 44],
- KBD: [0, 1, 2, 16, 44],
- VAR: [0, 1, 2, 16, 44],
- CITE: [0, 1, 2, 16, 44],
- ABBR: [0, 1, 2, 16, 44],
- ACRONYM: [0, 1, 2, 16, 44],
- SUB: [0, 1, 2, 16, 44],
- SUP: [0, 1, 2, 16, 44],
- SPAN: [0, 1, 2, 16, 44],
- BDO: [0, 2, 16, 44],
- BR: [0, 16, 44],
- BODY: [0, 1, 2, 3, 16, 44],
- ADDRESS: [0, 1, 2, 16, 44],
- DIV: [0, 1, 2, 16, 44],
- A: [0, 1, 2, 4, 5, 6, 8, 13, 14, 16, 21, 29, 44, 45],
- MAP: [0, 1, 2, 4, 16, 44],
- AREA: [0, 1, 2, 5, 7, 8, 10, 13, 16, 21, 29, 44],
- LINK: [0, 1, 2, 5, 6, 9, 14, 16, 44, 45],
- IMG: [0, 1, 2, 4, 7, 11, 12, 16, 25, 26, 37, 44, 46],
- OBJECT: [0, 1, 2, 4, 6, 8, 11, 15, 16, 26, 37, 44],
- PARAM: [0, 4, 6, 17, 24],
- HR: [0, 1, 2, 16, 44],
- P: [0, 1, 2, 16, 44],
- H1: [0, 1, 2, 16, 44],
- H2: [0, 1, 2, 16, 44],
- H3: [0, 1, 2, 16, 44],
- H4: [0, 1, 2, 16, 44],
- H5: [0, 1, 2, 16, 44],
- H6: [0, 1, 2, 16, 44],
- PRE: [0, 1, 2, 16, 44],
- Q: [0, 1, 2, 16, 18, 44],
- BLOCKQUOTE: [0, 1, 2, 16, 18, 44],
- INS: [0, 1, 2, 16, 18, 19, 44],
- DEL: [0, 1, 2, 16, 18, 19, 44],
- DL: [0, 1, 2, 16, 44],
- DT: [0, 1, 2, 16, 44],
- DD: [0, 1, 2, 16, 44],
- OL: [0, 1, 2, 16, 44],
- UL: [0, 1, 2, 16, 44],
- LI: [0, 1, 2, 16, 44],
- FORM: [0, 1, 2, 4, 16, 20, 23, 44],
- LABEL: [0, 1, 2, 13, 16, 22, 29, 44],
- INPUT: [0, 1, 2, 4, 7, 8, 11, 12, 13, 16, 17, 20, 27, 28, 29, 31, 34, 44, 46],
- SELECT: [0, 1, 2, 4, 8, 13, 16, 27, 30, 31, 44],
- OPTGROUP: [0, 1, 2, 16, 27, 32, 44],
- OPTION: [0, 1, 2, 16, 17, 27, 32, 33, 44],
- TEXTAREA: [0, 1, 2, 4, 8, 13, 16, 27, 28, 29, 31, 35, 44],
- FIELDSET: [0, 1, 2, 16, 44],
- LEGEND: [0, 1, 2, 16, 29, 44],
- BUTTON: [0, 1, 2, 4, 8, 13, 16, 17, 27, 29, 36, 44],
- TABLE: [0, 1, 2, 16, 26, 38, 44],
- CAPTION: [0, 1, 2, 16, 44],
- COLGROUP: [0, 1, 2, 16, 26, 39, 40, 44],
- COL: [0, 1, 2, 16, 26, 39, 40, 44],
- THEAD: [0, 1, 2, 16, 39, 44],
- TBODY: [0, 1, 2, 16, 39, 44],
- TFOOT: [0, 1, 2, 16, 39, 44],
- TR: [0, 1, 2, 16, 39, 44],
- TH: [0, 1, 2, 16, 39, 41, 44],
- TD: [0, 1, 2, 16, 39, 41, 44],
- HEAD: [2, 42],
- TITLE: [2],
- BASE: [5],
- META: [2, 43],
- STYLE: [2, 6, 9, 16],
- SCRIPT: [6, 12, 14, 47],
- NOSCRIPT: [0, 1, 2, 16, 44],
- HTML: [2]
- };
- var defaultAttributes = [0, 1, 2, 4];
- function elementNames() {
- return Object.keys(elements).sort().map(function (v) { return v.toLowerCase(); });
- }
- function compose(indexes) {
- var e_1, _a;
- var result = {};
- if (indexes) {
- try {
- for (var indexes_1 = __values(indexes), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
- var index = indexes_1_1.value;
- var group = groups[index];
- for (var name_1 in group)
- if (group.hasOwnProperty(name_1))
- result[name_1] = values[group[name_1]];
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (indexes_1_1 && !indexes_1_1.done && (_a = indexes_1.return)) _a.call(indexes_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- return result;
- }
- function attributeNames(element) {
- return Object.keys(compose(elements[element.toUpperCase()] || defaultAttributes)).sort();
- }
- // This section is describes the DOM property surface of a DOM element and is derivgulp formated
- // from
- // from the SCHEMA strings from the security context information. SCHEMA is copied here because
- // it would be an unnecessary risk to allow this array to be imported from the security context
- // schema registry.
- var SCHEMA$1 = [
- '[Element]|textContent,%classList,className,id,innerHTML,*beforecopy,*beforecut,*beforepaste,*copy,*cut,*paste,*search,*selectstart,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerHTML,#scrollLeft,#scrollTop,slot' +
- /* added manually to avoid breaking changes */
- ',*message,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored',
- '[HTMLElement]^[Element]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,outerText,!spellcheck,%style,#tabIndex,title,!translate',
- 'abbr,address,article,aside,b,bdi,bdo,cite,code,dd,dfn,dt,em,figcaption,figure,footer,header,i,kbd,main,mark,nav,noscript,rb,rp,rt,rtc,ruby,s,samp,section,small,strong,sub,sup,u,var,wbr^[HTMLElement]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,outerText,!spellcheck,%style,#tabIndex,title,!translate',
- 'media^[HTMLElement]|!autoplay,!controls,%controlsList,%crossOrigin,#currentTime,!defaultMuted,#defaultPlaybackRate,!disableRemotePlayback,!loop,!muted,*encrypted,*waitingforkey,#playbackRate,preload,src,%srcObject,#volume',
- ':svg:^[HTMLElement]|*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,%style,#tabIndex',
- ':svg:graphics^:svg:|',
- ':svg:animation^:svg:|*begin,*end,*repeat',
- ':svg:geometry^:svg:|',
- ':svg:componentTransferFunction^:svg:|',
- ':svg:gradient^:svg:|',
- ':svg:textContent^:svg:graphics|',
- ':svg:textPositioning^:svg:textContent|',
- 'a^[HTMLElement]|charset,coords,download,hash,host,hostname,href,hreflang,name,password,pathname,ping,port,protocol,referrerPolicy,rel,rev,search,shape,target,text,type,username',
- 'area^[HTMLElement]|alt,coords,download,hash,host,hostname,href,!noHref,password,pathname,ping,port,protocol,referrerPolicy,rel,search,shape,target,username',
- 'audio^media|',
- 'br^[HTMLElement]|clear',
- 'base^[HTMLElement]|href,target',
- 'body^[HTMLElement]|aLink,background,bgColor,link,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,text,vLink',
- 'button^[HTMLElement]|!autofocus,!disabled,formAction,formEnctype,formMethod,!formNoValidate,formTarget,name,type,value',
- 'canvas^[HTMLElement]|#height,#width',
- 'content^[HTMLElement]|select',
- 'dl^[HTMLElement]|!compact',
- 'datalist^[HTMLElement]|',
- 'details^[HTMLElement]|!open',
- 'dialog^[HTMLElement]|!open,returnValue',
- 'dir^[HTMLElement]|!compact',
- 'div^[HTMLElement]|align',
- 'embed^[HTMLElement]|align,height,name,src,type,width',
- 'fieldset^[HTMLElement]|!disabled,name',
- 'font^[HTMLElement]|color,face,size',
- 'form^[HTMLElement]|acceptCharset,action,autocomplete,encoding,enctype,method,name,!noValidate,target',
- 'frame^[HTMLElement]|frameBorder,longDesc,marginHeight,marginWidth,name,!noResize,scrolling,src',
- 'frameset^[HTMLElement]|cols,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,rows',
- 'hr^[HTMLElement]|align,color,!noShade,size,width',
- 'head^[HTMLElement]|',
- 'h1,h2,h3,h4,h5,h6^[HTMLElement]|align',
- 'html^[HTMLElement]|version',
- 'iframe^[HTMLElement]|align,!allowFullscreen,frameBorder,height,longDesc,marginHeight,marginWidth,name,referrerPolicy,%sandbox,scrolling,src,srcdoc,width',
- 'img^[HTMLElement]|align,alt,border,%crossOrigin,#height,#hspace,!isMap,longDesc,lowsrc,name,referrerPolicy,sizes,src,srcset,useMap,#vspace,#width',
- 'input^[HTMLElement]|accept,align,alt,autocapitalize,autocomplete,!autofocus,!checked,!defaultChecked,defaultValue,dirName,!disabled,%files,formAction,formEnctype,formMethod,!formNoValidate,formTarget,#height,!incremental,!indeterminate,max,#maxLength,min,#minLength,!multiple,name,pattern,placeholder,!readOnly,!required,selectionDirection,#selectionEnd,#selectionStart,#size,src,step,type,useMap,value,%valueAsDate,#valueAsNumber,#width',
- 'li^[HTMLElement]|type,#value',
- 'label^[HTMLElement]|htmlFor',
- 'legend^[HTMLElement]|align',
- 'link^[HTMLElement]|as,charset,%crossOrigin,!disabled,href,hreflang,integrity,media,referrerPolicy,rel,%relList,rev,%sizes,target,type',
- 'map^[HTMLElement]|name',
- 'marquee^[HTMLElement]|behavior,bgColor,direction,height,#hspace,#loop,#scrollAmount,#scrollDelay,!trueSpeed,#vspace,width',
- 'menu^[HTMLElement]|!compact',
- 'meta^[HTMLElement]|content,httpEquiv,name,scheme',
- 'meter^[HTMLElement]|#high,#low,#max,#min,#optimum,#value',
- 'ins,del^[HTMLElement]|cite,dateTime',
- 'ol^[HTMLElement]|!compact,!reversed,#start,type',
- 'object^[HTMLElement]|align,archive,border,code,codeBase,codeType,data,!declare,height,#hspace,name,standby,type,useMap,#vspace,width',
- 'optgroup^[HTMLElement]|!disabled,label',
- 'option^[HTMLElement]|!defaultSelected,!disabled,label,!selected,text,value',
- 'output^[HTMLElement]|defaultValue,%htmlFor,name,value',
- 'p^[HTMLElement]|align',
- 'param^[HTMLElement]|name,type,value,valueType',
- 'picture^[HTMLElement]|',
- 'pre^[HTMLElement]|#width',
- 'progress^[HTMLElement]|#max,#value',
- 'q,blockquote,cite^[HTMLElement]|',
- 'script^[HTMLElement]|!async,charset,%crossOrigin,!defer,event,htmlFor,integrity,src,text,type',
- 'select^[HTMLElement]|!autofocus,!disabled,#length,!multiple,name,!required,#selectedIndex,#size,value',
- 'shadow^[HTMLElement]|',
- 'slot^[HTMLElement]|name',
- 'source^[HTMLElement]|media,sizes,src,srcset,type',
- 'span^[HTMLElement]|',
- 'style^[HTMLElement]|!disabled,media,type',
- 'caption^[HTMLElement]|align',
- 'th,td^[HTMLElement]|abbr,align,axis,bgColor,ch,chOff,#colSpan,headers,height,!noWrap,#rowSpan,scope,vAlign,width',
- 'col,colgroup^[HTMLElement]|align,ch,chOff,#span,vAlign,width',
- 'table^[HTMLElement]|align,bgColor,border,%caption,cellPadding,cellSpacing,frame,rules,summary,%tFoot,%tHead,width',
- 'tr^[HTMLElement]|align,bgColor,ch,chOff,vAlign',
- 'tfoot,thead,tbody^[HTMLElement]|align,ch,chOff,vAlign',
- 'template^[HTMLElement]|',
- 'textarea^[HTMLElement]|autocapitalize,!autofocus,#cols,defaultValue,dirName,!disabled,#maxLength,#minLength,name,placeholder,!readOnly,!required,#rows,selectionDirection,#selectionEnd,#selectionStart,value,wrap',
- 'title^[HTMLElement]|text',
- 'track^[HTMLElement]|!default,kind,label,src,srclang',
- 'ul^[HTMLElement]|!compact,type',
- 'unknown^[HTMLElement]|',
- 'video^media|#height,poster,#width',
- ':svg:a^:svg:graphics|',
- ':svg:animate^:svg:animation|',
- ':svg:animateMotion^:svg:animation|',
- ':svg:animateTransform^:svg:animation|',
- ':svg:circle^:svg:geometry|',
- ':svg:clipPath^:svg:graphics|',
- ':svg:defs^:svg:graphics|',
- ':svg:desc^:svg:|',
- ':svg:discard^:svg:|',
- ':svg:ellipse^:svg:geometry|',
- ':svg:feBlend^:svg:|',
- ':svg:feColorMatrix^:svg:|',
- ':svg:feComponentTransfer^:svg:|',
- ':svg:feComposite^:svg:|',
- ':svg:feConvolveMatrix^:svg:|',
- ':svg:feDiffuseLighting^:svg:|',
- ':svg:feDisplacementMap^:svg:|',
- ':svg:feDistantLight^:svg:|',
- ':svg:feDropShadow^:svg:|',
- ':svg:feFlood^:svg:|',
- ':svg:feFuncA^:svg:componentTransferFunction|',
- ':svg:feFuncB^:svg:componentTransferFunction|',
- ':svg:feFuncG^:svg:componentTransferFunction|',
- ':svg:feFuncR^:svg:componentTransferFunction|',
- ':svg:feGaussianBlur^:svg:|',
- ':svg:feImage^:svg:|',
- ':svg:feMerge^:svg:|',
- ':svg:feMergeNode^:svg:|',
- ':svg:feMorphology^:svg:|',
- ':svg:feOffset^:svg:|',
- ':svg:fePointLight^:svg:|',
- ':svg:feSpecularLighting^:svg:|',
- ':svg:feSpotLight^:svg:|',
- ':svg:feTile^:svg:|',
- ':svg:feTurbulence^:svg:|',
- ':svg:filter^:svg:|',
- ':svg:foreignObject^:svg:graphics|',
- ':svg:g^:svg:graphics|',
- ':svg:image^:svg:graphics|',
- ':svg:line^:svg:geometry|',
- ':svg:linearGradient^:svg:gradient|',
- ':svg:mpath^:svg:|',
- ':svg:marker^:svg:|',
- ':svg:mask^:svg:|',
- ':svg:metadata^:svg:|',
- ':svg:path^:svg:geometry|',
- ':svg:pattern^:svg:|',
- ':svg:polygon^:svg:geometry|',
- ':svg:polyline^:svg:geometry|',
- ':svg:radialGradient^:svg:gradient|',
- ':svg:rect^:svg:geometry|',
- ':svg:svg^:svg:graphics|#currentScale,#zoomAndPan',
- ':svg:script^:svg:|type',
- ':svg:set^:svg:animation|',
- ':svg:stop^:svg:|',
- ':svg:style^:svg:|!disabled,media,title,type',
- ':svg:switch^:svg:graphics|',
- ':svg:symbol^:svg:|',
- ':svg:tspan^:svg:textPositioning|',
- ':svg:text^:svg:textPositioning|',
- ':svg:textPath^:svg:textContent|',
- ':svg:title^:svg:|',
- ':svg:use^:svg:graphics|',
- ':svg:view^:svg:|#zoomAndPan',
- 'data^[HTMLElement]|value',
- 'keygen^[HTMLElement]|!autofocus,challenge,!disabled,form,keytype,name',
- 'menuitem^[HTMLElement]|type,label,icon,!disabled,!checked,radiogroup,!default',
- 'summary^[HTMLElement]|',
- 'time^[HTMLElement]|dateTime',
- ':svg:cursor^:svg:|',
- ];
- var EVENT = 'event';
- var BOOLEAN$1 = 'boolean';
- var NUMBER$1 = 'number';
- var STRING$1 = 'string';
- var OBJECT$1 = 'object';
- var SchemaInformation = /** @class */ (function () {
- function SchemaInformation() {
- var _this = this;
- this.schema = {};
- SCHEMA$1.forEach(function (encodedType) {
- var parts = encodedType.split('|');
- var properties = parts[1].split(',');
- var typeParts = (parts[0] + '^').split('^');
- var typeName = typeParts[0];
- var type = {};
- typeName.split(',').forEach(function (tag) { return _this.schema[tag.toLowerCase()] = type; });
- var superName = typeParts[1];
- var superType = superName && _this.schema[superName.toLowerCase()];
- if (superType) {
- for (var key in superType) {
- type[key] = superType[key];
- }
- }
- properties.forEach(function (property) {
- if (property == '') ;
- else if (property.startsWith('*')) {
- type[property.substring(1)] = EVENT;
- }
- else if (property.startsWith('!')) {
- type[property.substring(1)] = BOOLEAN$1;
- }
- else if (property.startsWith('#')) {
- type[property.substring(1)] = NUMBER$1;
- }
- else if (property.startsWith('%')) {
- type[property.substring(1)] = OBJECT$1;
- }
- else {
- type[property] = STRING$1;
- }
- });
- });
- }
- SchemaInformation.prototype.allKnownElements = function () { return Object.keys(this.schema); };
- SchemaInformation.prototype.eventsOf = function (elementName) {
- var elementType = this.schema[elementName.toLowerCase()] || {};
- return Object.keys(elementType).filter(function (property) { return elementType[property] === EVENT; });
- };
- SchemaInformation.prototype.propertiesOf = function (elementName) {
- var elementType = this.schema[elementName.toLowerCase()] || {};
- return Object.keys(elementType).filter(function (property) { return elementType[property] !== EVENT; });
- };
- SchemaInformation.prototype.typeOf = function (elementName, property) {
- return (this.schema[elementName.toLowerCase()] || {})[property];
- };
- Object.defineProperty(SchemaInformation, "instance", {
- get: function () {
- var result = SchemaInformation._instance;
- if (!result) {
- result = SchemaInformation._instance = new SchemaInformation();
- }
- return result;
- },
- enumerable: true,
- configurable: true
- });
- return SchemaInformation;
- }());
- function eventNames(elementName) {
- return SchemaInformation.instance.eventsOf(elementName);
- }
- function propertyNames(elementName) {
- return SchemaInformation.instance.propertiesOf(elementName);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TEMPLATE_ATTR_PREFIX$2 = '*';
- var hiddenHtmlElements = {
- html: true,
- script: true,
- noscript: true,
- base: true,
- body: true,
- title: true,
- head: true,
- link: true,
- };
- function getTemplateCompletions(templateInfo) {
- var result = undefined;
- var htmlAst = templateInfo.htmlAst, templateAst = templateInfo.templateAst, template = templateInfo.template;
- // The templateNode starts at the delimiter character so we add 1 to skip it.
- if (templateInfo.position != null) {
- var templatePosition_1 = templateInfo.position - template.span.start;
- var path_1 = findNode(htmlAst, templatePosition_1);
- var mostSpecific = path_1.tail;
- if (path_1.empty || !mostSpecific) {
- result = elementCompletions(templateInfo, path_1);
- }
- else {
- var astPosition_1 = templatePosition_1 - mostSpecific.sourceSpan.start.offset;
- mostSpecific.visit({
- visitElement: function (ast) {
- var startTagSpan = spanOf$2(ast.sourceSpan);
- var tagLen = ast.name.length;
- if (templatePosition_1 <=
- startTagSpan.start + tagLen + 1 /* 1 for the opening angle bracked */) {
- // If we are in the tag then return the element completions.
- result = elementCompletions(templateInfo, path_1);
- }
- else if (templatePosition_1 < startTagSpan.end) {
- // We are in the attribute section of the element (but not in an attribute).
- // Return the attribute completions.
- result = attributeCompletions(templateInfo, path_1);
- }
- },
- visitAttribute: function (ast) {
- if (!ast.valueSpan || !inSpan(templatePosition_1, spanOf$2(ast.valueSpan))) {
- // We are in the name of an attribute. Show attribute completions.
- result = attributeCompletions(templateInfo, path_1);
- }
- else if (ast.valueSpan && inSpan(templatePosition_1, spanOf$2(ast.valueSpan))) {
- result = attributeValueCompletions(templateInfo, templatePosition_1, ast);
- }
- },
- visitText: function (ast) {
- // Check if we are in a entity.
- result = entityCompletions(getSourceText(template, spanOf$2(ast)), astPosition_1);
- if (result)
- return result;
- result = interpolationCompletions(templateInfo, templatePosition_1);
- if (result)
- return result;
- var element = path_1.first(Element$1);
- if (element) {
- var definition = getHtmlTagDefinition(element.name);
- if (definition.contentType === TagContentType.PARSABLE_DATA) {
- result = voidElementAttributeCompletions(templateInfo, path_1);
- if (!result) {
- // If the element can hold content Show element completions.
- result = elementCompletions(templateInfo, path_1);
- }
- }
- }
- else {
- // If no element container, implies parsable data so show elements.
- result = voidElementAttributeCompletions(templateInfo, path_1);
- if (!result) {
- result = elementCompletions(templateInfo, path_1);
- }
- }
- },
- visitComment: function (ast) { },
- visitExpansion: function (ast) { },
- visitExpansionCase: function (ast) { }
- }, null);
- }
- }
- return result;
- }
- function attributeCompletions(info, path) {
- var item = path.tail instanceof Element$1 ? path.tail : path.parentOf(path.tail);
- if (item instanceof Element$1) {
- return attributeCompletionsForElement(info, item.name, item);
- }
- return undefined;
- }
- function attributeCompletionsForElement(info, elementName, element) {
- var attributes = getAttributeInfosForElement(info, elementName, element);
- // Map all the attributes to a completion
- return attributes.map(function (attr) { return ({
- kind: attr.fromHtml ? 'html attribute' : 'attribute',
- name: nameOfAttr(attr),
- sort: attr.name
- }); });
- }
- function getAttributeInfosForElement(info, elementName, element) {
- var attributes = [];
- // Add html attributes
- var htmlAttributes = attributeNames(elementName) || [];
- if (htmlAttributes) {
- attributes.push.apply(attributes, __spread(htmlAttributes.map(function (name) { return ({ name: name, fromHtml: true }); })));
- }
- // Add html properties
- var htmlProperties = propertyNames(elementName);
- if (htmlProperties) {
- attributes.push.apply(attributes, __spread(htmlProperties.map(function (name) { return ({ name: name, input: true }); })));
- }
- // Add html events
- var htmlEvents = eventNames(elementName);
- if (htmlEvents) {
- attributes.push.apply(attributes, __spread(htmlEvents.map(function (name) { return ({ name: name, output: true }); })));
- }
- var _a = getSelectors(info), selectors = _a.selectors, selectorMap = _a.map;
- if (selectors && selectors.length) {
- // All the attributes that are selectable should be shown.
- var applicableSelectors = selectors.filter(function (selector) { return !selector.element || selector.element == elementName; });
- var selectorAndAttributeNames = applicableSelectors.map(function (selector) { return ({ selector: selector, attrs: selector.attrs.filter(function (a) { return !!a; }) }); });
- var attrs_1 = flatten$1(selectorAndAttributeNames.map(function (selectorAndAttr) {
- var directive = selectorMap.get(selectorAndAttr.selector);
- var result = selectorAndAttr.attrs.map(function (name) { return ({ name: name, input: name in directive.inputs, output: name in directive.outputs }); });
- return result;
- }));
- // Add template attribute if a directive contains a template reference
- selectorAndAttributeNames.forEach(function (selectorAndAttr) {
- var selector = selectorAndAttr.selector;
- var directive = selectorMap.get(selector);
- if (directive && hasTemplateReference$1(directive.type) && selector.attrs.length &&
- selector.attrs[0]) {
- attrs_1.push({ name: selector.attrs[0], template: true });
- }
- });
- // All input and output properties of the matching directives should be added.
- var elementSelector = element ?
- createElementCssSelector$1(element) :
- createElementCssSelector$1(new Element$1(elementName, [], [], null, null, null));
- var matcher = new SelectorMatcher();
- matcher.addSelectables(selectors);
- matcher.match(elementSelector, function (selector) {
- var directive = selectorMap.get(selector);
- if (directive) {
- var inputs_1 = directive.inputs, outputs_1 = directive.outputs;
- attrs_1.push.apply(attrs_1, __spread(Object.keys(inputs_1).map(function (name) { return ({ name: inputs_1[name], input: true }); })));
- attrs_1.push.apply(attrs_1, __spread(Object.keys(outputs_1).map(function (name) { return ({ name: outputs_1[name], output: true }); })));
- }
- });
- // If a name shows up twice, fold it into a single value.
- attrs_1 = foldAttrs(attrs_1);
- // Now expand them back out to ensure that input/output shows up as well as input and
- // output.
- attributes.push.apply(attributes, __spread(flatten$1(attrs_1.map(expandedAttr))));
- }
- return attributes;
- }
- function attributeValueCompletions(info, position, attr) {
- var path = findTemplateAstAt(info.templateAst, position);
- var mostSpecific = path.tail;
- var dinfo = diagnosticInfoFromTemplateInfo(info);
- if (mostSpecific) {
- var visitor = new ExpressionVisitor(info, position, attr, function () { return getExpressionScope(dinfo, path, false); });
- mostSpecific.visit(visitor, null);
- if (!visitor.result || !visitor.result.length) {
- // Try allwoing widening the path
- var widerPath_1 = findTemplateAstAt(info.templateAst, position, /* allowWidening */ true);
- if (widerPath_1.tail) {
- var widerVisitor = new ExpressionVisitor(info, position, attr, function () { return getExpressionScope(dinfo, widerPath_1, false); });
- widerPath_1.tail.visit(widerVisitor, null);
- return widerVisitor.result;
- }
- }
- return visitor.result;
- }
- }
- function elementCompletions(info, path) {
- var htmlNames = elementNames().filter(function (name) { return !(name in hiddenHtmlElements); });
- // Collect the elements referenced by the selectors
- var directiveElements = getSelectors(info)
- .selectors.map(function (selector) { return selector.element; })
- .filter(function (name) { return !!name; });
- var components = directiveElements.map(function (name) { return ({ kind: 'component', name: name, sort: name }); });
- var htmlElements = htmlNames.map(function (name) { return ({ kind: 'element', name: name, sort: name }); });
- // Return components and html elements
- return uniqueByName(htmlElements.concat(components));
- }
- function entityCompletions(value, position) {
- // Look for entity completions
- var re = /&[A-Za-z]*;?(?!\d)/g;
- var found;
- var result = undefined;
- while (found = re.exec(value)) {
- var len = found[0].length;
- if (position >= found.index && position < (found.index + len)) {
- result = Object.keys(NAMED_ENTITIES)
- .map(function (name) { return ({ kind: 'entity', name: "&" + name + ";", sort: name }); });
- break;
- }
- }
- return result;
- }
- function interpolationCompletions(info, position) {
- // Look for an interpolation in at the position.
- var templatePath = findTemplateAstAt(info.templateAst, position);
- var mostSpecific = templatePath.tail;
- if (mostSpecific) {
- var visitor = new ExpressionVisitor(info, position, undefined, function () { return getExpressionScope(diagnosticInfoFromTemplateInfo(info), templatePath, false); });
- mostSpecific.visit(visitor, null);
- return uniqueByName(visitor.result);
- }
- }
- // There is a special case of HTML where text that contains a unclosed tag is treated as
- // text. For exaple '<h1> Some <a text </h1>' produces a text nodes inside of the H1
- // element "Some <a text". We, however, want to treat this as if the user was requesting
- // the attributes of an "a" element, not requesting completion in the a text element. This
- // code checks for this case and returns element completions if it is detected or undefined
- // if it is not.
- function voidElementAttributeCompletions(info, path) {
- var tail = path.tail;
- if (tail instanceof Text$3) {
- var match = tail.value.match(/<(\w(\w|\d|-)*:)?(\w(\w|\d|-)*)\s/);
- // The position must be after the match, otherwise we are still in a place where elements
- // are expected (such as `<|a` or `<a|`; we only want attributes for `<a |` or after).
- if (match &&
- path.position >= (match.index || 0) + match[0].length + tail.sourceSpan.start.offset) {
- return attributeCompletionsForElement(info, match[3]);
- }
- }
- }
- var ExpressionVisitor = /** @class */ (function (_super) {
- __extends(ExpressionVisitor, _super);
- function ExpressionVisitor(info, position, attr, getExpressionScope) {
- var _this = _super.call(this) || this;
- _this.info = info;
- _this.position = position;
- _this.attr = attr;
- _this.getExpressionScope = getExpressionScope || (function () { return info.template.members; });
- return _this;
- }
- ExpressionVisitor.prototype.visitDirectiveProperty = function (ast) {
- this.attributeValueCompletions(ast.value);
- };
- ExpressionVisitor.prototype.visitElementProperty = function (ast) {
- this.attributeValueCompletions(ast.value);
- };
- ExpressionVisitor.prototype.visitEvent = function (ast) { this.attributeValueCompletions(ast.handler); };
- ExpressionVisitor.prototype.visitElement = function (ast) {
- var _this = this;
- if (this.attr && getSelectors(this.info) && this.attr.name.startsWith(TEMPLATE_ATTR_PREFIX$2)) {
- // The value is a template expression but the expression AST was not produced when the
- // TemplateAst was produce so
- // do that now.
- var key_1 = this.attr.name.substr(TEMPLATE_ATTR_PREFIX$2.length);
- // Find the selector
- var selectorInfo = getSelectors(this.info);
- var selectors = selectorInfo.selectors;
- var selector_1 = selectors.filter(function (s) { return s.attrs.some(function (attr, i) { return i % 2 == 0 && attr == key_1; }); })[0];
- var templateBindingResult = this.info.expressionParser.parseTemplateBindings(key_1, this.attr.value, null);
- // find the template binding that contains the position
- if (!this.attr.valueSpan)
- return;
- var valueRelativePosition_1 = this.position - this.attr.valueSpan.start.offset;
- var bindings = templateBindingResult.templateBindings;
- var binding = bindings.find(function (binding) { return inSpan(valueRelativePosition_1, binding.span, /* exclusive */ true); }) ||
- bindings.find(function (binding) { return inSpan(valueRelativePosition_1, binding.span); });
- var keyCompletions = function () {
- var keys = [];
- if (selector_1) {
- var attrNames = selector_1.attrs.filter(function (_, i) { return i % 2 == 0; });
- keys = attrNames.filter(function (name) { return name.startsWith(key_1) && name != key_1; })
- .map(function (name) { return lowerName(name.substr(key_1.length)); });
- }
- keys.push('let');
- _this.result = keys.map(function (key) { return ({ kind: 'key', name: key, sort: key }); });
- };
- if (!binding || (binding.key == key_1 && !binding.expression)) {
- // We are in the root binding. We should return `let` and keys that are left in the
- // selector.
- keyCompletions();
- }
- else if (binding.keyIsVar) {
- var equalLocation = this.attr.value.indexOf('=');
- this.result = [];
- if (equalLocation >= 0 && valueRelativePosition_1 >= equalLocation) {
- // We are after the '=' in a let clause. The valid values here are the members of the
- // template reference's type parameter.
- var directiveMetadata = selectorInfo.map.get(selector_1);
- if (directiveMetadata) {
- var contextTable = this.info.template.query.getTemplateContext(directiveMetadata.type.reference);
- if (contextTable) {
- this.result = this.symbolsToCompletions(contextTable.values());
- }
- }
- }
- else if (binding.key && valueRelativePosition_1 <= (binding.key.length - key_1.length)) {
- keyCompletions();
- }
- }
- else {
- // If the position is in the expression or after the key or there is no key, return the
- // expression completions
- if ((binding.expression && inSpan(valueRelativePosition_1, binding.expression.ast.span)) ||
- (binding.key &&
- valueRelativePosition_1 > binding.span.start + (binding.key.length - key_1.length)) ||
- !binding.key) {
- var span = new ParseSpan(0, this.attr.value.length);
- this.attributeValueCompletions(binding.expression ? binding.expression.ast :
- new PropertyRead(span, new ImplicitReceiver(span), ''), valueRelativePosition_1);
- }
- else {
- keyCompletions();
- }
- }
- }
- };
- ExpressionVisitor.prototype.visitBoundText = function (ast) {
- var expressionPosition = this.position - ast.sourceSpan.start.offset;
- if (inSpan(expressionPosition, ast.value.span)) {
- var completions = getExpressionCompletions(this.getExpressionScope(), ast.value, expressionPosition, this.info.template.query);
- if (completions) {
- this.result = this.symbolsToCompletions(completions);
- }
- }
- };
- ExpressionVisitor.prototype.attributeValueCompletions = function (value, position) {
- var symbols = getExpressionCompletions(this.getExpressionScope(), value, position == null ? this.attributeValuePosition : position, this.info.template.query);
- if (symbols) {
- this.result = this.symbolsToCompletions(symbols);
- }
- };
- ExpressionVisitor.prototype.symbolsToCompletions = function (symbols) {
- return symbols.filter(function (s) { return !s.name.startsWith('__') && s.public; })
- .map(function (symbol) { return ({ kind: symbol.kind, name: symbol.name, sort: symbol.name }); });
- };
- Object.defineProperty(ExpressionVisitor.prototype, "attributeValuePosition", {
- get: function () {
- if (this.attr && this.attr.valueSpan) {
- return this.position - this.attr.valueSpan.start.offset;
- }
- return 0;
- },
- enumerable: true,
- configurable: true
- });
- return ExpressionVisitor;
- }(NullTemplateVisitor));
- function getSourceText(template, span) {
- return template.source.substring(span.start, span.end);
- }
- function nameOfAttr(attr) {
- var name = attr.name;
- if (attr.output) {
- name = removeSuffix(name, 'Events');
- name = removeSuffix(name, 'Changed');
- }
- var result = [name];
- if (attr.input) {
- result.unshift('[');
- result.push(']');
- }
- if (attr.output) {
- result.unshift('(');
- result.push(')');
- }
- if (attr.template) {
- result.unshift('*');
- }
- return result.join('');
- }
- var templateAttr = /^(\w+:)?(template$|^\*)/;
- function createElementCssSelector$1(element) {
- var e_1, _a;
- var cssSelector = new CssSelector();
- var elNameNoNs = splitNsName(element.name)[1];
- cssSelector.setElement(elNameNoNs);
- try {
- for (var _b = __values(element.attrs), _c = _b.next(); !_c.done; _c = _b.next()) {
- var attr = _c.value;
- if (!attr.name.match(templateAttr)) {
- var _d = __read(splitNsName(attr.name), 2), _ = _d[0], attrNameNoNs = _d[1];
- cssSelector.addAttribute(attrNameNoNs, attr.value);
- if (attr.name.toLowerCase() == 'class') {
- var classes = attr.value.split(/s+/g);
- classes.forEach(function (className) { return cssSelector.addClassName(className); });
- }
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return cssSelector;
- }
- function foldAttrs(attrs) {
- var inputOutput = new Map();
- var templates = new Map();
- var result = [];
- attrs.forEach(function (attr) {
- if (attr.fromHtml) {
- return attr;
- }
- if (attr.template) {
- var duplicate = templates.get(attr.name);
- if (!duplicate) {
- result.push({ name: attr.name, template: true });
- templates.set(attr.name, attr);
- }
- }
- if (attr.input || attr.output) {
- var duplicate = inputOutput.get(attr.name);
- if (duplicate) {
- duplicate.input = duplicate.input || attr.input;
- duplicate.output = duplicate.output || attr.output;
- }
- else {
- var cloneAttr = { name: attr.name };
- if (attr.input)
- cloneAttr.input = true;
- if (attr.output)
- cloneAttr.output = true;
- result.push(cloneAttr);
- inputOutput.set(attr.name, cloneAttr);
- }
- }
- });
- return result;
- }
- function expandedAttr(attr) {
- if (attr.input && attr.output) {
- return [
- attr, { name: attr.name, input: true, output: false },
- { name: attr.name, input: false, output: true }
- ];
- }
- return [attr];
- }
- function lowerName(name) {
- return name && (name[0].toLowerCase() + name.substr(1));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function locateSymbol(info) {
- if (!info.position)
- return undefined;
- var templatePosition = info.position - info.template.span.start;
- var path = findTemplateAstAt(info.templateAst, templatePosition);
- if (path.tail) {
- var symbol_1 = undefined;
- var span_1 = undefined;
- var attributeValueSymbol_1 = function (ast, inEvent) {
- if (inEvent === void 0) { inEvent = false; }
- var attribute = findAttribute(info);
- if (attribute) {
- if (inSpan(templatePosition, spanOf$2(attribute.valueSpan))) {
- var dinfo = diagnosticInfoFromTemplateInfo(info);
- var scope = getExpressionScope(dinfo, path, inEvent);
- if (attribute.valueSpan) {
- var expressionOffset = attribute.valueSpan.start.offset;
- var result = getExpressionSymbol(scope, ast, templatePosition - expressionOffset, info.template.query);
- if (result) {
- symbol_1 = result.symbol;
- span_1 = offsetSpan$1(result.span, expressionOffset);
- }
- }
- return true;
- }
- }
- return false;
- };
- path.tail.visit({
- visitNgContent: function (ast) { },
- visitEmbeddedTemplate: function (ast) { },
- visitElement: function (ast) {
- var component = ast.directives.find(function (d) { return d.directive.isComponent; });
- if (component) {
- symbol_1 = info.template.query.getTypeSymbol(component.directive.type.reference);
- symbol_1 = symbol_1 && new OverrideKindSymbol(symbol_1, 'component');
- span_1 = spanOf$2(ast);
- }
- else {
- // Find a directive that matches the element name
- var directive = ast.directives.find(function (d) { return d.directive.selector != null && d.directive.selector.indexOf(ast.name) >= 0; });
- if (directive) {
- symbol_1 = info.template.query.getTypeSymbol(directive.directive.type.reference);
- symbol_1 = symbol_1 && new OverrideKindSymbol(symbol_1, 'directive');
- span_1 = spanOf$2(ast);
- }
- }
- },
- visitReference: function (ast) {
- symbol_1 = ast.value && info.template.query.getTypeSymbol(tokenReference(ast.value));
- span_1 = spanOf$2(ast);
- },
- visitVariable: function (ast) { },
- visitEvent: function (ast) {
- if (!attributeValueSymbol_1(ast.handler, /* inEvent */ true)) {
- symbol_1 = findOutputBinding(info, path, ast);
- symbol_1 = symbol_1 && new OverrideKindSymbol(symbol_1, 'event');
- span_1 = spanOf$2(ast);
- }
- },
- visitElementProperty: function (ast) { attributeValueSymbol_1(ast.value); },
- visitAttr: function (ast) { },
- visitBoundText: function (ast) {
- var expressionPosition = templatePosition - ast.sourceSpan.start.offset;
- if (inSpan(expressionPosition, ast.value.span)) {
- var dinfo = diagnosticInfoFromTemplateInfo(info);
- var scope = getExpressionScope(dinfo, path, /* includeEvent */ false);
- var result = getExpressionSymbol(scope, ast.value, expressionPosition, info.template.query);
- if (result) {
- symbol_1 = result.symbol;
- span_1 = offsetSpan$1(result.span, ast.sourceSpan.start.offset);
- }
- }
- },
- visitText: function (ast) { },
- visitDirective: function (ast) {
- symbol_1 = info.template.query.getTypeSymbol(ast.directive.type.reference);
- span_1 = spanOf$2(ast);
- },
- visitDirectiveProperty: function (ast) {
- if (!attributeValueSymbol_1(ast.value)) {
- symbol_1 = findInputBinding(info, path, ast);
- span_1 = spanOf$2(ast);
- }
- }
- }, null);
- if (symbol_1 && span_1) {
- return { symbol: symbol_1, span: offsetSpan$1(span_1, info.template.span.start) };
- }
- }
- }
- function findAttribute(info) {
- if (info.position) {
- var templatePosition = info.position - info.template.span.start;
- var path = findNode(info.htmlAst, templatePosition);
- return path.first(Attribute);
- }
- }
- function findInputBinding(info, path, binding) {
- var e_1, _a;
- var element = path.first(ElementAst);
- if (element) {
- try {
- for (var _b = __values(element.directives), _c = _b.next(); !_c.done; _c = _b.next()) {
- var directive = _c.value;
- var invertedInput = invertMap(directive.directive.inputs);
- var fieldName = invertedInput[binding.templateName];
- if (fieldName) {
- var classSymbol = info.template.query.getTypeSymbol(directive.directive.type.reference);
- if (classSymbol) {
- return classSymbol.members().get(fieldName);
- }
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- }
- function findOutputBinding(info, path, binding) {
- var e_2, _a;
- var element = path.first(ElementAst);
- if (element) {
- try {
- for (var _b = __values(element.directives), _c = _b.next(); !_c.done; _c = _b.next()) {
- var directive = _c.value;
- var invertedOutputs = invertMap(directive.directive.outputs);
- var fieldName = invertedOutputs[binding.name];
- if (fieldName) {
- var classSymbol = info.template.query.getTypeSymbol(directive.directive.type.reference);
- if (classSymbol) {
- return classSymbol.members().get(fieldName);
- }
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- }
- function invertMap(obj) {
- var e_3, _a;
- var result = {};
- try {
- for (var _b = __values(Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {
- var name_1 = _c.value;
- var v = obj[name_1];
- result[v] = name_1;
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_3) throw e_3.error; }
- }
- return result;
- }
- /**
- * Wrap a symbol and change its kind to component.
- */
- var OverrideKindSymbol = /** @class */ (function () {
- function OverrideKindSymbol(sym, kindOverride) {
- this.sym = sym;
- this.kind = kindOverride;
- }
- Object.defineProperty(OverrideKindSymbol.prototype, "name", {
- get: function () { return this.sym.name; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(OverrideKindSymbol.prototype, "language", {
- get: function () { return this.sym.language; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(OverrideKindSymbol.prototype, "type", {
- get: function () { return this.sym.type; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(OverrideKindSymbol.prototype, "container", {
- get: function () { return this.sym.container; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(OverrideKindSymbol.prototype, "public", {
- get: function () { return this.sym.public; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(OverrideKindSymbol.prototype, "callable", {
- get: function () { return this.sym.callable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(OverrideKindSymbol.prototype, "nullable", {
- get: function () { return this.sym.nullable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(OverrideKindSymbol.prototype, "definition", {
- get: function () { return this.sym.definition; },
- enumerable: true,
- configurable: true
- });
- OverrideKindSymbol.prototype.members = function () { return this.sym.members(); };
- OverrideKindSymbol.prototype.signatures = function () { return this.sym.signatures(); };
- OverrideKindSymbol.prototype.selectSignature = function (types) { return this.sym.selectSignature(types); };
- OverrideKindSymbol.prototype.indexed = function (argument) { return this.sym.indexed(argument); };
- return OverrideKindSymbol;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getDefinition(info) {
- var result = locateSymbol(info);
- return result && result.symbol.definition;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getDeclarationDiagnostics(declarations, modules) {
- var e_1, _a;
- var results = [];
- var directives = undefined;
- var _loop_1 = function (declaration) {
- var e_2, _a;
- var report = function (message, span) {
- results.push({
- kind: DiagnosticKind$1.Error,
- span: span || declaration.declarationSpan, message: message
- });
- };
- try {
- for (var _b = __values(declaration.errors), _c = _b.next(); !_c.done; _c = _b.next()) {
- var error = _c.value;
- report(error.message, error.span);
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_2) throw e_2.error; }
- }
- if (declaration.metadata) {
- if (declaration.metadata.isComponent) {
- if (!modules.ngModuleByPipeOrDirective.has(declaration.type)) {
- report("Component '" + declaration.type.name + "' is not included in a module and will not be available inside a template. Consider adding it to a NgModule declaration");
- }
- var _d = declaration.metadata.template, template = _d.template, templateUrl = _d.templateUrl;
- if (template === null && !templateUrl) {
- report("Component '" + declaration.type.name + "' must have a template or templateUrl");
- }
- else if (template && templateUrl) {
- report("Component '" + declaration.type.name + "' must not have both template and templateUrl");
- }
- }
- else {
- if (!directives) {
- directives = new Set();
- modules.ngModules.forEach(function (module) {
- module.declaredDirectives.forEach(function (directive) { directives.add(directive.reference); });
- });
- }
- if (!directives.has(declaration.type)) {
- report("Directive '" + declaration.type.name + "' is not included in a module and will not be available inside a template. Consider adding it to a NgModule declaration");
- }
- }
- }
- };
- try {
- for (var declarations_1 = __values(declarations), declarations_1_1 = declarations_1.next(); !declarations_1_1.done; declarations_1_1 = declarations_1.next()) {
- var declaration = declarations_1_1.value;
- _loop_1(declaration);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (declarations_1_1 && !declarations_1_1.done && (_a = declarations_1.return)) _a.call(declarations_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return results;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getHover(info) {
- var result = locateSymbol(info);
- if (result) {
- return { text: hoverTextOf(result.symbol), span: result.span };
- }
- }
- function hoverTextOf(symbol) {
- var result = [{ text: symbol.kind }, { text: ' ' }, { text: symbol.name, language: symbol.language }];
- var container = symbol.container;
- if (container) {
- result.push({ text: ' of ' }, { text: container.name, language: container.language });
- }
- return result;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Create an instance of an Angular `LanguageService`.
- *
- * @publicApi
- */
- function createLanguageService(host) {
- return new LanguageServiceImpl(host);
- }
- var LanguageServiceImpl = /** @class */ (function () {
- function LanguageServiceImpl(host) {
- this.host = host;
- }
- Object.defineProperty(LanguageServiceImpl.prototype, "metadataResolver", {
- get: function () { return this.host.resolver; },
- enumerable: true,
- configurable: true
- });
- LanguageServiceImpl.prototype.getTemplateReferences = function () { return this.host.getTemplateReferences(); };
- LanguageServiceImpl.prototype.getDiagnostics = function (fileName) {
- var results = [];
- var templates = this.host.getTemplates(fileName);
- if (templates && templates.length) {
- results.push.apply(results, __spread(this.getTemplateDiagnostics(fileName, templates)));
- }
- var declarations = this.host.getDeclarations(fileName);
- if (declarations && declarations.length) {
- var summary = this.host.getAnalyzedModules();
- results.push.apply(results, __spread(getDeclarationDiagnostics(declarations, summary)));
- }
- return uniqueBySpan(results);
- };
- LanguageServiceImpl.prototype.getPipesAt = function (fileName, position) {
- var templateInfo = this.host.getTemplateAstAtPosition(fileName, position);
- if (templateInfo) {
- return templateInfo.pipes;
- }
- return [];
- };
- LanguageServiceImpl.prototype.getCompletionsAt = function (fileName, position) {
- var templateInfo = this.host.getTemplateAstAtPosition(fileName, position);
- if (templateInfo) {
- return getTemplateCompletions(templateInfo);
- }
- };
- LanguageServiceImpl.prototype.getDefinitionAt = function (fileName, position) {
- var templateInfo = this.host.getTemplateAstAtPosition(fileName, position);
- if (templateInfo) {
- return getDefinition(templateInfo);
- }
- };
- LanguageServiceImpl.prototype.getHoverAt = function (fileName, position) {
- var templateInfo = this.host.getTemplateAstAtPosition(fileName, position);
- if (templateInfo) {
- return getHover(templateInfo);
- }
- };
- LanguageServiceImpl.prototype.getTemplateDiagnostics = function (fileName, templates) {
- var e_1, _a;
- var results = [];
- var _loop_1 = function (template) {
- var ast = this_1.host.getTemplateAst(template, fileName);
- if (ast) {
- if (ast.parseErrors && ast.parseErrors.length) {
- results.push.apply(results, __spread(ast.parseErrors.map(function (e) { return ({
- kind: DiagnosticKind$1.Error,
- span: offsetSpan$1(spanOf$2(e.span), template.span.start),
- message: e.msg
- }); })));
- }
- else if (ast.templateAst && ast.htmlAst) {
- var info = {
- templateAst: ast.templateAst,
- htmlAst: ast.htmlAst,
- offset: template.span.start,
- query: template.query,
- members: template.members
- };
- var expressionDiagnostics = getTemplateExpressionDiagnostics(info);
- results.push.apply(results, __spread(expressionDiagnostics));
- }
- if (ast.errors) {
- results.push.apply(results, __spread(ast.errors.map(function (e) { return ({ kind: e.kind, span: e.span || template.span, message: e.message }); })));
- }
- }
- };
- var this_1 = this;
- try {
- for (var templates_1 = __values(templates), templates_1_1 = templates_1.next(); !templates_1_1.done; templates_1_1 = templates_1.next()) {
- var template = templates_1_1.value;
- _loop_1(template);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (templates_1_1 && !templates_1_1.done && (_a = templates_1.return)) _a.call(templates_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return results;
- };
- return LanguageServiceImpl;
- }());
- function uniqueBySpan(elements) {
- var e_2, _a;
- if (elements) {
- var result = [];
- var map = new Map();
- try {
- for (var elements_1 = __values(elements), elements_1_1 = elements_1.next(); !elements_1_1.done; elements_1_1 = elements_1.next()) {
- var element = elements_1_1.value;
- var span = element.span;
- var set = map.get(span.start);
- if (!set) {
- set = new Set();
- map.set(span.start, set);
- }
- if (!set.has(span.end)) {
- set.add(span.end);
- result.push(element);
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (elements_1_1 && !elements_1_1.done && (_a = elements_1.return)) _a.call(elements_1);
- }
- finally { if (e_2) throw e_2.error; }
- }
- return result;
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ANNOTATIONS = '__annotations__';
- var PARAMETERS = '__parameters__';
- var PROP_METADATA = '__prop__metadata__';
- /**
- * @suppress {globalThis}
- */
- function makeDecorator(name, props, parentClass, additionalProcessing, typeFn) {
- var metaCtor = makeMetadataCtor(props);
- function DecoratorFactory() {
- var _a;
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (this instanceof DecoratorFactory) {
- metaCtor.call.apply(metaCtor, __spread([this], args));
- return this;
- }
- var annotationInstance = new ((_a = DecoratorFactory).bind.apply(_a, __spread([void 0], args)))();
- return function TypeDecorator(cls) {
- if (typeFn)
- typeFn.apply(void 0, __spread([cls], args));
- // Use of Object.defineProperty is important since it creates non-enumerable property which
- // prevents the property is copied during subclassing.
- var annotations = cls.hasOwnProperty(ANNOTATIONS) ?
- cls[ANNOTATIONS] :
- Object.defineProperty(cls, ANNOTATIONS, { value: [] })[ANNOTATIONS];
- annotations.push(annotationInstance);
- if (additionalProcessing)
- additionalProcessing(cls);
- return cls;
- };
- }
- if (parentClass) {
- DecoratorFactory.prototype = Object.create(parentClass.prototype);
- }
- DecoratorFactory.prototype.ngMetadataName = name;
- DecoratorFactory.annotationCls = DecoratorFactory;
- return DecoratorFactory;
- }
- function makeMetadataCtor(props) {
- return function ctor() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (props) {
- var values = props.apply(void 0, __spread(args));
- for (var propName in values) {
- this[propName] = values[propName];
- }
- }
- };
- }
- function makeParamDecorator(name, props, parentClass) {
- var metaCtor = makeMetadataCtor(props);
- function ParamDecoratorFactory() {
- var _a;
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (this instanceof ParamDecoratorFactory) {
- metaCtor.apply(this, args);
- return this;
- }
- var annotationInstance = new ((_a = ParamDecoratorFactory).bind.apply(_a, __spread([void 0], args)))();
- ParamDecorator.annotation = annotationInstance;
- return ParamDecorator;
- function ParamDecorator(cls, unusedKey, index) {
- // Use of Object.defineProperty is important since it creates non-enumerable property which
- // prevents the property is copied during subclassing.
- var parameters = cls.hasOwnProperty(PARAMETERS) ?
- cls[PARAMETERS] :
- Object.defineProperty(cls, PARAMETERS, { value: [] })[PARAMETERS];
- // there might be gaps if some in between parameters do not have annotations.
- // we pad with nulls.
- while (parameters.length <= index) {
- parameters.push(null);
- }
- (parameters[index] = parameters[index] || []).push(annotationInstance);
- return cls;
- }
- }
- if (parentClass) {
- ParamDecoratorFactory.prototype = Object.create(parentClass.prototype);
- }
- ParamDecoratorFactory.prototype.ngMetadataName = name;
- ParamDecoratorFactory.annotationCls = ParamDecoratorFactory;
- return ParamDecoratorFactory;
- }
- function makePropDecorator(name, props, parentClass, additionalProcessing) {
- var metaCtor = makeMetadataCtor(props);
- function PropDecoratorFactory() {
- var _a;
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (this instanceof PropDecoratorFactory) {
- metaCtor.apply(this, args);
- return this;
- }
- var decoratorInstance = new ((_a = PropDecoratorFactory).bind.apply(_a, __spread([void 0], args)))();
- function PropDecorator(target, name) {
- var constructor = target.constructor;
- // Use of Object.defineProperty is important since it creates non-enumerable property which
- // prevents the property is copied during subclassing.
- var meta = constructor.hasOwnProperty(PROP_METADATA) ?
- constructor[PROP_METADATA] :
- Object.defineProperty(constructor, PROP_METADATA, { value: {} })[PROP_METADATA];
- meta[name] = meta.hasOwnProperty(name) && meta[name] || [];
- meta[name].unshift(decoratorInstance);
- if (additionalProcessing)
- additionalProcessing.apply(void 0, __spread([target, name], args));
- }
- return PropDecorator;
- }
- if (parentClass) {
- PropDecoratorFactory.prototype = Object.create(parentClass.prototype);
- }
- PropDecoratorFactory.prototype.ngMetadataName = name;
- PropDecoratorFactory.annotationCls = PropDecoratorFactory;
- return PropDecoratorFactory;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ɵ0 = function (token) { return ({ token: token }); };
- /**
- * Inject decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var Inject = makeParamDecorator('Inject', ɵ0);
- /**
- * Optional decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var Optional = makeParamDecorator('Optional');
- /**
- * Self decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var Self = makeParamDecorator('Self');
- /**
- * SkipSelf decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var SkipSelf = makeParamDecorator('SkipSelf');
- /**
- * Host decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var Host = makeParamDecorator('Host');
- var ɵ1 = function (attributeName) { return ({ attributeName: attributeName }); };
- /**
- * Attribute decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var Attribute$1 = makeParamDecorator('Attribute', ɵ1);
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Injection flags for DI.
- *
- * @publicApi
- */
- var InjectFlags;
- (function (InjectFlags) {
- // TODO(alxhub): make this 'const' when ngc no longer writes exports of it into ngfactory files.
- /** Check self and check parent injector if needed */
- InjectFlags[InjectFlags["Default"] = 0] = "Default";
- /**
- * Specifies that an injector should retrieve a dependency from any injector until reaching the
- * host element of the current component. (Only used with Element Injector)
- */
- InjectFlags[InjectFlags["Host"] = 1] = "Host";
- /** Don't ascend to ancestors of the node requesting injection. */
- InjectFlags[InjectFlags["Self"] = 2] = "Self";
- /** Skip the node that is requesting injection. */
- InjectFlags[InjectFlags["SkipSelf"] = 4] = "SkipSelf";
- /** Inject `defaultValue` instead if token not found. */
- InjectFlags[InjectFlags["Optional"] = 8] = "Optional";
- })(InjectFlags || (InjectFlags = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getClosureSafeProperty(objWithPropertyToExtract) {
- for (var key in objWithPropertyToExtract) {
- if (objWithPropertyToExtract[key] === getClosureSafeProperty) {
- return key;
- }
- }
- throw Error('Could not find renamed property on target object.');
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Construct an `InjectableDef` which defines how a token will be constructed by the DI system, and
- * in which injectors (if any) it will be available.
- *
- * This should be assigned to a static `ngInjectableDef` field on a type, which will then be an
- * `InjectableType`.
- *
- * Options:
- * * `providedIn` determines which injectors will include the injectable, by either associating it
- * with an `@NgModule` or other `InjectorType`, or by specifying that this injectable should be
- * provided in the `'root'` injector, which will be the application-level injector in most apps.
- * * `factory` gives the zero argument function which will create an instance of the injectable.
- * The factory can call `inject` to access the `Injector` and request injection of dependencies.
- *
- * @codeGenApi
- */
- function ɵɵdefineInjectable(opts) {
- return {
- token: opts.token, providedIn: opts.providedIn || null, factory: opts.factory,
- value: undefined,
- };
- }
- /**
- * Construct an `InjectorDef` which configures an injector.
- *
- * This should be assigned to a static `ngInjectorDef` field on a type, which will then be an
- * `InjectorType`.
- *
- * Options:
- *
- * * `factory`: an `InjectorType` is an instantiable type, so a zero argument `factory` function to
- * create the type must be provided. If that factory function needs to inject arguments, it can
- * use the `inject` function.
- * * `providers`: an optional array of providers to add to the injector. Each provider must
- * either have a factory or point to a type which has an `ngInjectableDef` static property (the
- * type must be an `InjectableType`).
- * * `imports`: an optional array of imports of other `InjectorType`s or `InjectorTypeWithModule`s
- * whose providers will also be added to the injector. Locally provided types will override
- * providers from imports.
- *
- * @publicApi
- */
- function ɵɵdefineInjector(options) {
- return {
- factory: options.factory, providers: options.providers || [], imports: options.imports || [],
- };
- }
- /**
- * Read the `ngInjectableDef` for `type` in a way which is immune to accidentally reading inherited
- * value.
- *
- * @param type A type which may have its own (non-inherited) `ngInjectableDef`.
- */
- function getInjectableDef(type) {
- var def = type[NG_INJECTABLE_DEF];
- // The definition read above may come from a base class. `hasOwnProperty` is not sufficient to
- // distinguish this case, as in older browsers (e.g. IE10) static property inheritance is
- // implemented by copying the properties.
- //
- // Instead, the ngInjectableDef's token is compared to the type, and if they don't match then the
- // property was not defined directly on the type itself, and was likely inherited. The definition
- // is only returned if the type matches the def.token.
- return def && def.token === type ? def : null;
- }
- /**
- * Read the `ngInjectableDef` for `type` or read the `ngInjectableDef` from one of its ancestors.
- *
- * @param type A type which may have `ngInjectableDef`, via inheritance.
- *
- * @deprecated Will be removed in v10, where an error will occur in the scenario if we find the
- * `ngInjectableDef` on an ancestor only.
- */
- function getInheritedInjectableDef(type) {
- if (type && type[NG_INJECTABLE_DEF]) {
- // TODO(FW-1307): Re-add ngDevMode when closure can handle it
- // ngDevMode &&
- console.warn("DEPRECATED: DI is instantiating a token \"" + type.name + "\" that inherits its @Injectable decorator but does not provide one itself.\n" +
- ("This will become an error in v10. Please add @Injectable() to the \"" + type.name + "\" class."));
- return type[NG_INJECTABLE_DEF];
- }
- else {
- return null;
- }
- }
- /**
- * Read the `ngInjectorDef` type in a way which is immune to accidentally reading inherited value.
- *
- * @param type type which may have `ngInjectorDef`
- */
- function getInjectorDef(type) {
- return type && type.hasOwnProperty(NG_INJECTOR_DEF) ? type[NG_INJECTOR_DEF] : null;
- }
- var NG_INJECTABLE_DEF = getClosureSafeProperty({ ngInjectableDef: getClosureSafeProperty });
- var NG_INJECTOR_DEF = getClosureSafeProperty({ ngInjectorDef: getClosureSafeProperty });
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function stringify$1(token) {
- if (typeof token === 'string') {
- return token;
- }
- if (token instanceof Array) {
- return '[' + token.map(stringify$1).join(', ') + ']';
- }
- if (token == null) {
- return '' + token;
- }
- if (token.overriddenName) {
- return "" + token.overriddenName;
- }
- if (token.name) {
- return "" + token.name;
- }
- var res = token.toString();
- if (res == null) {
- return '' + res;
- }
- var newLineIndex = res.indexOf('\n');
- return newLineIndex === -1 ? res : res.substring(0, newLineIndex);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var __forward_ref__ = getClosureSafeProperty({ __forward_ref__: getClosureSafeProperty });
- /**
- * Allows to refer to references which are not yet defined.
- *
- * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of
- * DI is declared, but not yet defined. It is also used when the `token` which we use when creating
- * a query is not yet defined.
- *
- * @usageNotes
- * ### Example
- * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref'}
- * @publicApi
- */
- function forwardRef(forwardRefFn) {
- forwardRefFn.__forward_ref__ = forwardRef;
- forwardRefFn.toString = function () { return stringify$1(this()); };
- return forwardRefFn;
- }
- /**
- * Lazily retrieves the reference value from a forwardRef.
- *
- * Acts as the identity function when given a non-forward-ref value.
- *
- * @usageNotes
- * ### Example
- *
- * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='resolve_forward_ref'}
- *
- * @see `forwardRef`
- * @publicApi
- */
- function resolveForwardRef$1(type) {
- var fn = type;
- if (typeof fn === 'function' && fn.hasOwnProperty(__forward_ref__) &&
- fn.__forward_ref__ === forwardRef) {
- return fn();
- }
- else {
- return type;
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var __globalThis = typeof globalThis !== 'undefined' && globalThis;
- var __window$1 = typeof window !== 'undefined' && window;
- var __self$1 = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
- self instanceof WorkerGlobalScope && self;
- var __global$1 = typeof global !== 'undefined' && global;
- // Always use __globalThis if available, which is the spec-defined global variable across all
- // environments, then fallback to __global first, because in Node tests both __global and
- // __window may be defined and _global should be __global in that case.
- var _global$1 = __globalThis || __global$1 || __window$1 || __self$1;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var R3ResolvedDependencyType$1;
- (function (R3ResolvedDependencyType) {
- R3ResolvedDependencyType[R3ResolvedDependencyType["Token"] = 0] = "Token";
- R3ResolvedDependencyType[R3ResolvedDependencyType["Attribute"] = 1] = "Attribute";
- })(R3ResolvedDependencyType$1 || (R3ResolvedDependencyType$1 = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Creates a token that can be used in a DI Provider.
- *
- * Use an `InjectionToken` whenever the type you are injecting is not reified (does not have a
- * runtime representation) such as when injecting an interface, callable type, array or
- * parameterized type.
- *
- * `InjectionToken` is parameterized on `T` which is the type of object which will be returned by
- * the `Injector`. This provides additional level of type safety.
- *
- * ```
- * interface MyInterface {...}
- * var myInterface = injector.get(new InjectionToken<MyInterface>('SomeToken'));
- * // myInterface is inferred to be MyInterface.
- * ```
- *
- * When creating an `InjectionToken`, you can optionally specify a factory function which returns
- * (possibly by creating) a default value of the parameterized type `T`. This sets up the
- * `InjectionToken` using this factory as a provider as if it was defined explicitly in the
- * application's root injector. If the factory function, which takes zero arguments, needs to inject
- * dependencies, it can do so using the `inject` function. See below for an example.
- *
- * Additionally, if a `factory` is specified you can also specify the `providedIn` option, which
- * overrides the above behavior and marks the token as belonging to a particular `@NgModule`. As
- * mentioned above, `'root'` is the default value for `providedIn`.
- *
- * @usageNotes
- * ### Basic Example
- *
- * ### Plain InjectionToken
- *
- * {@example core/di/ts/injector_spec.ts region='InjectionToken'}
- *
- * ### Tree-shakable InjectionToken
- *
- * {@example core/di/ts/injector_spec.ts region='ShakableInjectionToken'}
- *
- *
- * @publicApi
- */
- var InjectionToken = /** @class */ (function () {
- function InjectionToken(_desc, options) {
- this._desc = _desc;
- /** @internal */
- this.ngMetadataName = 'InjectionToken';
- this.ngInjectableDef = undefined;
- if (typeof options == 'number') {
- // This is a special hack to assign __NG_ELEMENT_ID__ to this instance.
- // __NG_ELEMENT_ID__ is Used by Ivy to determine bloom filter id.
- // We are using it to assign `-1` which is used to identify `Injector`.
- this.__NG_ELEMENT_ID__ = options;
- }
- else if (options !== undefined) {
- this.ngInjectableDef = ɵɵdefineInjectable({
- token: this,
- providedIn: options.providedIn || 'root',
- factory: options.factory,
- });
- }
- }
- InjectionToken.prototype.toString = function () { return "InjectionToken " + this._desc; };
- return InjectionToken;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * An InjectionToken that gets the current `Injector` for `createInjector()`-style injectors.
- *
- * Requesting this token instead of `Injector` allows `StaticInjector` to be tree-shaken from a
- * project.
- *
- * @publicApi
- */
- var INJECTOR = new InjectionToken('INJECTOR', -1 // `-1` is used by Ivy DI system as special value to recognize it as `Injector`.
- );
- var _THROW_IF_NOT_FOUND = new Object();
- var THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;
- var NG_TEMP_TOKEN_PATH = 'ngTempTokenPath';
- var NG_TOKEN_PATH = 'ngTokenPath';
- var NEW_LINE = /\n/gm;
- var NO_NEW_LINE = 'ɵ';
- var SOURCE = '__source';
- var ɵ0$1 = getClosureSafeProperty;
- var USE_VALUE$2 = getClosureSafeProperty({ provide: String, useValue: ɵ0$1 });
- /**
- * Current injector value used by `inject`.
- * - `undefined`: it is an error to call `inject`
- * - `null`: `inject` can be called but there is no injector (limp-mode).
- * - Injector instance: Use the injector for resolution.
- */
- var _currentInjector = undefined;
- function setCurrentInjector(injector) {
- var former = _currentInjector;
- _currentInjector = injector;
- return former;
- }
- /**
- * Current implementation of inject.
- *
- * By default, it is `injectInjectorOnly`, which makes it `Injector`-only aware. It can be changed
- * to `directiveInject`, which brings in the `NodeInjector` system of ivy. It is designed this
- * way for two reasons:
- * 1. `Injector` should not depend on ivy logic.
- * 2. To maintain tree shake-ability we don't want to bring in unnecessary code.
- */
- var _injectImplementation;
- /**
- * Sets the current inject implementation.
- */
- function setInjectImplementation(impl) {
- var previous = _injectImplementation;
- _injectImplementation = impl;
- return previous;
- }
- function injectInjectorOnly(token, flags) {
- if (flags === void 0) { flags = InjectFlags.Default; }
- if (_currentInjector === undefined) {
- throw new Error("inject() must be called from an injection context");
- }
- else if (_currentInjector === null) {
- return injectRootLimpMode(token, undefined, flags);
- }
- else {
- return _currentInjector.get(token, flags & InjectFlags.Optional ? null : undefined, flags);
- }
- }
- function ɵɵinject(token, flags) {
- if (flags === void 0) { flags = InjectFlags.Default; }
- return (_injectImplementation || injectInjectorOnly)(token, flags);
- }
- /**
- * Injects `root` tokens in limp mode.
- *
- * If no injector exists, we can still inject tree-shakable providers which have `providedIn` set to
- * `"root"`. This is known as the limp mode injection. In such case the value is stored in the
- * `InjectableDef`.
- */
- function injectRootLimpMode(token, notFoundValue, flags) {
- var injectableDef = getInjectableDef(token);
- if (injectableDef && injectableDef.providedIn == 'root') {
- return injectableDef.value === undefined ? injectableDef.value = injectableDef.factory() :
- injectableDef.value;
- }
- if (flags & InjectFlags.Optional)
- return null;
- if (notFoundValue !== undefined)
- return notFoundValue;
- throw new Error("Injector: NOT_FOUND [" + stringify$1(token) + "]");
- }
- function injectArgs(types) {
- var args = [];
- for (var i = 0; i < types.length; i++) {
- var arg = resolveForwardRef$1(types[i]);
- if (Array.isArray(arg)) {
- if (arg.length === 0) {
- throw new Error('Arguments array must have arguments.');
- }
- var type = undefined;
- var flags = InjectFlags.Default;
- for (var j = 0; j < arg.length; j++) {
- var meta = arg[j];
- if (meta instanceof Optional || meta.ngMetadataName === 'Optional' || meta === Optional) {
- flags |= InjectFlags.Optional;
- }
- else if (meta instanceof SkipSelf || meta.ngMetadataName === 'SkipSelf' || meta === SkipSelf) {
- flags |= InjectFlags.SkipSelf;
- }
- else if (meta instanceof Self || meta.ngMetadataName === 'Self' || meta === Self) {
- flags |= InjectFlags.Self;
- }
- else if (meta instanceof Inject || meta === Inject) {
- type = meta.token;
- }
- else {
- type = meta;
- }
- }
- args.push(ɵɵinject(type, flags));
- }
- else {
- args.push(ɵɵinject(arg));
- }
- }
- return args;
- }
- var NullInjector = /** @class */ (function () {
- function NullInjector() {
- }
- NullInjector.prototype.get = function (token, notFoundValue) {
- if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }
- if (notFoundValue === THROW_IF_NOT_FOUND) {
- // Intentionally left behind: With dev tools open the debugger will stop here. There is no
- // reason why correctly written application should cause this exception.
- // TODO(misko): uncomment the next line once `ngDevMode` works with closure.
- // if(ngDevMode) debugger;
- var error = new Error("NullInjectorError: No provider for " + stringify$1(token) + "!");
- error.name = 'NullInjectorError';
- throw error;
- }
- return notFoundValue;
- };
- return NullInjector;
- }());
- function catchInjectorError(e, token, injectorErrorName, source) {
- var tokenPath = e[NG_TEMP_TOKEN_PATH];
- if (token[SOURCE]) {
- tokenPath.unshift(token[SOURCE]);
- }
- e.message = formatError('\n' + e.message, tokenPath, injectorErrorName, source);
- e[NG_TOKEN_PATH] = tokenPath;
- e[NG_TEMP_TOKEN_PATH] = null;
- throw e;
- }
- function formatError(text, obj, injectorErrorName, source) {
- if (source === void 0) { source = null; }
- text = text && text.charAt(0) === '\n' && text.charAt(1) == NO_NEW_LINE ? text.substr(2) : text;
- var context = stringify$1(obj);
- if (obj instanceof Array) {
- context = obj.map(stringify$1).join(' -> ');
- }
- else if (typeof obj === 'object') {
- var parts = [];
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- var value = obj[key];
- parts.push(key + ':' + (typeof value === 'string' ? JSON.stringify(value) : stringify$1(value)));
- }
- }
- context = "{" + parts.join(', ') + "}";
- }
- return "" + injectorErrorName + (source ? '(' + source + ')' : '') + "[" + context + "]: " + text.replace(NEW_LINE, '\n ');
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @description
- *
- * Represents a type that a Component or other object is instances of.
- *
- * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is be represented by
- * the `MyCustomComponent` constructor function.
- *
- * @publicApi
- */
- var Type$2 = Function;
- function isType(v) {
- return typeof v === 'function';
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Attention: These regex has to hold even if the code is minified!
- */
- var DELEGATE_CTOR = /^function\s+\S+\(\)\s*{[\s\S]+\.apply\(this,\s*arguments\)/;
- var INHERITED_CLASS = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{/;
- var INHERITED_CLASS_WITH_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(/;
- var INHERITED_CLASS_WITH_DELEGATE_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(\)\s*{\s+super\(\.\.\.arguments\)/;
- /**
- * Determine whether a stringified type is a class which delegates its constructor
- * to its parent.
- *
- * This is not trivial since compiled code can actually contain a constructor function
- * even if the original source code did not. For instance, when the child class contains
- * an initialized instance property.
- */
- function isDelegateCtor(typeStr) {
- return DELEGATE_CTOR.test(typeStr) || INHERITED_CLASS_WITH_DELEGATE_CTOR.test(typeStr) ||
- (INHERITED_CLASS.test(typeStr) && !INHERITED_CLASS_WITH_CTOR.test(typeStr));
- }
- var ReflectionCapabilities = /** @class */ (function () {
- function ReflectionCapabilities(reflect) {
- this._reflect = reflect || _global$1['Reflect'];
- }
- ReflectionCapabilities.prototype.isReflectionEnabled = function () { return true; };
- ReflectionCapabilities.prototype.factory = function (t) { return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- return new (t.bind.apply(t, __spread([void 0], args)))();
- }; };
- /** @internal */
- ReflectionCapabilities.prototype._zipTypesAndAnnotations = function (paramTypes, paramAnnotations) {
- var result;
- if (typeof paramTypes === 'undefined') {
- result = new Array(paramAnnotations.length);
- }
- else {
- result = new Array(paramTypes.length);
- }
- for (var i = 0; i < result.length; i++) {
- // TS outputs Object for parameters without types, while Traceur omits
- // the annotations. For now we preserve the Traceur behavior to aid
- // migration, but this can be revisited.
- if (typeof paramTypes === 'undefined') {
- result[i] = [];
- }
- else if (paramTypes[i] && paramTypes[i] != Object) {
- result[i] = [paramTypes[i]];
- }
- else {
- result[i] = [];
- }
- if (paramAnnotations && paramAnnotations[i] != null) {
- result[i] = result[i].concat(paramAnnotations[i]);
- }
- }
- return result;
- };
- ReflectionCapabilities.prototype._ownParameters = function (type, parentCtor) {
- var typeStr = type.toString();
- // If we have no decorators, we only have function.length as metadata.
- // In that case, to detect whether a child class declared an own constructor or not,
- // we need to look inside of that constructor to check whether it is
- // just calling the parent.
- // This also helps to work around for https://github.com/Microsoft/TypeScript/issues/12439
- // that sets 'design:paramtypes' to []
- // if a class inherits from another class but has no ctor declared itself.
- if (isDelegateCtor(typeStr)) {
- return null;
- }
- // Prefer the direct API.
- if (type.parameters && type.parameters !== parentCtor.parameters) {
- return type.parameters;
- }
- // API of tsickle for lowering decorators to properties on the class.
- var tsickleCtorParams = type.ctorParameters;
- if (tsickleCtorParams && tsickleCtorParams !== parentCtor.ctorParameters) {
- // Newer tsickle uses a function closure
- // Retain the non-function case for compatibility with older tsickle
- var ctorParameters = typeof tsickleCtorParams === 'function' ? tsickleCtorParams() : tsickleCtorParams;
- var paramTypes_1 = ctorParameters.map(function (ctorParam) { return ctorParam && ctorParam.type; });
- var paramAnnotations_1 = ctorParameters.map(function (ctorParam) {
- return ctorParam && convertTsickleDecoratorIntoMetadata(ctorParam.decorators);
- });
- return this._zipTypesAndAnnotations(paramTypes_1, paramAnnotations_1);
- }
- // API for metadata created by invoking the decorators.
- var paramAnnotations = type.hasOwnProperty(PARAMETERS) && type[PARAMETERS];
- var paramTypes = this._reflect && this._reflect.getOwnMetadata &&
- this._reflect.getOwnMetadata('design:paramtypes', type);
- if (paramTypes || paramAnnotations) {
- return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);
- }
- // If a class has no decorators, at least create metadata
- // based on function.length.
- // Note: We know that this is a real constructor as we checked
- // the content of the constructor above.
- return new Array(type.length).fill(undefined);
- };
- ReflectionCapabilities.prototype.parameters = function (type) {
- // Note: only report metadata if we have at least one class decorator
- // to stay in sync with the static reflector.
- if (!isType(type)) {
- return [];
- }
- var parentCtor = getParentCtor(type);
- var parameters = this._ownParameters(type, parentCtor);
- if (!parameters && parentCtor !== Object) {
- parameters = this.parameters(parentCtor);
- }
- return parameters || [];
- };
- ReflectionCapabilities.prototype._ownAnnotations = function (typeOrFunc, parentCtor) {
- // Prefer the direct API.
- if (typeOrFunc.annotations && typeOrFunc.annotations !== parentCtor.annotations) {
- var annotations = typeOrFunc.annotations;
- if (typeof annotations === 'function' && annotations.annotations) {
- annotations = annotations.annotations;
- }
- return annotations;
- }
- // API of tsickle for lowering decorators to properties on the class.
- if (typeOrFunc.decorators && typeOrFunc.decorators !== parentCtor.decorators) {
- return convertTsickleDecoratorIntoMetadata(typeOrFunc.decorators);
- }
- // API for metadata created by invoking the decorators.
- if (typeOrFunc.hasOwnProperty(ANNOTATIONS)) {
- return typeOrFunc[ANNOTATIONS];
- }
- return null;
- };
- ReflectionCapabilities.prototype.annotations = function (typeOrFunc) {
- if (!isType(typeOrFunc)) {
- return [];
- }
- var parentCtor = getParentCtor(typeOrFunc);
- var ownAnnotations = this._ownAnnotations(typeOrFunc, parentCtor) || [];
- var parentAnnotations = parentCtor !== Object ? this.annotations(parentCtor) : [];
- return parentAnnotations.concat(ownAnnotations);
- };
- ReflectionCapabilities.prototype._ownPropMetadata = function (typeOrFunc, parentCtor) {
- // Prefer the direct API.
- if (typeOrFunc.propMetadata &&
- typeOrFunc.propMetadata !== parentCtor.propMetadata) {
- var propMetadata = typeOrFunc.propMetadata;
- if (typeof propMetadata === 'function' && propMetadata.propMetadata) {
- propMetadata = propMetadata.propMetadata;
- }
- return propMetadata;
- }
- // API of tsickle for lowering decorators to properties on the class.
- if (typeOrFunc.propDecorators &&
- typeOrFunc.propDecorators !== parentCtor.propDecorators) {
- var propDecorators_1 = typeOrFunc.propDecorators;
- var propMetadata_1 = {};
- Object.keys(propDecorators_1).forEach(function (prop) {
- propMetadata_1[prop] = convertTsickleDecoratorIntoMetadata(propDecorators_1[prop]);
- });
- return propMetadata_1;
- }
- // API for metadata created by invoking the decorators.
- if (typeOrFunc.hasOwnProperty(PROP_METADATA)) {
- return typeOrFunc[PROP_METADATA];
- }
- return null;
- };
- ReflectionCapabilities.prototype.propMetadata = function (typeOrFunc) {
- if (!isType(typeOrFunc)) {
- return {};
- }
- var parentCtor = getParentCtor(typeOrFunc);
- var propMetadata = {};
- if (parentCtor !== Object) {
- var parentPropMetadata_1 = this.propMetadata(parentCtor);
- Object.keys(parentPropMetadata_1).forEach(function (propName) {
- propMetadata[propName] = parentPropMetadata_1[propName];
- });
- }
- var ownPropMetadata = this._ownPropMetadata(typeOrFunc, parentCtor);
- if (ownPropMetadata) {
- Object.keys(ownPropMetadata).forEach(function (propName) {
- var decorators = [];
- if (propMetadata.hasOwnProperty(propName)) {
- decorators.push.apply(decorators, __spread(propMetadata[propName]));
- }
- decorators.push.apply(decorators, __spread(ownPropMetadata[propName]));
- propMetadata[propName] = decorators;
- });
- }
- return propMetadata;
- };
- ReflectionCapabilities.prototype.ownPropMetadata = function (typeOrFunc) {
- if (!isType(typeOrFunc)) {
- return {};
- }
- return this._ownPropMetadata(typeOrFunc, getParentCtor(typeOrFunc)) || {};
- };
- ReflectionCapabilities.prototype.hasLifecycleHook = function (type, lcProperty) {
- return type instanceof Type$2 && lcProperty in type.prototype;
- };
- ReflectionCapabilities.prototype.guards = function (type) { return {}; };
- ReflectionCapabilities.prototype.getter = function (name) { return new Function('o', 'return o.' + name + ';'); };
- ReflectionCapabilities.prototype.setter = function (name) {
- return new Function('o', 'v', 'return o.' + name + ' = v;');
- };
- ReflectionCapabilities.prototype.method = function (name) {
- var functionBody = "if (!o." + name + ") throw new Error('\"" + name + "\" is undefined');\n return o." + name + ".apply(o, args);";
- return new Function('o', 'args', functionBody);
- };
- // There is not a concept of import uri in Js, but this is useful in developing Dart applications.
- ReflectionCapabilities.prototype.importUri = function (type) {
- // StaticSymbol
- if (typeof type === 'object' && type['filePath']) {
- return type['filePath'];
- }
- // Runtime type
- return "./" + stringify$1(type);
- };
- ReflectionCapabilities.prototype.resourceUri = function (type) { return "./" + stringify$1(type); };
- ReflectionCapabilities.prototype.resolveIdentifier = function (name, moduleUrl, members, runtime) {
- return runtime;
- };
- ReflectionCapabilities.prototype.resolveEnum = function (enumIdentifier, name) { return enumIdentifier[name]; };
- return ReflectionCapabilities;
- }());
- function convertTsickleDecoratorIntoMetadata(decoratorInvocations) {
- if (!decoratorInvocations) {
- return [];
- }
- return decoratorInvocations.map(function (decoratorInvocation) {
- var decoratorType = decoratorInvocation.type;
- var annotationCls = decoratorType.annotationCls;
- var annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : [];
- return new (annotationCls.bind.apply(annotationCls, __spread([void 0], annotationArgs)))();
- });
- }
- function getParentCtor(ctor) {
- var parentProto = ctor.prototype ? Object.getPrototypeOf(ctor.prototype) : null;
- var parentCtor = parentProto ? parentProto.constructor : null;
- // Note: We always use `Object` as the null value
- // to simplify checking later on.
- return parentCtor || Object;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ɵ0$2 = getClosureSafeProperty;
- var USE_VALUE$3 = getClosureSafeProperty({ provide: String, useValue: ɵ0$2 });
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ɵ0$3 = getClosureSafeProperty;
- var USE_VALUE$4 = getClosureSafeProperty({ provide: String, useValue: ɵ0$3 });
- var EMPTY_ARRAY$1 = [];
- function convertInjectableProviderToFactory(type, provider) {
- if (!provider) {
- var reflectionCapabilities = new ReflectionCapabilities();
- var deps_1 = reflectionCapabilities.parameters(type);
- // TODO - convert to flags.
- return function () { return new (type.bind.apply(type, __spread([void 0], injectArgs(deps_1))))(); };
- }
- if (USE_VALUE$4 in provider) {
- var valueProvider_1 = provider;
- return function () { return valueProvider_1.useValue; };
- }
- else if (provider.useExisting) {
- var existingProvider_1 = provider;
- return function () { return ɵɵinject(existingProvider_1.useExisting); };
- }
- else if (provider.useFactory) {
- var factoryProvider_1 = provider;
- return function () { return factoryProvider_1.useFactory.apply(factoryProvider_1, __spread(injectArgs(factoryProvider_1.deps || EMPTY_ARRAY$1))); };
- }
- else if (provider.useClass) {
- var classProvider_1 = provider;
- var deps_2 = provider.deps;
- if (!deps_2) {
- var reflectionCapabilities = new ReflectionCapabilities();
- deps_2 = reflectionCapabilities.parameters(type);
- }
- return function () {
- var _a;
- return new ((_a = classProvider_1.useClass).bind.apply(_a, __spread([void 0], injectArgs(deps_2))))();
- };
- }
- else {
- var deps_3 = provider.deps;
- if (!deps_3) {
- var reflectionCapabilities = new ReflectionCapabilities();
- deps_3 = reflectionCapabilities.parameters(type);
- }
- return function () { return new (type.bind.apply(type, __spread([void 0], injectArgs(deps_3))))(); };
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ɵ0$4 = function (type, meta) { return SWITCH_COMPILE_INJECTABLE(type, meta); };
- /**
- * Injectable decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var Injectable = makeDecorator('Injectable', undefined, undefined, undefined, ɵ0$4);
- /**
- * Supports @Injectable() in JIT mode for Render2.
- */
- function render2CompileInjectable(injectableType, options) {
- if (options && options.providedIn !== undefined && !getInjectableDef(injectableType)) {
- injectableType.ngInjectableDef = ɵɵdefineInjectable({
- token: injectableType,
- providedIn: options.providedIn,
- factory: convertInjectableProviderToFactory(injectableType, options),
- });
- }
- }
- var SWITCH_COMPILE_INJECTABLE__PRE_R3__ = render2CompileInjectable;
- var SWITCH_COMPILE_INJECTABLE = SWITCH_COMPILE_INJECTABLE__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function ngDevModeResetPerfCounters() {
- var locationString = typeof location !== 'undefined' ? location.toString() : '';
- var newCounters = {
- namedConstructors: locationString.indexOf('ngDevMode=namedConstructors') != -1,
- firstTemplatePass: 0,
- tNode: 0,
- tView: 0,
- rendererCreateTextNode: 0,
- rendererSetText: 0,
- rendererCreateElement: 0,
- rendererAddEventListener: 0,
- rendererSetAttribute: 0,
- rendererRemoveAttribute: 0,
- rendererSetProperty: 0,
- rendererSetClassName: 0,
- rendererAddClass: 0,
- rendererRemoveClass: 0,
- rendererSetStyle: 0,
- rendererRemoveStyle: 0,
- rendererDestroy: 0,
- rendererDestroyNode: 0,
- rendererMoveNode: 0,
- rendererRemoveNode: 0,
- rendererAppendChild: 0,
- rendererInsertBefore: 0,
- rendererCreateComment: 0,
- styleMap: 0,
- styleMapCacheMiss: 0,
- classMap: 0,
- classMapCacheMiss: 0,
- stylingProp: 0,
- stylingPropCacheMiss: 0,
- stylingApply: 0,
- stylingApplyCacheMiss: 0,
- };
- // Make sure to refer to ngDevMode as ['ngDevMode'] for closure.
- var allowNgDevModeTrue = locationString.indexOf('ngDevMode=false') === -1;
- _global$1['ngDevMode'] = allowNgDevModeTrue && newCounters;
- return newCounters;
- }
- /**
- * This checks to see if the `ngDevMode` has been set. If yes,
- * then we honor it, otherwise we default to dev mode with additional checks.
- *
- * The idea is that unless we are doing production build where we explicitly
- * set `ngDevMode == false` we should be helping the developer by providing
- * as much early warning and errors as possible.
- *
- * NOTE: changes to the `ngDevMode` name must be synced with `compiler-cli/src/tooling.ts`.
- */
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
- ngDevModeResetPerfCounters();
- }
- /** Called when directives inject each other (creating a circular dependency) */
- function throwCyclicDependencyError(token) {
- throw new Error("Cannot instantiate cyclic dependency! " + token);
- }
- function throwMixedMultiProviderError() {
- throw new Error("Cannot mix multi providers and regular providers");
- }
- function throwInvalidProviderError(ngModuleType, providers, provider) {
- var ngModuleDetail = '';
- if (ngModuleType && providers) {
- var providerDetail = providers.map(function (v) { return v == provider ? '?' + provider + '?' : '...'; });
- ngModuleDetail =
- " - only instances of Provider and Type are allowed, got: [" + providerDetail.join(', ') + "]";
- }
- throw new Error("Invalid provider for the NgModule '" + stringify$1(ngModuleType) + "'" + ngModuleDetail);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * An internal token whose presence in an injector indicates that the injector should treat itself
- * as a root scoped injector when processing requests for unknown tokens which may indicate
- * they are provided in the root scope.
- */
- var APP_ROOT = new InjectionToken('The presence of this token marks an injector as being the root injector.');
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Marker which indicates that a value has not yet been created from the factory function.
- */
- var NOT_YET = {};
- /**
- * Marker which indicates that the factory function for a token is in the process of being called.
- *
- * If the injector is asked to inject a token with its value set to CIRCULAR, that indicates
- * injection of a dependency has recursively attempted to inject the original token, and there is
- * a circular dependency among the providers.
- */
- var CIRCULAR = {};
- var EMPTY_ARRAY$2 = [];
- /**
- * A lazily initialized NullInjector.
- */
- var NULL_INJECTOR = undefined;
- function getNullInjector() {
- if (NULL_INJECTOR === undefined) {
- NULL_INJECTOR = new NullInjector();
- }
- return NULL_INJECTOR;
- }
- /**
- * Create a new `Injector` which is configured using a `defType` of `InjectorType<any>`s.
- *
- * @publicApi
- */
- function createInjector(defType, parent, additionalProviders, name) {
- if (parent === void 0) { parent = null; }
- if (additionalProviders === void 0) { additionalProviders = null; }
- parent = parent || getNullInjector();
- return new R3Injector(defType, additionalProviders, parent, name);
- }
- var R3Injector = /** @class */ (function () {
- function R3Injector(def, additionalProviders, parent, source) {
- var _this = this;
- if (source === void 0) { source = null; }
- this.parent = parent;
- /**
- * Map of tokens to records which contain the instances of those tokens.
- */
- this.records = new Map();
- /**
- * The transitive set of `InjectorType`s which define this injector.
- */
- this.injectorDefTypes = new Set();
- /**
- * Set of values instantiated by this injector which contain `ngOnDestroy` lifecycle hooks.
- */
- this.onDestroy = new Set();
- this._destroyed = false;
- // Start off by creating Records for every provider declared in every InjectorType
- // included transitively in `def`.
- var dedupStack = [];
- deepForEach([def], function (injectorDef) { return _this.processInjectorType(injectorDef, [], dedupStack); });
- additionalProviders && deepForEach(additionalProviders, function (provider) { return _this.processProvider(provider, def, additionalProviders); });
- // Make sure the INJECTOR token provides this injector.
- this.records.set(INJECTOR, makeRecord(undefined, this));
- // Detect whether this injector has the APP_ROOT_SCOPE token and thus should provide
- // any injectable scoped to APP_ROOT_SCOPE.
- this.isRootInjector = this.records.has(APP_ROOT);
- // Eagerly instantiate the InjectorType classes themselves.
- this.injectorDefTypes.forEach(function (defType) { return _this.get(defType); });
- // Source name, used for debugging
- this.source = source || (typeof def === 'object' ? null : stringify$1(def));
- }
- Object.defineProperty(R3Injector.prototype, "destroyed", {
- /**
- * Flag indicating that this injector was previously destroyed.
- */
- get: function () { return this._destroyed; },
- enumerable: true,
- configurable: true
- });
- /**
- * Destroy the injector and release references to every instance or provider associated with it.
- *
- * Also calls the `OnDestroy` lifecycle hooks of every instance that was created for which a
- * hook was found.
- */
- R3Injector.prototype.destroy = function () {
- this.assertNotDestroyed();
- // Set destroyed = true first, in case lifecycle hooks re-enter destroy().
- this._destroyed = true;
- try {
- // Call all the lifecycle hooks.
- this.onDestroy.forEach(function (service) { return service.ngOnDestroy(); });
- }
- finally {
- // Release all references.
- this.records.clear();
- this.onDestroy.clear();
- this.injectorDefTypes.clear();
- }
- };
- R3Injector.prototype.get = function (token, notFoundValue, flags) {
- if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }
- if (flags === void 0) { flags = InjectFlags.Default; }
- this.assertNotDestroyed();
- // Set the injection context.
- var previousInjector = setCurrentInjector(this);
- try {
- // Check for the SkipSelf flag.
- if (!(flags & InjectFlags.SkipSelf)) {
- // SkipSelf isn't set, check if the record belongs to this injector.
- var record = this.records.get(token);
- if (record === undefined) {
- // No record, but maybe the token is scoped to this injector. Look for an ngInjectableDef
- // with a scope matching this injector.
- var def = couldBeInjectableType(token) && getInjectableDef(token);
- if (def && this.injectableDefInScope(def)) {
- // Found an ngInjectableDef and it's scoped to this injector. Pretend as if it was here
- // all along.
- record = makeRecord(injectableDefOrInjectorDefFactory(token), NOT_YET);
- this.records.set(token, record);
- }
- }
- // If a record was found, get the instance for it and return it.
- if (record !== undefined) {
- return this.hydrate(token, record);
- }
- }
- // Select the next injector based on the Self flag - if self is set, the next injector is
- // the NullInjector, otherwise it's the parent.
- var nextInjector = !(flags & InjectFlags.Self) ? this.parent : getNullInjector();
- return nextInjector.get(token, flags & InjectFlags.Optional ? null : notFoundValue);
- }
- catch (e) {
- if (e.name === 'NullInjectorError') {
- var path = e[NG_TEMP_TOKEN_PATH] = e[NG_TEMP_TOKEN_PATH] || [];
- path.unshift(stringify$1(token));
- if (previousInjector) {
- // We still have a parent injector, keep throwing
- throw e;
- }
- else {
- // Format & throw the final error message when we don't have any previous injector
- return catchInjectorError(e, token, 'R3InjectorError', this.source);
- }
- }
- else {
- throw e;
- }
- }
- finally {
- // Lastly, clean up the state by restoring the previous injector.
- setCurrentInjector(previousInjector);
- }
- };
- R3Injector.prototype.toString = function () {
- var tokens = [], records = this.records;
- records.forEach(function (v, token) { return tokens.push(stringify$1(token)); });
- return "R3Injector[" + tokens.join(', ') + "]";
- };
- R3Injector.prototype.assertNotDestroyed = function () {
- if (this._destroyed) {
- throw new Error('Injector has already been destroyed.');
- }
- };
- /**
- * Add an `InjectorType` or `InjectorTypeWithProviders` and all of its transitive providers
- * to this injector.
- *
- * If an `InjectorTypeWithProviders` that declares providers besides the type is specified,
- * the function will return "true" to indicate that the providers of the type definition need
- * to be processed. This allows us to process providers of injector types after all imports of
- * an injector definition are processed. (following View Engine semantics: see FW-1349)
- */
- R3Injector.prototype.processInjectorType = function (defOrWrappedDef, parents, dedupStack) {
- var _this = this;
- defOrWrappedDef = resolveForwardRef$1(defOrWrappedDef);
- if (!defOrWrappedDef)
- return false;
- // Either the defOrWrappedDef is an InjectorType (with ngInjectorDef) or an
- // InjectorDefTypeWithProviders (aka ModuleWithProviders). Detecting either is a megamorphic
- // read, so care is taken to only do the read once.
- // First attempt to read the ngInjectorDef.
- var def = getInjectorDef(defOrWrappedDef);
- // If that's not present, then attempt to read ngModule from the InjectorDefTypeWithProviders.
- var ngModule = (def == null) && defOrWrappedDef.ngModule || undefined;
- // Determine the InjectorType. In the case where `defOrWrappedDef` is an `InjectorType`,
- // then this is easy. In the case of an InjectorDefTypeWithProviders, then the definition type
- // is the `ngModule`.
- var defType = (ngModule === undefined) ? defOrWrappedDef : ngModule;
- // Check for circular dependencies.
- if (ngDevMode && parents.indexOf(defType) !== -1) {
- var defName = stringify$1(defType);
- throw new Error("Circular dependency in DI detected for type " + defName + ". Dependency path: " + parents.map(function (defType) { return stringify$1(defType); }).join(' > ') + " > " + defName + ".");
- }
- // Check for multiple imports of the same module
- var isDuplicate = dedupStack.indexOf(defType) !== -1;
- // Finally, if defOrWrappedType was an `InjectorDefTypeWithProviders`, then the actual
- // `InjectorDef` is on its `ngModule`.
- if (ngModule !== undefined) {
- def = getInjectorDef(ngModule);
- }
- // If no definition was found, it might be from exports. Remove it.
- if (def == null) {
- return false;
- }
- // Track the InjectorType and add a provider for it.
- this.injectorDefTypes.add(defType);
- this.records.set(defType, makeRecord(def.factory, NOT_YET));
- // Add providers in the same way that @NgModule resolution did:
- // First, include providers from any imports.
- if (def.imports != null && !isDuplicate) {
- // Before processing defType's imports, add it to the set of parents. This way, if it ends
- // up deeply importing itself, this can be detected.
- ngDevMode && parents.push(defType);
- // Add it to the set of dedups. This way we can detect multiple imports of the same module
- dedupStack.push(defType);
- var importTypesWithProviders_1;
- try {
- deepForEach(def.imports, function (imported) {
- if (_this.processInjectorType(imported, parents, dedupStack)) {
- if (importTypesWithProviders_1 === undefined)
- importTypesWithProviders_1 = [];
- // If the processed import is an injector type with providers, we store it in the
- // list of import types with providers, so that we can process those afterwards.
- importTypesWithProviders_1.push(imported);
- }
- });
- }
- finally {
- // Remove it from the parents set when finished.
- ngDevMode && parents.pop();
- }
- // Imports which are declared with providers (TypeWithProviders) need to be processed
- // after all imported modules are processed. This is similar to how View Engine
- // processes/merges module imports in the metadata resolver. See: FW-1349.
- if (importTypesWithProviders_1 !== undefined) {
- var _loop_1 = function (i) {
- var _a = importTypesWithProviders_1[i], ngModule_1 = _a.ngModule, providers = _a.providers;
- deepForEach(providers, function (provider) { return _this.processProvider(provider, ngModule_1, providers || EMPTY_ARRAY$2); });
- };
- for (var i = 0; i < importTypesWithProviders_1.length; i++) {
- _loop_1(i);
- }
- }
- }
- // Next, include providers listed on the definition itself.
- var defProviders = def.providers;
- if (defProviders != null && !isDuplicate) {
- var injectorType_1 = defOrWrappedDef;
- deepForEach(defProviders, function (provider) { return _this.processProvider(provider, injectorType_1, defProviders); });
- }
- return (ngModule !== undefined &&
- defOrWrappedDef.providers !== undefined);
- };
- /**
- * Process a `SingleProvider` and add it.
- */
- R3Injector.prototype.processProvider = function (provider, ngModuleType, providers) {
- // Determine the token from the provider. Either it's its own token, or has a {provide: ...}
- // property.
- provider = resolveForwardRef$1(provider);
- var token = isTypeProvider(provider) ? provider : resolveForwardRef$1(provider && provider.provide);
- // Construct a `Record` for the provider.
- var record = providerToRecord(provider, ngModuleType, providers);
- if (!isTypeProvider(provider) && provider.multi === true) {
- // If the provider indicates that it's a multi-provider, process it specially.
- // First check whether it's been defined already.
- var multiRecord_1 = this.records.get(token);
- if (multiRecord_1) {
- // It has. Throw a nice error if
- if (multiRecord_1.multi === undefined) {
- throwMixedMultiProviderError();
- }
- }
- else {
- multiRecord_1 = makeRecord(undefined, NOT_YET, true);
- multiRecord_1.factory = function () { return injectArgs(multiRecord_1.multi); };
- this.records.set(token, multiRecord_1);
- }
- token = provider;
- multiRecord_1.multi.push(provider);
- }
- else {
- var existing = this.records.get(token);
- if (existing && existing.multi !== undefined) {
- throwMixedMultiProviderError();
- }
- }
- this.records.set(token, record);
- };
- R3Injector.prototype.hydrate = function (token, record) {
- if (record.value === CIRCULAR) {
- throwCyclicDependencyError(stringify$1(token));
- }
- else if (record.value === NOT_YET) {
- record.value = CIRCULAR;
- record.value = record.factory();
- }
- if (typeof record.value === 'object' && record.value && hasOnDestroy(record.value)) {
- this.onDestroy.add(record.value);
- }
- return record.value;
- };
- R3Injector.prototype.injectableDefInScope = function (def) {
- if (!def.providedIn) {
- return false;
- }
- else if (typeof def.providedIn === 'string') {
- return def.providedIn === 'any' || (def.providedIn === 'root' && this.isRootInjector);
- }
- else {
- return this.injectorDefTypes.has(def.providedIn);
- }
- };
- return R3Injector;
- }());
- function injectableDefOrInjectorDefFactory(token) {
- // Most tokens will have an ngInjectableDef directly on them, which specifies a factory directly.
- var injectableDef = getInjectableDef(token);
- if (injectableDef !== null) {
- return injectableDef.factory;
- }
- // If the token is an NgModule, it's also injectable but the factory is on its ngInjectorDef.
- var injectorDef = getInjectorDef(token);
- if (injectorDef !== null) {
- return injectorDef.factory;
- }
- // InjectionTokens should have an ngInjectableDef and thus should be handled above.
- // If it's missing that, it's an error.
- if (token instanceof InjectionToken) {
- throw new Error("Token " + stringify$1(token) + " is missing an ngInjectableDef definition.");
- }
- // Undecorated types can sometimes be created if they have no constructor arguments.
- if (token instanceof Function) {
- return getUndecoratedInjectableFactory(token);
- }
- // There was no way to resolve a factory for this token.
- throw new Error('unreachable');
- }
- function getUndecoratedInjectableFactory(token) {
- // If the token has parameters then it has dependencies that we cannot resolve implicitly.
- var paramLength = token.length;
- if (paramLength > 0) {
- var args = new Array(paramLength).fill('?');
- throw new Error("Can't resolve all parameters for " + stringify$1(token) + ": (" + args.join(', ') + ").");
- }
- // The constructor function appears to have no parameters.
- // This might be because it inherits from a super-class. In which case, use an ngInjectableDef
- // from an ancestor if there is one.
- // Otherwise this really is a simple class with no dependencies, so return a factory that
- // just instantiates the zero-arg constructor.
- var inheritedInjectableDef = getInheritedInjectableDef(token);
- if (inheritedInjectableDef !== null) {
- return function () { return inheritedInjectableDef.factory(token); };
- }
- else {
- return function () { return new token(); };
- }
- }
- function providerToRecord(provider, ngModuleType, providers) {
- var factory = providerToFactory(provider, ngModuleType, providers);
- if (isValueProvider(provider)) {
- return makeRecord(undefined, provider.useValue);
- }
- else {
- return makeRecord(factory, NOT_YET);
- }
- }
- /**
- * Converts a `SingleProvider` into a factory function.
- *
- * @param provider provider to convert to factory
- */
- function providerToFactory(provider, ngModuleType, providers) {
- var factory = undefined;
- if (isTypeProvider(provider)) {
- return injectableDefOrInjectorDefFactory(resolveForwardRef$1(provider));
- }
- else {
- if (isValueProvider(provider)) {
- factory = function () { return resolveForwardRef$1(provider.useValue); };
- }
- else if (isExistingProvider(provider)) {
- factory = function () { return ɵɵinject(resolveForwardRef$1(provider.useExisting)); };
- }
- else if (isFactoryProvider(provider)) {
- factory = function () { return provider.useFactory.apply(provider, __spread(injectArgs(provider.deps || []))); };
- }
- else {
- var classRef_1 = resolveForwardRef$1(provider &&
- (provider.useClass || provider.provide));
- if (!classRef_1) {
- throwInvalidProviderError(ngModuleType, providers, provider);
- }
- if (hasDeps(provider)) {
- factory = function () { return new ((classRef_1).bind.apply((classRef_1), __spread([void 0], injectArgs(provider.deps))))(); };
- }
- else {
- return injectableDefOrInjectorDefFactory(classRef_1);
- }
- }
- }
- return factory;
- }
- function makeRecord(factory, value, multi) {
- if (multi === void 0) { multi = false; }
- return {
- factory: factory,
- value: value,
- multi: multi ? [] : undefined,
- };
- }
- function deepForEach(input, fn) {
- input.forEach(function (value) { return Array.isArray(value) ? deepForEach(value, fn) : fn(value); });
- }
- function isValueProvider(value) {
- return value !== null && typeof value == 'object' && USE_VALUE$2 in value;
- }
- function isExistingProvider(value) {
- return !!(value && value.useExisting);
- }
- function isFactoryProvider(value) {
- return !!(value && value.useFactory);
- }
- function isTypeProvider(value) {
- return typeof value === 'function';
- }
- function hasDeps(value) {
- return !!value.deps;
- }
- function hasOnDestroy(value) {
- return value !== null && typeof value === 'object' &&
- typeof value.ngOnDestroy === 'function';
- }
- function couldBeInjectableType(value) {
- return (typeof value === 'function') ||
- (typeof value === 'object' && value instanceof InjectionToken);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function INJECTOR_IMPL__PRE_R3__(providers, parent, name) {
- return new StaticInjector(providers, parent, name);
- }
- var INJECTOR_IMPL = INJECTOR_IMPL__PRE_R3__;
- /**
- * Concrete injectors implement this interface.
- *
- * For more details, see the ["Dependency Injection Guide"](guide/dependency-injection).
- *
- * @usageNotes
- * ### Example
- *
- * {@example core/di/ts/injector_spec.ts region='Injector'}
- *
- * `Injector` returns itself when given `Injector` as a token:
- *
- * {@example core/di/ts/injector_spec.ts region='injectInjector'}
- *
- * @publicApi
- */
- var Injector = /** @class */ (function () {
- function Injector() {
- }
- /**
- * Create a new Injector which is configure using `StaticProvider`s.
- *
- * @usageNotes
- * ### Example
- *
- * {@example core/di/ts/provider_spec.ts region='ConstructorProvider'}
- */
- Injector.create = function (options, parent) {
- if (Array.isArray(options)) {
- return INJECTOR_IMPL(options, parent, '');
- }
- else {
- return INJECTOR_IMPL(options.providers, options.parent, options.name || '');
- }
- };
- Injector.THROW_IF_NOT_FOUND = THROW_IF_NOT_FOUND;
- Injector.NULL = new NullInjector();
- /** @nocollapse */
- Injector.ngInjectableDef = ɵɵdefineInjectable({
- token: Injector,
- providedIn: 'any',
- factory: function () { return ɵɵinject(INJECTOR); },
- });
- /**
- * @internal
- * @nocollapse
- */
- Injector.__NG_ELEMENT_ID__ = -1;
- return Injector;
- }());
- var IDENT = function (value) {
- return value;
- };
- var EMPTY = [];
- var CIRCULAR$1 = IDENT;
- var MULTI_PROVIDER_FN = function () {
- return Array.prototype.slice.call(arguments);
- };
- var NO_NEW_LINE$1 = 'ɵ';
- var StaticInjector = /** @class */ (function () {
- function StaticInjector(providers, parent, source) {
- if (parent === void 0) { parent = Injector.NULL; }
- if (source === void 0) { source = null; }
- this.parent = parent;
- this.source = source;
- var records = this._records = new Map();
- records.set(Injector, { token: Injector, fn: IDENT, deps: EMPTY, value: this, useNew: false });
- records.set(INJECTOR, { token: INJECTOR, fn: IDENT, deps: EMPTY, value: this, useNew: false });
- recursivelyProcessProviders(records, providers);
- }
- StaticInjector.prototype.get = function (token, notFoundValue, flags) {
- if (flags === void 0) { flags = InjectFlags.Default; }
- var record = this._records.get(token);
- try {
- return tryResolveToken(token, record, this._records, this.parent, notFoundValue, flags);
- }
- catch (e) {
- return catchInjectorError(e, token, 'StaticInjectorError', this.source);
- }
- };
- StaticInjector.prototype.toString = function () {
- var tokens = [], records = this._records;
- records.forEach(function (v, token) { return tokens.push(stringify$1(token)); });
- return "StaticInjector[" + tokens.join(', ') + "]";
- };
- return StaticInjector;
- }());
- function resolveProvider(provider) {
- var deps = computeDeps(provider);
- var fn = IDENT;
- var value = EMPTY;
- var useNew = false;
- var provide = resolveForwardRef$1(provider.provide);
- if (USE_VALUE$2 in provider) {
- // We need to use USE_VALUE in provider since provider.useValue could be defined as undefined.
- value = provider.useValue;
- }
- else if (provider.useFactory) {
- fn = provider.useFactory;
- }
- else if (provider.useExisting) ;
- else if (provider.useClass) {
- useNew = true;
- fn = resolveForwardRef$1(provider.useClass);
- }
- else if (typeof provide == 'function') {
- useNew = true;
- fn = provide;
- }
- else {
- throw staticError('StaticProvider does not have [useValue|useFactory|useExisting|useClass] or [provide] is not newable', provider);
- }
- return { deps: deps, fn: fn, useNew: useNew, value: value };
- }
- function multiProviderMixError(token) {
- return staticError('Cannot mix multi providers and regular providers', token);
- }
- function recursivelyProcessProviders(records, provider) {
- if (provider) {
- provider = resolveForwardRef$1(provider);
- if (provider instanceof Array) {
- // if we have an array recurse into the array
- for (var i = 0; i < provider.length; i++) {
- recursivelyProcessProviders(records, provider[i]);
- }
- }
- else if (typeof provider === 'function') {
- // Functions were supported in ReflectiveInjector, but are not here. For safety give useful
- // error messages
- throw staticError('Function/Class not supported', provider);
- }
- else if (provider && typeof provider === 'object' && provider.provide) {
- // At this point we have what looks like a provider: {provide: ?, ....}
- var token = resolveForwardRef$1(provider.provide);
- var resolvedProvider = resolveProvider(provider);
- if (provider.multi === true) {
- // This is a multi provider.
- var multiProvider = records.get(token);
- if (multiProvider) {
- if (multiProvider.fn !== MULTI_PROVIDER_FN) {
- throw multiProviderMixError(token);
- }
- }
- else {
- // Create a placeholder factory which will look up the constituents of the multi provider.
- records.set(token, multiProvider = {
- token: provider.provide,
- deps: [],
- useNew: false,
- fn: MULTI_PROVIDER_FN,
- value: EMPTY
- });
- }
- // Treat the provider as the token.
- token = provider;
- multiProvider.deps.push({ token: token, options: 6 /* Default */ });
- }
- var record = records.get(token);
- if (record && record.fn == MULTI_PROVIDER_FN) {
- throw multiProviderMixError(token);
- }
- records.set(token, resolvedProvider);
- }
- else {
- throw staticError('Unexpected provider', provider);
- }
- }
- }
- function tryResolveToken(token, record, records, parent, notFoundValue, flags) {
- try {
- return resolveToken(token, record, records, parent, notFoundValue, flags);
- }
- catch (e) {
- // ensure that 'e' is of type Error.
- if (!(e instanceof Error)) {
- e = new Error(e);
- }
- var path = e[NG_TEMP_TOKEN_PATH] = e[NG_TEMP_TOKEN_PATH] || [];
- path.unshift(token);
- if (record && record.value == CIRCULAR$1) {
- // Reset the Circular flag.
- record.value = EMPTY;
- }
- throw e;
- }
- }
- function resolveToken(token, record, records, parent, notFoundValue, flags) {
- var _a;
- var value;
- if (record && !(flags & InjectFlags.SkipSelf)) {
- // If we don't have a record, this implies that we don't own the provider hence don't know how
- // to resolve it.
- value = record.value;
- if (value == CIRCULAR$1) {
- throw Error(NO_NEW_LINE$1 + 'Circular dependency');
- }
- else if (value === EMPTY) {
- record.value = CIRCULAR$1;
- var obj = undefined;
- var useNew = record.useNew;
- var fn = record.fn;
- var depRecords = record.deps;
- var deps = EMPTY;
- if (depRecords.length) {
- deps = [];
- for (var i = 0; i < depRecords.length; i++) {
- var depRecord = depRecords[i];
- var options = depRecord.options;
- var childRecord = options & 2 /* CheckSelf */ ? records.get(depRecord.token) : undefined;
- deps.push(tryResolveToken(
- // Current Token to resolve
- depRecord.token,
- // A record which describes how to resolve the token.
- // If undefined, this means we don't have such a record
- childRecord,
- // Other records we know about.
- records,
- // If we don't know how to resolve dependency and we should not check parent for it,
- // than pass in Null injector.
- !childRecord && !(options & 4 /* CheckParent */) ? Injector.NULL : parent, options & 1 /* Optional */ ? null : Injector.THROW_IF_NOT_FOUND, InjectFlags.Default));
- }
- }
- record.value = value = useNew ? new ((_a = fn).bind.apply(_a, __spread([void 0], deps)))() : fn.apply(obj, deps);
- }
- }
- else if (!(flags & InjectFlags.Self)) {
- value = parent.get(token, notFoundValue, InjectFlags.Default);
- }
- return value;
- }
- function computeDeps(provider) {
- var deps = EMPTY;
- var providerDeps = provider.deps;
- if (providerDeps && providerDeps.length) {
- deps = [];
- for (var i = 0; i < providerDeps.length; i++) {
- var options = 6 /* Default */;
- var token = resolveForwardRef$1(providerDeps[i]);
- if (token instanceof Array) {
- for (var j = 0, annotations = token; j < annotations.length; j++) {
- var annotation = annotations[j];
- if (annotation instanceof Optional || annotation == Optional) {
- options = options | 1 /* Optional */;
- }
- else if (annotation instanceof SkipSelf || annotation == SkipSelf) {
- options = options & ~2 /* CheckSelf */;
- }
- else if (annotation instanceof Self || annotation == Self) {
- options = options & ~4 /* CheckParent */;
- }
- else if (annotation instanceof Inject) {
- token = annotation.token;
- }
- else {
- token = resolveForwardRef$1(annotation);
- }
- }
- }
- deps.push({ token: token, options: options });
- }
- }
- else if (provider.useExisting) {
- var token = resolveForwardRef$1(provider.useExisting);
- deps = [{ token: token, options: 6 /* Default */ }];
- }
- else if (!providerDeps && !(USE_VALUE$2 in provider)) {
- // useValue & useExisting are the only ones which are exempt from deps all others need it.
- throw staticError('\'deps\' required', provider);
- }
- return deps;
- }
- function staticError(text, obj) {
- return new Error(formatError(text, obj, 'StaticInjectorError'));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ERROR_DEBUG_CONTEXT = 'ngDebugContext';
- var ERROR_ORIGINAL_ERROR = 'ngOriginalError';
- var ERROR_LOGGER = 'ngErrorLogger';
- function wrappedError(message, originalError) {
- var msg = message + " caused by: " + (originalError instanceof Error ? originalError.message : originalError);
- var error = Error(msg);
- error[ERROR_ORIGINAL_ERROR] = originalError;
- return error;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function findFirstClosedCycle(keys) {
- var res = [];
- for (var i = 0; i < keys.length; ++i) {
- if (res.indexOf(keys[i]) > -1) {
- res.push(keys[i]);
- return res;
- }
- res.push(keys[i]);
- }
- return res;
- }
- function constructResolvingPath(keys) {
- if (keys.length > 1) {
- var reversed = findFirstClosedCycle(keys.slice().reverse());
- var tokenStrs = reversed.map(function (k) { return stringify$1(k.token); });
- return ' (' + tokenStrs.join(' -> ') + ')';
- }
- return '';
- }
- function injectionError(injector, key, constructResolvingMessage, originalError) {
- var keys = [key];
- var errMsg = constructResolvingMessage(keys);
- var error = (originalError ? wrappedError(errMsg, originalError) : Error(errMsg));
- error.addKey = addKey;
- error.keys = keys;
- error.injectors = [injector];
- error.constructResolvingMessage = constructResolvingMessage;
- error[ERROR_ORIGINAL_ERROR] = originalError;
- return error;
- }
- function addKey(injector, key) {
- this.injectors.push(injector);
- this.keys.push(key);
- // Note: This updated message won't be reflected in the `.stack` property
- this.message = this.constructResolvingMessage(this.keys);
- }
- /**
- * Thrown when trying to retrieve a dependency by key from {@link Injector}, but the
- * {@link Injector} does not have a {@link Provider} for the given key.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * class A {
- * constructor(b:B) {}
- * }
- *
- * expect(() => Injector.resolveAndCreate([A])).toThrowError();
- * ```
- */
- function noProviderError(injector, key) {
- return injectionError(injector, key, function (keys) {
- var first = stringify$1(keys[0].token);
- return "No provider for " + first + "!" + constructResolvingPath(keys);
- });
- }
- /**
- * Thrown when dependencies form a cycle.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * var injector = Injector.resolveAndCreate([
- * {provide: "one", useFactory: (two) => "two", deps: [[new Inject("two")]]},
- * {provide: "two", useFactory: (one) => "one", deps: [[new Inject("one")]]}
- * ]);
- *
- * expect(() => injector.get("one")).toThrowError();
- * ```
- *
- * Retrieving `A` or `B` throws a `CyclicDependencyError` as the graph above cannot be constructed.
- */
- function cyclicDependencyError(injector, key) {
- return injectionError(injector, key, function (keys) {
- return "Cannot instantiate cyclic dependency!" + constructResolvingPath(keys);
- });
- }
- /**
- * Thrown when a constructing type returns with an Error.
- *
- * The `InstantiationError` class contains the original error plus the dependency graph which caused
- * this object to be instantiated.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * class A {
- * constructor() {
- * throw new Error('message');
- * }
- * }
- *
- * var injector = Injector.resolveAndCreate([A]);
- * try {
- * injector.get(A);
- * } catch (e) {
- * expect(e instanceof InstantiationError).toBe(true);
- * expect(e.originalException.message).toEqual("message");
- * expect(e.originalStack).toBeDefined();
- * }
- * ```
- */
- function instantiationError(injector, originalException, originalStack, key) {
- return injectionError(injector, key, function (keys) {
- var first = stringify$1(keys[0].token);
- return originalException.message + ": Error during instantiation of " + first + "!" + constructResolvingPath(keys) + ".";
- }, originalException);
- }
- /**
- * Thrown when an object other then {@link Provider} (or `Type`) is passed to {@link Injector}
- * creation.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * expect(() => Injector.resolveAndCreate(["not a type"])).toThrowError();
- * ```
- */
- function invalidProviderError(provider) {
- return Error("Invalid provider - only instances of Provider and Type are allowed, got: " + provider);
- }
- /**
- * Thrown when the class has no annotation information.
- *
- * Lack of annotation information prevents the {@link Injector} from determining which dependencies
- * need to be injected into the constructor.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * class A {
- * constructor(b) {}
- * }
- *
- * expect(() => Injector.resolveAndCreate([A])).toThrowError();
- * ```
- *
- * This error is also thrown when the class not marked with {@link Injectable} has parameter types.
- *
- * ```typescript
- * class B {}
- *
- * class A {
- * constructor(b:B) {} // no information about the parameter types of A is available at runtime.
- * }
- *
- * expect(() => Injector.resolveAndCreate([A,B])).toThrowError();
- * ```
- *
- */
- function noAnnotationError(typeOrFunc, params) {
- var signature = [];
- for (var i = 0, ii = params.length; i < ii; i++) {
- var parameter = params[i];
- if (!parameter || parameter.length == 0) {
- signature.push('?');
- }
- else {
- signature.push(parameter.map(stringify$1).join(' '));
- }
- }
- return Error('Cannot resolve all parameters for \'' + stringify$1(typeOrFunc) + '\'(' +
- signature.join(', ') + '). ' +
- 'Make sure that all the parameters are decorated with Inject or have valid type annotations and that \'' +
- stringify$1(typeOrFunc) + '\' is decorated with Injectable.');
- }
- /**
- * Thrown when getting an object by index.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * class A {}
- *
- * var injector = Injector.resolveAndCreate([A]);
- *
- * expect(() => injector.getAt(100)).toThrowError();
- * ```
- *
- */
- function outOfBoundsError(index) {
- return Error("Index " + index + " is out-of-bounds.");
- }
- // TODO: add a working example after alpha38 is released
- /**
- * Thrown when a multi provider and a regular provider are bound to the same token.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * expect(() => Injector.resolveAndCreate([
- * { provide: "Strings", useValue: "string1", multi: true},
- * { provide: "Strings", useValue: "string2", multi: false}
- * ])).toThrowError();
- * ```
- */
- function mixingMultiProvidersWithRegularProvidersError(provider1, provider2) {
- return Error("Cannot mix multi providers and regular providers, got: " + provider1 + " " + provider2);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A unique object used for retrieving items from the {@link ReflectiveInjector}.
- *
- * Keys have:
- * - a system-wide unique `id`.
- * - a `token`.
- *
- * `Key` is used internally by {@link ReflectiveInjector} because its system-wide unique `id` allows
- * the
- * injector to store created objects in a more efficient way.
- *
- * `Key` should not be created directly. {@link ReflectiveInjector} creates keys automatically when
- * resolving
- * providers.
- *
- * @deprecated No replacement
- * @publicApi
- */
- var ReflectiveKey = /** @class */ (function () {
- /**
- * Private
- */
- function ReflectiveKey(token, id) {
- this.token = token;
- this.id = id;
- if (!token) {
- throw new Error('Token must be defined!');
- }
- this.displayName = stringify$1(this.token);
- }
- /**
- * Retrieves a `Key` for a token.
- */
- ReflectiveKey.get = function (token) {
- return _globalKeyRegistry.get(resolveForwardRef$1(token));
- };
- Object.defineProperty(ReflectiveKey, "numberOfKeys", {
- /**
- * @returns the number of keys registered in the system.
- */
- get: function () { return _globalKeyRegistry.numberOfKeys; },
- enumerable: true,
- configurable: true
- });
- return ReflectiveKey;
- }());
- var KeyRegistry = /** @class */ (function () {
- function KeyRegistry() {
- this._allKeys = new Map();
- }
- KeyRegistry.prototype.get = function (token) {
- if (token instanceof ReflectiveKey)
- return token;
- if (this._allKeys.has(token)) {
- return this._allKeys.get(token);
- }
- var newKey = new ReflectiveKey(token, ReflectiveKey.numberOfKeys);
- this._allKeys.set(token, newKey);
- return newKey;
- };
- Object.defineProperty(KeyRegistry.prototype, "numberOfKeys", {
- get: function () { return this._allKeys.size; },
- enumerable: true,
- configurable: true
- });
- return KeyRegistry;
- }());
- var _globalKeyRegistry = new KeyRegistry();
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Provides access to reflection data about symbols. Used internally by Angular
- * to power dependency injection and compilation.
- */
- var Reflector = /** @class */ (function () {
- function Reflector(reflectionCapabilities) {
- this.reflectionCapabilities = reflectionCapabilities;
- }
- Reflector.prototype.updateCapabilities = function (caps) { this.reflectionCapabilities = caps; };
- Reflector.prototype.factory = function (type) { return this.reflectionCapabilities.factory(type); };
- Reflector.prototype.parameters = function (typeOrFunc) {
- return this.reflectionCapabilities.parameters(typeOrFunc);
- };
- Reflector.prototype.annotations = function (typeOrFunc) {
- return this.reflectionCapabilities.annotations(typeOrFunc);
- };
- Reflector.prototype.propMetadata = function (typeOrFunc) {
- return this.reflectionCapabilities.propMetadata(typeOrFunc);
- };
- Reflector.prototype.hasLifecycleHook = function (type, lcProperty) {
- return this.reflectionCapabilities.hasLifecycleHook(type, lcProperty);
- };
- Reflector.prototype.getter = function (name) { return this.reflectionCapabilities.getter(name); };
- Reflector.prototype.setter = function (name) { return this.reflectionCapabilities.setter(name); };
- Reflector.prototype.method = function (name) { return this.reflectionCapabilities.method(name); };
- Reflector.prototype.importUri = function (type) { return this.reflectionCapabilities.importUri(type); };
- Reflector.prototype.resourceUri = function (type) { return this.reflectionCapabilities.resourceUri(type); };
- Reflector.prototype.resolveIdentifier = function (name, moduleUrl, members, runtime) {
- return this.reflectionCapabilities.resolveIdentifier(name, moduleUrl, members, runtime);
- };
- Reflector.prototype.resolveEnum = function (identifier, name) {
- return this.reflectionCapabilities.resolveEnum(identifier, name);
- };
- return Reflector;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * The {@link Reflector} used internally in Angular to access metadata
- * about symbols.
- */
- var reflector = new Reflector(new ReflectionCapabilities());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * `Dependency` is used by the framework to extend DI.
- * This is internal to Angular and should not be used directly.
- */
- var ReflectiveDependency = /** @class */ (function () {
- function ReflectiveDependency(key, optional, visibility) {
- this.key = key;
- this.optional = optional;
- this.visibility = visibility;
- }
- ReflectiveDependency.fromKey = function (key) {
- return new ReflectiveDependency(key, false, null);
- };
- return ReflectiveDependency;
- }());
- var _EMPTY_LIST = [];
- var ResolvedReflectiveProvider_ = /** @class */ (function () {
- function ResolvedReflectiveProvider_(key, resolvedFactories, multiProvider) {
- this.key = key;
- this.resolvedFactories = resolvedFactories;
- this.multiProvider = multiProvider;
- this.resolvedFactory = this.resolvedFactories[0];
- }
- return ResolvedReflectiveProvider_;
- }());
- /**
- * An internal resolved representation of a factory function created by resolving `Provider`.
- * @publicApi
- */
- var ResolvedReflectiveFactory = /** @class */ (function () {
- function ResolvedReflectiveFactory(
- /**
- * Factory function which can return an instance of an object represented by a key.
- */
- factory,
- /**
- * Arguments (dependencies) to the `factory` function.
- */
- dependencies) {
- this.factory = factory;
- this.dependencies = dependencies;
- }
- return ResolvedReflectiveFactory;
- }());
- /**
- * Resolve a single provider.
- */
- function resolveReflectiveFactory(provider) {
- var factoryFn;
- var resolvedDeps;
- if (provider.useClass) {
- var useClass = resolveForwardRef$1(provider.useClass);
- factoryFn = reflector.factory(useClass);
- resolvedDeps = _dependenciesFor(useClass);
- }
- else if (provider.useExisting) {
- factoryFn = function (aliasInstance) { return aliasInstance; };
- resolvedDeps = [ReflectiveDependency.fromKey(ReflectiveKey.get(provider.useExisting))];
- }
- else if (provider.useFactory) {
- factoryFn = provider.useFactory;
- resolvedDeps = constructDependencies(provider.useFactory, provider.deps);
- }
- else {
- factoryFn = function () { return provider.useValue; };
- resolvedDeps = _EMPTY_LIST;
- }
- return new ResolvedReflectiveFactory(factoryFn, resolvedDeps);
- }
- /**
- * Converts the `Provider` into `ResolvedProvider`.
- *
- * `Injector` internally only uses `ResolvedProvider`, `Provider` contains convenience provider
- * syntax.
- */
- function resolveReflectiveProvider(provider) {
- return new ResolvedReflectiveProvider_(ReflectiveKey.get(provider.provide), [resolveReflectiveFactory(provider)], provider.multi || false);
- }
- /**
- * Resolve a list of Providers.
- */
- function resolveReflectiveProviders(providers) {
- var normalized = _normalizeProviders(providers, []);
- var resolved = normalized.map(resolveReflectiveProvider);
- var resolvedProviderMap = mergeResolvedReflectiveProviders(resolved, new Map());
- return Array.from(resolvedProviderMap.values());
- }
- /**
- * Merges a list of ResolvedProviders into a list where each key is contained exactly once and
- * multi providers have been merged.
- */
- function mergeResolvedReflectiveProviders(providers, normalizedProvidersMap) {
- for (var i = 0; i < providers.length; i++) {
- var provider = providers[i];
- var existing = normalizedProvidersMap.get(provider.key.id);
- if (existing) {
- if (provider.multiProvider !== existing.multiProvider) {
- throw mixingMultiProvidersWithRegularProvidersError(existing, provider);
- }
- if (provider.multiProvider) {
- for (var j = 0; j < provider.resolvedFactories.length; j++) {
- existing.resolvedFactories.push(provider.resolvedFactories[j]);
- }
- }
- else {
- normalizedProvidersMap.set(provider.key.id, provider);
- }
- }
- else {
- var resolvedProvider = void 0;
- if (provider.multiProvider) {
- resolvedProvider = new ResolvedReflectiveProvider_(provider.key, provider.resolvedFactories.slice(), provider.multiProvider);
- }
- else {
- resolvedProvider = provider;
- }
- normalizedProvidersMap.set(provider.key.id, resolvedProvider);
- }
- }
- return normalizedProvidersMap;
- }
- function _normalizeProviders(providers, res) {
- providers.forEach(function (b) {
- if (b instanceof Type$2) {
- res.push({ provide: b, useClass: b });
- }
- else if (b && typeof b == 'object' && b.provide !== undefined) {
- res.push(b);
- }
- else if (b instanceof Array) {
- _normalizeProviders(b, res);
- }
- else {
- throw invalidProviderError(b);
- }
- });
- return res;
- }
- function constructDependencies(typeOrFunc, dependencies) {
- if (!dependencies) {
- return _dependenciesFor(typeOrFunc);
- }
- else {
- var params_1 = dependencies.map(function (t) { return [t]; });
- return dependencies.map(function (t) { return _extractToken(typeOrFunc, t, params_1); });
- }
- }
- function _dependenciesFor(typeOrFunc) {
- var params = reflector.parameters(typeOrFunc);
- if (!params)
- return [];
- if (params.some(function (p) { return p == null; })) {
- throw noAnnotationError(typeOrFunc, params);
- }
- return params.map(function (p) { return _extractToken(typeOrFunc, p, params); });
- }
- function _extractToken(typeOrFunc, metadata, params) {
- var token = null;
- var optional = false;
- if (!Array.isArray(metadata)) {
- if (metadata instanceof Inject) {
- return _createDependency(metadata.token, optional, null);
- }
- else {
- return _createDependency(metadata, optional, null);
- }
- }
- var visibility = null;
- for (var i = 0; i < metadata.length; ++i) {
- var paramMetadata = metadata[i];
- if (paramMetadata instanceof Type$2) {
- token = paramMetadata;
- }
- else if (paramMetadata instanceof Inject) {
- token = paramMetadata.token;
- }
- else if (paramMetadata instanceof Optional) {
- optional = true;
- }
- else if (paramMetadata instanceof Self || paramMetadata instanceof SkipSelf) {
- visibility = paramMetadata;
- }
- else if (paramMetadata instanceof InjectionToken) {
- token = paramMetadata;
- }
- }
- token = resolveForwardRef$1(token);
- if (token != null) {
- return _createDependency(token, optional, visibility);
- }
- else {
- throw noAnnotationError(typeOrFunc, params);
- }
- }
- function _createDependency(token, optional, visibility) {
- return new ReflectiveDependency(ReflectiveKey.get(token), optional, visibility);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // Threshold for the dynamic version
- var UNDEFINED = new Object();
- /**
- * A ReflectiveDependency injection container used for instantiating objects and resolving
- * dependencies.
- *
- * An `Injector` is a replacement for a `new` operator, which can automatically resolve the
- * constructor dependencies.
- *
- * In typical use, application code asks for the dependencies in the constructor and they are
- * resolved by the `Injector`.
- *
- * @usageNotes
- * ### Example
- *
- * The following example creates an `Injector` configured to create `Engine` and `Car`.
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var injector = ReflectiveInjector.resolveAndCreate([Car, Engine]);
- * var car = injector.get(Car);
- * expect(car instanceof Car).toBe(true);
- * expect(car.engine instanceof Engine).toBe(true);
- * ```
- *
- * Notice, we don't use the `new` operator because we explicitly want to have the `Injector`
- * resolve all of the object's dependencies automatically.
- *
- * @deprecated from v5 - slow and brings in a lot of code, Use `Injector.create` instead.
- * @publicApi
- */
- var ReflectiveInjector = /** @class */ (function () {
- function ReflectiveInjector() {
- }
- /**
- * Turns an array of provider definitions into an array of resolved providers.
- *
- * A resolution is a process of flattening multiple nested arrays and converting individual
- * providers into an array of `ResolvedReflectiveProvider`s.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var providers = ReflectiveInjector.resolve([Car, [[Engine]]]);
- *
- * expect(providers.length).toEqual(2);
- *
- * expect(providers[0] instanceof ResolvedReflectiveProvider).toBe(true);
- * expect(providers[0].key.displayName).toBe("Car");
- * expect(providers[0].dependencies.length).toEqual(1);
- * expect(providers[0].factory).toBeDefined();
- *
- * expect(providers[1].key.displayName).toBe("Engine");
- * });
- * ```
- *
- */
- ReflectiveInjector.resolve = function (providers) {
- return resolveReflectiveProviders(providers);
- };
- /**
- * Resolves an array of providers and creates an injector from those providers.
- *
- * The passed-in providers can be an array of `Type`, `Provider`,
- * or a recursive array of more providers.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var injector = ReflectiveInjector.resolveAndCreate([Car, Engine]);
- * expect(injector.get(Car) instanceof Car).toBe(true);
- * ```
- */
- ReflectiveInjector.resolveAndCreate = function (providers, parent) {
- var ResolvedReflectiveProviders = ReflectiveInjector.resolve(providers);
- return ReflectiveInjector.fromResolvedProviders(ResolvedReflectiveProviders, parent);
- };
- /**
- * Creates an injector from previously resolved providers.
- *
- * This API is the recommended way to construct injectors in performance-sensitive parts.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * @Injectable()
- * class Engine {
- * }
- *
- * @Injectable()
- * class Car {
- * constructor(public engine:Engine) {}
- * }
- *
- * var providers = ReflectiveInjector.resolve([Car, Engine]);
- * var injector = ReflectiveInjector.fromResolvedProviders(providers);
- * expect(injector.get(Car) instanceof Car).toBe(true);
- * ```
- */
- ReflectiveInjector.fromResolvedProviders = function (providers, parent) {
- return new ReflectiveInjector_(providers, parent);
- };
- return ReflectiveInjector;
- }());
- var ReflectiveInjector_ = /** @class */ (function () {
- /**
- * Private
- */
- function ReflectiveInjector_(_providers, _parent) {
- /** @internal */
- this._constructionCounter = 0;
- this._providers = _providers;
- this.parent = _parent || null;
- var len = _providers.length;
- this.keyIds = new Array(len);
- this.objs = new Array(len);
- for (var i = 0; i < len; i++) {
- this.keyIds[i] = _providers[i].key.id;
- this.objs[i] = UNDEFINED;
- }
- }
- ReflectiveInjector_.prototype.get = function (token, notFoundValue) {
- if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }
- return this._getByKey(ReflectiveKey.get(token), null, notFoundValue);
- };
- ReflectiveInjector_.prototype.resolveAndCreateChild = function (providers) {
- var ResolvedReflectiveProviders = ReflectiveInjector.resolve(providers);
- return this.createChildFromResolved(ResolvedReflectiveProviders);
- };
- ReflectiveInjector_.prototype.createChildFromResolved = function (providers) {
- var inj = new ReflectiveInjector_(providers);
- inj.parent = this;
- return inj;
- };
- ReflectiveInjector_.prototype.resolveAndInstantiate = function (provider) {
- return this.instantiateResolved(ReflectiveInjector.resolve([provider])[0]);
- };
- ReflectiveInjector_.prototype.instantiateResolved = function (provider) {
- return this._instantiateProvider(provider);
- };
- ReflectiveInjector_.prototype.getProviderAtIndex = function (index) {
- if (index < 0 || index >= this._providers.length) {
- throw outOfBoundsError(index);
- }
- return this._providers[index];
- };
- /** @internal */
- ReflectiveInjector_.prototype._new = function (provider) {
- if (this._constructionCounter++ > this._getMaxNumberOfObjects()) {
- throw cyclicDependencyError(this, provider.key);
- }
- return this._instantiateProvider(provider);
- };
- ReflectiveInjector_.prototype._getMaxNumberOfObjects = function () { return this.objs.length; };
- ReflectiveInjector_.prototype._instantiateProvider = function (provider) {
- if (provider.multiProvider) {
- var res = new Array(provider.resolvedFactories.length);
- for (var i = 0; i < provider.resolvedFactories.length; ++i) {
- res[i] = this._instantiate(provider, provider.resolvedFactories[i]);
- }
- return res;
- }
- else {
- return this._instantiate(provider, provider.resolvedFactories[0]);
- }
- };
- ReflectiveInjector_.prototype._instantiate = function (provider, ResolvedReflectiveFactory) {
- var _this = this;
- var factory = ResolvedReflectiveFactory.factory;
- var deps;
- try {
- deps =
- ResolvedReflectiveFactory.dependencies.map(function (dep) { return _this._getByReflectiveDependency(dep); });
- }
- catch (e) {
- if (e.addKey) {
- e.addKey(this, provider.key);
- }
- throw e;
- }
- var obj;
- try {
- obj = factory.apply(void 0, __spread(deps));
- }
- catch (e) {
- throw instantiationError(this, e, e.stack, provider.key);
- }
- return obj;
- };
- ReflectiveInjector_.prototype._getByReflectiveDependency = function (dep) {
- return this._getByKey(dep.key, dep.visibility, dep.optional ? null : THROW_IF_NOT_FOUND);
- };
- ReflectiveInjector_.prototype._getByKey = function (key, visibility, notFoundValue) {
- if (key === ReflectiveInjector_.INJECTOR_KEY) {
- return this;
- }
- if (visibility instanceof Self) {
- return this._getByKeySelf(key, notFoundValue);
- }
- else {
- return this._getByKeyDefault(key, notFoundValue, visibility);
- }
- };
- ReflectiveInjector_.prototype._getObjByKeyId = function (keyId) {
- for (var i = 0; i < this.keyIds.length; i++) {
- if (this.keyIds[i] === keyId) {
- if (this.objs[i] === UNDEFINED) {
- this.objs[i] = this._new(this._providers[i]);
- }
- return this.objs[i];
- }
- }
- return UNDEFINED;
- };
- /** @internal */
- ReflectiveInjector_.prototype._throwOrNull = function (key, notFoundValue) {
- if (notFoundValue !== THROW_IF_NOT_FOUND) {
- return notFoundValue;
- }
- else {
- throw noProviderError(this, key);
- }
- };
- /** @internal */
- ReflectiveInjector_.prototype._getByKeySelf = function (key, notFoundValue) {
- var obj = this._getObjByKeyId(key.id);
- return (obj !== UNDEFINED) ? obj : this._throwOrNull(key, notFoundValue);
- };
- /** @internal */
- ReflectiveInjector_.prototype._getByKeyDefault = function (key, notFoundValue, visibility) {
- var inj;
- if (visibility instanceof SkipSelf) {
- inj = this.parent;
- }
- else {
- inj = this;
- }
- while (inj instanceof ReflectiveInjector_) {
- var inj_ = inj;
- var obj = inj_._getObjByKeyId(key.id);
- if (obj !== UNDEFINED)
- return obj;
- inj = inj_.parent;
- }
- if (inj !== null) {
- return inj.get(key.token, notFoundValue);
- }
- else {
- return this._throwOrNull(key, notFoundValue);
- }
- };
- Object.defineProperty(ReflectiveInjector_.prototype, "displayName", {
- get: function () {
- var providers = _mapProviders(this, function (b) { return ' "' + b.key.displayName + '" '; })
- .join(', ');
- return "ReflectiveInjector(providers: [" + providers + "])";
- },
- enumerable: true,
- configurable: true
- });
- ReflectiveInjector_.prototype.toString = function () { return this.displayName; };
- ReflectiveInjector_.INJECTOR_KEY = ReflectiveKey.get(Injector);
- return ReflectiveInjector_;
- }());
- function _mapProviders(injector, fn) {
- var res = new Array(injector._providers.length);
- for (var i = 0; i < injector._providers.length; ++i) {
- res[i] = fn(injector.getProviderAtIndex(i));
- }
- return res;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A DI token that you can use to create a virtual [provider](guide/glossary#provider)
- * that will populate the `entryComponents` field of components and NgModules
- * based on its `useValue` property value.
- * All components that are referenced in the `useValue` value (either directly
- * or in a nested array or map) are added to the `entryComponents` property.
- *
- * @usageNotes
- *
- * The following example shows how the router can populate the `entryComponents`
- * field of an NgModule based on a router configuration that refers
- * to components.
- *
- * ```typescript
- * // helper function inside the router
- * function provideRoutes(routes) {
- * return [
- * {provide: ROUTES, useValue: routes},
- * {provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: routes, multi: true}
- * ];
- * }
- *
- * // user code
- * let routes = [
- * {path: '/root', component: RootComp},
- * {path: '/teams', component: TeamsComp}
- * ];
- *
- * @NgModule({
- * providers: [provideRoutes(routes)]
- * })
- * class ModuleWithRoutes {}
- * ```
- *
- * @publicApi
- */
- var ANALYZE_FOR_ENTRY_COMPONENTS = new InjectionToken('AnalyzeForEntryComponents');
- /**
- * Base class for query metadata.
- *
- * @see `ContentChildren`.
- * @see `ContentChild`.
- * @see `ViewChildren`.
- * @see `ViewChild`.
- *
- * @publicApi
- */
- var Query = /** @class */ (function () {
- function Query() {
- }
- return Query;
- }());
- var ɵ0$5 = function (selector, data) {
- if (data === void 0) { data = {}; }
- return (__assign({ selector: selector, first: false, isViewQuery: false, descendants: false }, data));
- };
- /**
- * ContentChildren decorator and metadata.
- *
- *
- * @Annotation
- * @publicApi
- */
- var ContentChildren = makePropDecorator('ContentChildren', ɵ0$5, Query);
- var ɵ1$1 = function (selector, data) {
- if (data === void 0) { data = {}; }
- return (__assign({ selector: selector, first: true, isViewQuery: false, descendants: true }, data));
- };
- /**
- * ContentChild decorator and metadata.
- *
- *
- * @Annotation
- *
- * @publicApi
- */
- var ContentChild = makePropDecorator('ContentChild', ɵ1$1, Query);
- var ɵ2 = function (selector, data) {
- if (data === void 0) { data = {}; }
- return (__assign({ selector: selector, first: false, isViewQuery: true, descendants: true }, data));
- };
- /**
- * ViewChildren decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var ViewChildren = makePropDecorator('ViewChildren', ɵ2, Query);
- var ɵ3 = function (selector, data) {
- return (__assign({ selector: selector, first: true, isViewQuery: true, descendants: true }, data));
- };
- /**
- * ViewChild decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var ViewChild = makePropDecorator('ViewChild', ɵ3, Query);
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * The strategy that the default change detector uses to detect changes.
- * When set, takes effect the next time change detection is triggered.
- *
- * @publicApi
- */
- var ChangeDetectionStrategy$1;
- (function (ChangeDetectionStrategy) {
- /**
- * Use the `CheckOnce` strategy, meaning that automatic change detection is deactivated
- * until reactivated by setting the strategy to `Default` (`CheckAlways`).
- * Change detection can still be explicitly invoked.
- * This strategy applies to all child directives and cannot be overridden.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush";
- /**
- * Use the default `CheckAlways` strategy, in which change detection is automatic until
- * explicitly deactivated.
- */
- ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default";
- })(ChangeDetectionStrategy$1 || (ChangeDetectionStrategy$1 = {}));
- /**
- * Defines the possible states of the default change detector.
- * @see `ChangeDetectorRef`
- */
- var ChangeDetectorStatus;
- (function (ChangeDetectorStatus) {
- /**
- * A state in which, after calling `detectChanges()`, the change detector
- * state becomes `Checked`, and must be explicitly invoked or reactivated.
- */
- ChangeDetectorStatus[ChangeDetectorStatus["CheckOnce"] = 0] = "CheckOnce";
- /**
- * A state in which change detection is skipped until the change detector mode
- * becomes `CheckOnce`.
- */
- ChangeDetectorStatus[ChangeDetectorStatus["Checked"] = 1] = "Checked";
- /**
- * A state in which change detection continues automatically until explicitly
- * deactivated.
- */
- ChangeDetectorStatus[ChangeDetectorStatus["CheckAlways"] = 2] = "CheckAlways";
- /**
- * A state in which a change detector sub tree is not a part of the main tree and
- * should be skipped.
- */
- ChangeDetectorStatus[ChangeDetectorStatus["Detached"] = 3] = "Detached";
- /**
- * Indicates that the change detector encountered an error checking a binding
- * or calling a directive lifecycle method and is now in an inconsistent state. Change
- * detectors in this state do not detect changes.
- */
- ChangeDetectorStatus[ChangeDetectorStatus["Errored"] = 4] = "Errored";
- /**
- * Indicates that the change detector has been destroyed.
- */
- ChangeDetectorStatus[ChangeDetectorStatus["Destroyed"] = 5] = "Destroyed";
- })(ChangeDetectorStatus || (ChangeDetectorStatus = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Defines template and style encapsulation options available for Component's {@link Component}.
- *
- * See {@link Component#encapsulation encapsulation}.
- *
- * @usageNotes
- * ### Example
- *
- * {@example core/ts/metadata/encapsulation.ts region='longform'}
- *
- * @publicApi
- */
- var ViewEncapsulation$1;
- (function (ViewEncapsulation) {
- /**
- * Emulate `Native` scoping of styles by adding an attribute containing surrogate id to the Host
- * Element and pre-processing the style rules provided via {@link Component#styles styles} or
- * {@link Component#styleUrls styleUrls}, and adding the new Host Element attribute to all
- * selectors.
- *
- * This is the default option.
- */
- ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
- /**
- * @deprecated v6.1.0 - use {ViewEncapsulation.ShadowDom} instead.
- * Use the native encapsulation mechanism of the renderer.
- *
- * For the DOM this means using the deprecated [Shadow DOM
- * v0](https://w3c.github.io/webcomponents/spec/shadow/) and
- * creating a ShadowRoot for Component's Host Element.
- */
- ViewEncapsulation[ViewEncapsulation["Native"] = 1] = "Native";
- /**
- * Don't provide any template or style encapsulation.
- */
- ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
- /**
- * Use Shadow DOM to encapsulate styles.
- *
- * For the DOM this means using modern [Shadow
- * DOM](https://w3c.github.io/webcomponents/spec/shadow/) and
- * creating a ShadowRoot for Component's Host Element.
- */
- ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";
- })(ViewEncapsulation$1 || (ViewEncapsulation$1 = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * This file contains reuseable "empty" symbols that can be used as default return values
- * in different parts of the rendering code. Because the same symbols are returned, this
- * allows for identity checks against these values to be consistently used by the framework
- * code.
- */
- var EMPTY_OBJ = {};
- var EMPTY_ARRAY$3 = [];
- // freezing the values prevents any code from accidentally inserting new values in
- if (typeof ngDevMode !== 'undefined' && ngDevMode) {
- // These property accesses can be ignored because ngDevMode will be set to false
- // when optimizing code and the whole if statement will be dropped.
- // tslint:disable-next-line:no-toplevel-property-access
- Object.freeze(EMPTY_OBJ);
- // tslint:disable-next-line:no-toplevel-property-access
- Object.freeze(EMPTY_ARRAY$3);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var NG_COMPONENT_DEF = getClosureSafeProperty({ ngComponentDef: getClosureSafeProperty });
- var NG_DIRECTIVE_DEF = getClosureSafeProperty({ ngDirectiveDef: getClosureSafeProperty });
- var NG_PIPE_DEF = getClosureSafeProperty({ ngPipeDef: getClosureSafeProperty });
- var NG_MODULE_DEF = getClosureSafeProperty({ ngModuleDef: getClosureSafeProperty });
- var NG_LOCALE_ID_DEF = getClosureSafeProperty({ ngLocaleIdDef: getClosureSafeProperty });
- var NG_BASE_DEF = getClosureSafeProperty({ ngBaseDef: getClosureSafeProperty });
- /**
- * If a directive is diPublic, bloomAdd sets a property on the type with this constant as
- * the key and the directive's unique ID as the value. This allows us to map directives to their
- * bloom filter bit for DI.
- */
- // TODO(misko): This is wrong. The NG_ELEMENT_ID should never be minified.
- var NG_ELEMENT_ID = getClosureSafeProperty({ __NG_ELEMENT_ID__: getClosureSafeProperty });
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * The following getter methods retrieve the definition form the type. Currently the retrieval
- * honors inheritance, but in the future we may change the rule to require that definitions are
- * explicit. This would require some sort of migration strategy.
- */
- function getComponentDef(type) {
- return type[NG_COMPONENT_DEF] || null;
- }
- function getNgModuleDef(type, throwNotFound) {
- var ngModuleDef = type[NG_MODULE_DEF] || null;
- if (!ngModuleDef && throwNotFound === true) {
- throw new Error("Type " + stringify$1(type) + " does not have 'ngModuleDef' property.");
- }
- return ngModuleDef;
- }
- function getNgLocaleIdDef(type) {
- return type[NG_LOCALE_ID_DEF] || null;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Used for stringify render output in Ivy.
- * Important! This function is very performance-sensitive and we should
- * be extra careful not to introduce megamorphic reads in it.
- */
- function renderStringify(value) {
- if (typeof value === 'string')
- return value;
- if (value == null)
- return '';
- return '' + value;
- }
- /**
- * Used to stringify a value so that it can be displayed in an error message.
- * Important! This function contains a megamorphic read and should only be
- * used for error messages.
- */
- function stringifyForError(value) {
- if (typeof value === 'function')
- return value.name || value.toString();
- if (typeof value === 'object' && value != null && typeof value.type === 'function') {
- return value.type.name || value.type.toString();
- }
- return renderStringify(value);
- }
- var ɵ0$6 = function () {
- return (typeof requestAnimationFrame !== 'undefined' && requestAnimationFrame || // browser only
- setTimeout // everything else
- ).bind(_global$1);
- };
- var defaultScheduler = (ɵ0$6)();
- /**
- * The special delimiter we use to separate property names, prefixes, and suffixes
- * in property binding metadata. See storeBindingMetadata().
- *
- * We intentionally use the Unicode "REPLACEMENT CHARACTER" (U+FFFD) as a delimiter
- * because it is a very uncommon character that is unlikely to be part of a user's
- * property names or interpolation strings. If it is in fact used in a property
- * binding, DebugElement.properties will not return the correct value for that
- * binding. However, there should be no runtime effect for real applications.
- *
- * This character is typically rendered as a question mark inside of a diamond.
- * See https://en.wikipedia.org/wiki/Specials_(Unicode_block)
- *
- */
- var INTERPOLATION_DELIMITER = "\uFFFD";
- /**
- * Determines whether or not the given string is a property metadata string.
- * See storeBindingMetadata().
- */
- function isPropMetadataString(str) {
- return str.indexOf(INTERPOLATION_DELIMITER) >= 0;
- }
- /**
- * Unwrap a value which might be behind a closure (for forward declaration reasons).
- */
- function maybeUnwrapFn(value) {
- if (value instanceof Function) {
- return value();
- }
- else {
- return value;
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // Below are constants for LView indices to help us look up LView members
- // without having to remember the specific indices.
- // Uglify will inline these when minifying so there shouldn't be a cost.
- var HOST = 0;
- var TVIEW = 1;
- var FLAGS = 2;
- var PARENT = 3;
- var NEXT = 4;
- var QUERIES = 5;
- var T_HOST = 6;
- var BINDING_INDEX = 7;
- var CLEANUP = 8;
- var CONTEXT = 9;
- var INJECTOR$1 = 10;
- var RENDERER_FACTORY = 11;
- var RENDERER = 12;
- var SANITIZER = 13;
- var CHILD_HEAD = 14;
- var CHILD_TAIL = 15;
- var CONTENT_QUERIES = 16;
- var DECLARATION_VIEW = 17;
- var PREORDER_HOOK_FLAGS = 18;
- /** Size of LView's header. Necessary to adjust for it when setting slots. */
- var HEADER_OFFSET = 20;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function assertEqual(actual, expected, msg) {
- if (actual != expected) {
- throwError(msg);
- }
- }
- function assertNotEqual(actual, expected, msg) {
- if (actual == expected) {
- throwError(msg);
- }
- }
- function assertLessThan(actual, expected, msg) {
- if (actual >= expected) {
- throwError(msg);
- }
- }
- function assertGreaterThan(actual, expected, msg) {
- if (actual <= expected) {
- throwError(msg);
- }
- }
- function assertDefined(actual, msg) {
- if (actual == null) {
- throwError(msg);
- }
- }
- function throwError(msg) {
- // tslint:disable-next-line
- debugger; // Left intentionally for better debugger experience.
- throw new Error("ASSERTION ERROR: " + msg);
- }
- function assertDomNode(node) {
- // If we're in a worker, `Node` will not be defined.
- assertEqual((typeof Node !== 'undefined' && node instanceof Node) ||
- (typeof node === 'object' && node.constructor.name === 'WebWorkerRenderNode'), true, "The provided value must be an instance of a DOM Node but got " + stringify$1(node));
- }
- function assertDataInRange(arr, index) {
- var maxLen = arr ? arr.length : 0;
- assertLessThan(index, maxLen, "Index expected to be less than " + maxLen + " but got " + index);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Special location which allows easy identification of type. If we have an array which was
- * retrieved from the `LView` and that array has `true` at `TYPE` location, we know it is
- * `LContainer`.
- */
- var TYPE = 1;
- /**
- * Below are constants for LContainer indices to help us look up LContainer members
- * without having to remember the specific indices.
- * Uglify will inline these when minifying so there shouldn't be a cost.
- */
- var ACTIVE_INDEX = 2;
- // PARENT, NEXT, QUERIES and T_HOST are indices 3, 4, 5 and 6.
- // As we already have these constants in LView, we don't need to re-create them.
- var NATIVE = 7;
- /**
- * Size of LContainer's header. Represents the index after which all views in the
- * container will be inserted. We need to keep a record of current views so we know
- * which views are already in the DOM (and don't need to be re-added) and so we can
- * remove views from the DOM when they are no longer required.
- */
- var CONTAINER_HEADER_OFFSET = 9;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * This property will be monkey-patched on elements, components and directives
- */
- var MONKEY_PATCH_KEY_NAME = '__ngContext__';
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * For efficiency reasons we often put several different data types (`RNode`, `LView`, `LContainer`,
- * `StylingContext`) in same location in `LView`. This is because we don't want to pre-allocate
- * space for it because the storage is sparse. This file contains utilities for dealing with such
- * data types.
- *
- * How do we know what is stored at a given location in `LView`.
- * - `Array.isArray(value) === false` => `RNode` (The normal storage value)
- * - `Array.isArray(value) === true` => then the `value[0]` represents the wrapped value.
- * - `typeof value[TYPE] === 'object'` => `LView`
- * - This happens when we have a component at a given location
- * - `typeof value[TYPE] === 'number'` => `StylingContext`
- * - This happens when we have style/class binding at a given location.
- * - `typeof value[TYPE] === true` => `LContainer`
- * - This happens when we have `LContainer` binding at a given location.
- *
- *
- * NOTE: it is assumed that `Array.isArray` and `typeof` operations are very efficient.
- */
- /**
- * Returns `RNode`.
- * @param value wrapped value of `RNode`, `LView`, `LContainer`, `StylingContext`
- */
- function unwrapRNode(value) {
- while (Array.isArray(value)) {
- value = value[HOST];
- }
- return value;
- }
- /**
- * True if `value` is `LView`.
- * @param value wrapped value of `RNode`, `LView`, `LContainer`, `StylingContext`
- */
- function isLView(value) {
- return Array.isArray(value) && typeof value[TYPE] === 'object';
- }
- /**
- * True if `value` is `LContainer`.
- * @param value wrapped value of `RNode`, `LView`, `LContainer`, `StylingContext`
- */
- function isLContainer(value) {
- return Array.isArray(value) && value[TYPE] === true;
- }
- /**
- * True if `value` is `StylingContext`.
- * @param value wrapped value of `RNode`, `LView`, `LContainer`, `StylingContext`
- */
- function isStylingContext(value) {
- return Array.isArray(value) && typeof value[TYPE] === 'number';
- }
- function getNativeByTNode(tNode, hostView) {
- return unwrapRNode(hostView[tNode.index]);
- }
- function getTNode(index, view) {
- ngDevMode && assertGreaterThan(index, -1, 'wrong index for TNode');
- ngDevMode && assertLessThan(index, view[TVIEW].data.length, 'wrong index for TNode');
- return view[TVIEW].data[index + HEADER_OFFSET];
- }
- function getComponentViewByIndex(nodeIndex, hostView) {
- // Could be an LView or an LContainer. If LContainer, unwrap to find LView.
- var slotValue = hostView[nodeIndex];
- var lView = isLView(slotValue) ? slotValue : slotValue[HOST];
- return lView;
- }
- function isComponent(tNode) {
- return (tNode.flags & 1 /* isComponent */) === 1 /* isComponent */;
- }
- function isComponentDef(def) {
- return def.template !== null;
- }
- function isRootView(target) {
- return (target[FLAGS] & 512 /* IsRoot */) !== 0;
- }
- /**
- * Returns the monkey-patch value data present on the target (which could be
- * a component, directive or a DOM node).
- */
- function readPatchedData(target) {
- ngDevMode && assertDefined(target, 'Target expected');
- return target[MONKEY_PATCH_KEY_NAME];
- }
- function readPatchedLView(target) {
- var value = readPatchedData(target);
- if (value) {
- return Array.isArray(value) ? value : value.lView;
- }
- return null;
- }
- /**
- * Returns a boolean for whether the view is attached to the change detection tree.
- *
- * Note: This determines whether a view should be checked, not whether it's inserted
- * into a container. For that, you'll want `viewAttachedToContainer` below.
- */
- function viewAttachedToChangeDetector(view) {
- return (view[FLAGS] & 128 /* Attached */) === 128 /* Attached */;
- }
- /** Returns a boolean for whether the view is attached to a container. */
- function viewAttachedToContainer(view) {
- return isLContainer(view[PARENT]);
- }
- /**
- * Resets the pre-order hook flags of the view.
- * @param lView the LView on which the flags are reset
- */
- function resetPreOrderHookFlags(lView) {
- lView[PREORDER_HOOK_FLAGS] = 0;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function assertComponentType(actual, msg) {
- if (msg === void 0) { msg = 'Type passed in is not ComponentType, it does not have \'ngComponentDef\' property.'; }
- if (!getComponentDef(actual)) {
- throwError(msg);
- }
- }
- function assertPreviousIsParent(isParent) {
- assertEqual(isParent, true, 'previousOrParentTNode should be a parent');
- }
- function assertLContainer(value) {
- assertDefined(value, 'LContainer must be defined');
- assertEqual(isLContainer(value), true, 'Expecting LContainer');
- }
- function assertLViewOrUndefined(value) {
- value && assertEqual(isLView(value), true, 'Expecting LView or undefined or null');
- }
- function assertLView(value) {
- assertDefined(value, 'LView must be defined');
- assertEqual(isLView(value), true, 'Expecting LView');
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Adds all directive lifecycle hooks from the given `DirectiveDef` to the given `TView`.
- *
- * Must be run *only* on the first template pass.
- *
- * Sets up the pre-order hooks on the provided `tView`,
- * see {@link HookData} for details about the data structure.
- *
- * @param directiveIndex The index of the directive in LView
- * @param directiveDef The definition containing the hooks to setup in tView
- * @param tView The current TView
- * @param nodeIndex The index of the node to which the directive is attached
- * @param initialPreOrderHooksLength the number of pre-order hooks already registered before the
- * current process, used to know if the node index has to be added to the array. If it is -1,
- * the node index is never added.
- * @param initialPreOrderCheckHooksLength same as previous for pre-order check hooks
- */
- function registerPreOrderHooks(directiveIndex, directiveDef, tView, nodeIndex, initialPreOrderHooksLength, initialPreOrderCheckHooksLength) {
- ngDevMode &&
- assertEqual(tView.firstTemplatePass, true, 'Should only be called on first template pass');
- var onChanges = directiveDef.onChanges, onInit = directiveDef.onInit, doCheck = directiveDef.doCheck;
- if (initialPreOrderHooksLength >= 0 &&
- (!tView.preOrderHooks || initialPreOrderHooksLength === tView.preOrderHooks.length) &&
- (onChanges || onInit || doCheck)) {
- (tView.preOrderHooks || (tView.preOrderHooks = [])).push(nodeIndex);
- }
- if (initialPreOrderCheckHooksLength >= 0 &&
- (!tView.preOrderCheckHooks ||
- initialPreOrderCheckHooksLength === tView.preOrderCheckHooks.length) &&
- (onChanges || doCheck)) {
- (tView.preOrderCheckHooks || (tView.preOrderCheckHooks = [])).push(nodeIndex);
- }
- if (onChanges) {
- (tView.preOrderHooks || (tView.preOrderHooks = [])).push(directiveIndex, onChanges);
- (tView.preOrderCheckHooks || (tView.preOrderCheckHooks = [])).push(directiveIndex, onChanges);
- }
- if (onInit) {
- (tView.preOrderHooks || (tView.preOrderHooks = [])).push(-directiveIndex, onInit);
- }
- if (doCheck) {
- (tView.preOrderHooks || (tView.preOrderHooks = [])).push(directiveIndex, doCheck);
- (tView.preOrderCheckHooks || (tView.preOrderCheckHooks = [])).push(directiveIndex, doCheck);
- }
- }
- /**
- *
- * Loops through the directives on the provided `tNode` and queues hooks to be
- * run that are not initialization hooks.
- *
- * Should be executed during `elementEnd()` and similar to
- * preserve hook execution order. Content, view, and destroy hooks for projected
- * components and directives must be called *before* their hosts.
- *
- * Sets up the content, view, and destroy hooks on the provided `tView`,
- * see {@link HookData} for details about the data structure.
- *
- * NOTE: This does not set up `onChanges`, `onInit` or `doCheck`, those are set up
- * separately at `elementStart`.
- *
- * @param tView The current TView
- * @param tNode The TNode whose directives are to be searched for hooks to queue
- */
- function registerPostOrderHooks(tView, tNode) {
- if (tView.firstTemplatePass) {
- // It's necessary to loop through the directives at elementEnd() (rather than processing in
- // directiveCreate) so we can preserve the current hook order. Content, view, and destroy
- // hooks for projected components and directives must be called *before* their hosts.
- for (var i = tNode.directiveStart, end = tNode.directiveEnd; i < end; i++) {
- var directiveDef = tView.data[i];
- if (directiveDef.afterContentInit) {
- (tView.contentHooks || (tView.contentHooks = [])).push(-i, directiveDef.afterContentInit);
- }
- if (directiveDef.afterContentChecked) {
- (tView.contentHooks || (tView.contentHooks = [])).push(i, directiveDef.afterContentChecked);
- (tView.contentCheckHooks || (tView.contentCheckHooks = [])).push(i, directiveDef.afterContentChecked);
- }
- if (directiveDef.afterViewInit) {
- (tView.viewHooks || (tView.viewHooks = [])).push(-i, directiveDef.afterViewInit);
- }
- if (directiveDef.afterViewChecked) {
- (tView.viewHooks || (tView.viewHooks = [])).push(i, directiveDef.afterViewChecked);
- (tView.viewCheckHooks || (tView.viewCheckHooks = [])).push(i, directiveDef.afterViewChecked);
- }
- if (directiveDef.onDestroy != null) {
- (tView.destroyHooks || (tView.destroyHooks = [])).push(i, directiveDef.onDestroy);
- }
- }
- }
- }
- /**
- * Executing hooks requires complex logic as we need to deal with 2 constraints.
- *
- * 1. Init hooks (ngOnInit, ngAfterContentInit, ngAfterViewInit) must all be executed once and only
- * once, across many change detection cycles. This must be true even if some hooks throw, or if
- * some recursively trigger a change detection cycle.
- * To solve that, it is required to track the state of the execution of these init hooks.
- * This is done by storing and maintaining flags in the view: the {@link InitPhaseState},
- * and the index within that phase. They can be seen as a cursor in the following structure:
- * [[onInit1, onInit2], [afterContentInit1], [afterViewInit1, afterViewInit2, afterViewInit3]]
- * They are are stored as flags in LView[FLAGS].
- *
- * 2. Pre-order hooks can be executed in batches, because of the select instruction.
- * To be able to pause and resume their execution, we also need some state about the hook's array
- * that is being processed:
- * - the index of the next hook to be executed
- * - the number of init hooks already found in the processed part of the array
- * They are are stored as flags in LView[PREORDER_HOOK_FLAGS].
- */
- /**
- * Executes necessary hooks at the start of executing a template.
- *
- * Executes hooks that are to be run during the initialization of a directive such
- * as `onChanges`, `onInit`, and `doCheck`.
- *
- * @param lView The current view
- * @param tView Static data for the view containing the hooks to be executed
- * @param checkNoChangesMode Whether or not we're in checkNoChanges mode.
- * @param @param currentNodeIndex 2 cases depending the the value:
- * - undefined: execute hooks only from the saved index until the end of the array (pre-order case,
- * when flushing the remaining hooks)
- * - number: execute hooks only from the saved index until that node index exclusive (pre-order
- * case, when executing select(number))
- */
- function executePreOrderHooks(currentView, tView, checkNoChangesMode, currentNodeIndex) {
- if (!checkNoChangesMode) {
- executeHooks(currentView, tView.preOrderHooks, tView.preOrderCheckHooks, checkNoChangesMode, 0 /* OnInitHooksToBeRun */, currentNodeIndex !== undefined ? currentNodeIndex : null);
- }
- }
- /**
- * Executes hooks against the given `LView` based off of whether or not
- * This is the first pass.
- *
- * @param currentView The view instance data to run the hooks against
- * @param firstPassHooks An array of hooks to run if we're in the first view pass
- * @param checkHooks An Array of hooks to run if we're not in the first view pass.
- * @param checkNoChangesMode Whether or not we're in no changes mode.
- * @param initPhaseState the current state of the init phase
- * @param currentNodeIndex 3 cases depending the the value:
- * - undefined: all hooks from the array should be executed (post-order case)
- * - null: execute hooks only from the saved index until the end of the array (pre-order case, when
- * flushing the remaining hooks)
- * - number: execute hooks only from the saved index until that node index exclusive (pre-order
- * case, when executing select(number))
- */
- function executeHooks(currentView, firstPassHooks, checkHooks, checkNoChangesMode, initPhaseState, currentNodeIndex) {
- if (checkNoChangesMode)
- return;
- var hooksToCall = (currentView[FLAGS] & 3 /* InitPhaseStateMask */) === initPhaseState ?
- firstPassHooks :
- checkHooks;
- if (hooksToCall) {
- callHooks(currentView, hooksToCall, initPhaseState, currentNodeIndex);
- }
- // The init phase state must be always checked here as it may have been recursively updated
- if (currentNodeIndex == null &&
- (currentView[FLAGS] & 3 /* InitPhaseStateMask */) === initPhaseState &&
- initPhaseState !== 3 /* InitPhaseCompleted */) {
- currentView[FLAGS] &= 1023 /* IndexWithinInitPhaseReset */;
- currentView[FLAGS] += 1 /* InitPhaseStateIncrementer */;
- }
- }
- /**
- * Calls lifecycle hooks with their contexts, skipping init hooks if it's not
- * the first LView pass
- *
- * @param currentView The current view
- * @param arr The array in which the hooks are found
- * @param initPhaseState the current state of the init phase
- * @param currentNodeIndex 3 cases depending the the value:
- * - undefined: all hooks from the array should be executed (post-order case)
- * - null: execute hooks only from the saved index until the end of the array (pre-order case, when
- * flushing the remaining hooks)
- * - number: execute hooks only from the saved index until that node index exclusive (pre-order
- * case, when executing select(number))
- */
- function callHooks(currentView, arr, initPhase, currentNodeIndex) {
- var startIndex = currentNodeIndex !== undefined ?
- (currentView[PREORDER_HOOK_FLAGS] & 65535 /* IndexOfTheNextPreOrderHookMaskMask */) :
- 0;
- var nodeIndexLimit = currentNodeIndex != null ? currentNodeIndex : -1;
- var lastNodeIndexFound = 0;
- for (var i = startIndex; i < arr.length; i++) {
- var hook = arr[i + 1];
- if (typeof hook === 'number') {
- lastNodeIndexFound = arr[i];
- if (currentNodeIndex != null && lastNodeIndexFound >= currentNodeIndex) {
- break;
- }
- }
- else {
- var isInitHook = arr[i] < 0;
- if (isInitHook)
- currentView[PREORDER_HOOK_FLAGS] += 65536 /* NumberOfInitHooksCalledIncrementer */;
- if (lastNodeIndexFound < nodeIndexLimit || nodeIndexLimit == -1) {
- callHook(currentView, initPhase, arr, i);
- currentView[PREORDER_HOOK_FLAGS] =
- (currentView[PREORDER_HOOK_FLAGS] & 4294901760 /* NumberOfInitHooksCalledMask */) + i +
- 2;
- }
- i++;
- }
- }
- }
- /**
- * Execute one hook against the current `LView`.
- *
- * @param currentView The current view
- * @param initPhaseState the current state of the init phase
- * @param arr The array in which the hooks are found
- * @param i The current index within the hook data array
- */
- function callHook(currentView, initPhase, arr, i) {
- var isInitHook = arr[i] < 0;
- var hook = arr[i + 1];
- var directiveIndex = isInitHook ? -arr[i] : arr[i];
- var directive = currentView[directiveIndex];
- if (isInitHook) {
- var indexWithintInitPhase = currentView[FLAGS] >> 10 /* IndexWithinInitPhaseShift */;
- // The init phase state must be always checked here as it may have been recursively
- // updated
- if (indexWithintInitPhase <
- (currentView[PREORDER_HOOK_FLAGS] >> 16 /* NumberOfInitHooksCalledShift */) &&
- (currentView[FLAGS] & 3 /* InitPhaseStateMask */) === initPhase) {
- currentView[FLAGS] += 1024 /* IndexWithinInitPhaseIncrementer */;
- hook.call(directive);
- }
- }
- else {
- hook.call(directive);
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getLView() {
- return lView;
- }
- /** Used to set the parent property when nodes are created and track query results. */
- var previousOrParentTNode;
- function getPreviousOrParentTNode() {
- // top level variables should not be exported for performance reasons (PERF_NOTES.md)
- return previousOrParentTNode;
- }
- function setPreviousOrParentTNode(tNode, _isParent) {
- previousOrParentTNode = tNode;
- isParent = _isParent;
- }
- function setTNodeAndViewData(tNode, view) {
- ngDevMode && assertLViewOrUndefined(view);
- previousOrParentTNode = tNode;
- lView = view;
- }
- /**
- * If `isParent` is:
- * - `true`: then `previousOrParentTNode` points to a parent node.
- * - `false`: then `previousOrParentTNode` points to previous node (sibling).
- */
- var isParent;
- function getIsParent() {
- // top level variables should not be exported for performance reasons (PERF_NOTES.md)
- return isParent;
- }
- /** Checks whether a given view is in creation mode */
- function isCreationMode(view) {
- if (view === void 0) { view = lView; }
- return (view[FLAGS] & 4 /* CreationMode */) === 4 /* CreationMode */;
- }
- /**
- * State of the current view being processed.
- *
- * An array of nodes (text, element, container, etc), pipes, their bindings, and
- * any local variables that need to be stored between invocations.
- */
- var lView;
- /**
- * The last viewData retrieved by nextContext().
- * Allows building nextContext() and reference() calls.
- *
- * e.g. const inner = x().$implicit; const outer = x().$implicit;
- */
- var contextLView = null;
- /**
- * In this mode, any changes in bindings will throw an ExpressionChangedAfterChecked error.
- *
- * Necessary to support ChangeDetectorRef.checkNoChanges().
- */
- var checkNoChangesMode = false;
- function getCheckNoChangesMode() {
- // top level variables should not be exported for performance reasons (PERF_NOTES.md)
- return checkNoChangesMode;
- }
- function setCheckNoChangesMode(mode) {
- checkNoChangesMode = mode;
- }
- /**
- * The root index from which pure function instructions should calculate their binding
- * indices. In component views, this is TView.bindingStartIndex. In a host binding
- * context, this is the TView.expandoStartIndex + any dirs/hostVars before the given dir.
- */
- var bindingRootIndex = -1;
- function setBindingRoot(value) {
- bindingRootIndex = value;
- }
- function setCurrentQueryIndex(value) {
- }
- /**
- * Swap the current state with a new state.
- *
- * For performance reasons we store the state in the top level of the module.
- * This way we minimize the number of properties to read. Whenever a new view
- * is entered we have to store the state for later, and when the view is
- * exited the state has to be restored
- *
- * @param newView New state to become active
- * @param host Element to which the View is a child of
- * @returns the previous state;
- */
- function enterView(newView, hostTNode) {
- ngDevMode && assertLViewOrUndefined(newView);
- var oldView = lView;
- if (newView) {
- var tView = newView[TVIEW];
- bindingRootIndex = tView.bindingStartIndex;
- }
- previousOrParentTNode = hostTNode;
- isParent = true;
- lView = contextLView = newView;
- return oldView;
- }
- /**
- * Resets the application state.
- */
- function resetComponentState() {
- isParent = false;
- previousOrParentTNode = null;
- }
- /**
- * Used in lieu of enterView to make it clear when we are exiting a child view. This makes
- * the direction of traversal (up or down the view tree) a bit clearer.
- *
- * @param newView New state to become active
- * @param safeToRunHooks Whether the runtime is in a state where running lifecycle hooks is valid.
- * This is not always the case (for example, the application may have crashed and `leaveView` is
- * being executed while unwinding the call stack).
- */
- function leaveView(newView, safeToRunHooks) {
- var tView = lView[TVIEW];
- if (isCreationMode(lView)) {
- lView[FLAGS] &= ~4 /* CreationMode */;
- }
- else {
- try {
- resetPreOrderHookFlags(lView);
- safeToRunHooks && executeHooks(lView, tView.viewHooks, tView.viewCheckHooks, checkNoChangesMode, 2 /* AfterViewInitHooksToBeRun */, undefined);
- }
- finally {
- // Views are clean and in update mode after being checked, so these bits are cleared
- lView[FLAGS] &= ~(64 /* Dirty */ | 8 /* FirstLViewPass */);
- lView[BINDING_INDEX] = tView.bindingStartIndex;
- }
- }
- enterView(newView, null);
- }
- var _currentNamespace = null;
- /**
- * Sets the namespace used to create elements no `null`, which forces element creation to use
- * `createElement` rather than `createElementNS`.
- *
- * @codeGenApi
- */
- function ɵɵnamespaceHTML() {
- _currentNamespace = null;
- }
- function getNamespace() {
- return _currentNamespace;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * This file is used to control if the default rendering pipeline should be `ViewEngine` or `Ivy`.
- *
- * For more information on how to run and debug tests with either Ivy or View Engine (legacy),
- * please see [BAZEL.md](./docs/BAZEL.md).
- */
- var _devMode = true;
- /**
- * Returns whether Angular is in development mode. After called once,
- * the value is locked and won't change any more.
- *
- * By default, this is true, unless a user calls `enableProdMode` before calling this.
- *
- * @publicApi
- */
- function isDevMode() {
- return _devMode;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function tagSet(tags) {
- var e_1, _a;
- var res = {};
- try {
- for (var _b = __values(tags.split(',')), _c = _b.next(); !_c.done; _c = _b.next()) {
- var t = _c.value;
- res[t] = true;
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return res;
- }
- function merge() {
- var e_2, _a;
- var sets = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- sets[_i] = arguments[_i];
- }
- var res = {};
- try {
- for (var sets_1 = __values(sets), sets_1_1 = sets_1.next(); !sets_1_1.done; sets_1_1 = sets_1.next()) {
- var s = sets_1_1.value;
- for (var v in s) {
- if (s.hasOwnProperty(v))
- res[v] = true;
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (sets_1_1 && !sets_1_1.done && (_a = sets_1.return)) _a.call(sets_1);
- }
- finally { if (e_2) throw e_2.error; }
- }
- return res;
- }
- // Good source of info about elements and attributes
- // http://dev.w3.org/html5/spec/Overview.html#semantics
- // http://simon.html5.org/html-elements
- // Safe Void Elements - HTML5
- // http://dev.w3.org/html5/spec/Overview.html#void-elements
- var VOID_ELEMENTS = tagSet('area,br,col,hr,img,wbr');
- // Elements that you can, intentionally, leave open (and which close themselves)
- // http://dev.w3.org/html5/spec/Overview.html#optional-tags
- var OPTIONAL_END_TAG_BLOCK_ELEMENTS = tagSet('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr');
- var OPTIONAL_END_TAG_INLINE_ELEMENTS = tagSet('rp,rt');
- var OPTIONAL_END_TAG_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, OPTIONAL_END_TAG_BLOCK_ELEMENTS);
- // Safe Block Elements - HTML5
- var BLOCK_ELEMENTS = merge(OPTIONAL_END_TAG_BLOCK_ELEMENTS, tagSet('address,article,' +
- 'aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +
- 'h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul'));
- // Inline Elements - HTML5
- var INLINE_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, tagSet('a,abbr,acronym,audio,b,' +
- 'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,' +
- 'samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video'));
- var VALID_ELEMENTS = merge(VOID_ELEMENTS, BLOCK_ELEMENTS, INLINE_ELEMENTS, OPTIONAL_END_TAG_ELEMENTS);
- // Attributes that have href and hence need to be sanitized
- var URI_ATTRS = tagSet('background,cite,href,itemtype,longdesc,poster,src,xlink:href');
- // Attributes that have special href set hence need to be sanitized
- var SRCSET_ATTRS = tagSet('srcset');
- var HTML_ATTRS = tagSet('abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,' +
- 'compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,' +
- 'ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,' +
- 'scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,' +
- 'valign,value,vspace,width');
- // Accessibility attributes as per WAI-ARIA 1.1 (W3C Working Draft 14 December 2018)
- var ARIA_ATTRS = tagSet('aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,' +
- 'aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,' +
- 'aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,' +
- 'aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,' +
- 'aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,' +
- 'aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,' +
- 'aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext');
- // NB: This currently consciously doesn't support SVG. SVG sanitization has had several security
- // issues in the past, so it seems safer to leave it out if possible. If support for binding SVG via
- // innerHTML is required, SVG attributes should be added here.
- // NB: Sanitization does not allow <form> elements or other active elements (<button> etc). Those
- // can be sanitized, but they increase security surface area without a legitimate use case, so they
- // are left out here.
- var VALID_ATTRS = merge(URI_ATTRS, SRCSET_ATTRS, HTML_ATTRS, ARIA_ATTRS);
- // Elements whose content should not be traversed/preserved, if the elements themselves are invalid.
- //
- // Typically, `<invalid>Some content</invalid>` would traverse (and in this case preserve)
- // `Some content`, but strip `invalid-element` opening/closing tags. For some elements, though, we
- // don't want to preserve the content, if the elements themselves are going to be removed.
- var SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS = tagSet('script,style,template');
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A SecurityContext marks a location that has dangerous security implications, e.g. a DOM property
- * like `innerHTML` that could cause Cross Site Scripting (XSS) security bugs when improperly
- * handled.
- *
- * See DomSanitizer for more details on security in Angular applications.
- *
- * @publicApi
- */
- var SecurityContext$1;
- (function (SecurityContext) {
- SecurityContext[SecurityContext["NONE"] = 0] = "NONE";
- SecurityContext[SecurityContext["HTML"] = 1] = "HTML";
- SecurityContext[SecurityContext["STYLE"] = 2] = "STYLE";
- SecurityContext[SecurityContext["SCRIPT"] = 3] = "SCRIPT";
- SecurityContext[SecurityContext["URL"] = 4] = "URL";
- SecurityContext[SecurityContext["RESOURCE_URL"] = 5] = "RESOURCE_URL";
- })(SecurityContext$1 || (SecurityContext$1 = {}));
- /**
- * Sanitizer is used by the views to sanitize potentially dangerous values.
- *
- * @publicApi
- */
- var Sanitizer = /** @class */ (function () {
- function Sanitizer() {
- }
- return Sanitizer;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var TNODE = 8;
- var PARENT_INJECTOR = 8;
- var INJECTOR_BLOOM_PARENT_SIZE = 9;
- var NO_PARENT_INJECTOR = -1;
- /**
- * Each injector is saved in 9 contiguous slots in `LView` and 9 contiguous slots in
- * `TView.data`. This allows us to store information about the current node's tokens (which
- * can be shared in `TView`) as well as the tokens of its ancestor nodes (which cannot be
- * shared, so they live in `LView`).
- *
- * Each of these slots (aside from the last slot) contains a bloom filter. This bloom filter
- * determines whether a directive is available on the associated node or not. This prevents us
- * from searching the directives array at this level unless it's probable the directive is in it.
- *
- * See: https://en.wikipedia.org/wiki/Bloom_filter for more about bloom filters.
- *
- * Because all injectors have been flattened into `LView` and `TViewData`, they cannot typed
- * using interfaces as they were previously. The start index of each `LInjector` and `TInjector`
- * will differ based on where it is flattened into the main array, so it's not possible to know
- * the indices ahead of time and save their types here. The interfaces are still included here
- * for documentation purposes.
- *
- * export interface LInjector extends Array<any> {
- *
- * // Cumulative bloom for directive IDs 0-31 (IDs are % BLOOM_SIZE)
- * [0]: number;
- *
- * // Cumulative bloom for directive IDs 32-63
- * [1]: number;
- *
- * // Cumulative bloom for directive IDs 64-95
- * [2]: number;
- *
- * // Cumulative bloom for directive IDs 96-127
- * [3]: number;
- *
- * // Cumulative bloom for directive IDs 128-159
- * [4]: number;
- *
- * // Cumulative bloom for directive IDs 160 - 191
- * [5]: number;
- *
- * // Cumulative bloom for directive IDs 192 - 223
- * [6]: number;
- *
- * // Cumulative bloom for directive IDs 224 - 255
- * [7]: number;
- *
- * // We need to store a reference to the injector's parent so DI can keep looking up
- * // the injector tree until it finds the dependency it's looking for.
- * [PARENT_INJECTOR]: number;
- * }
- *
- * export interface TInjector extends Array<any> {
- *
- * // Shared node bloom for directive IDs 0-31 (IDs are % BLOOM_SIZE)
- * [0]: number;
- *
- * // Shared node bloom for directive IDs 32-63
- * [1]: number;
- *
- * // Shared node bloom for directive IDs 64-95
- * [2]: number;
- *
- * // Shared node bloom for directive IDs 96-127
- * [3]: number;
- *
- * // Shared node bloom for directive IDs 128-159
- * [4]: number;
- *
- * // Shared node bloom for directive IDs 160 - 191
- * [5]: number;
- *
- * // Shared node bloom for directive IDs 192 - 223
- * [6]: number;
- *
- * // Shared node bloom for directive IDs 224 - 255
- * [7]: number;
- *
- * // Necessary to find directive indices for a particular node.
- * [TNODE]: TElementNode|TElementContainerNode|TContainerNode;
- * }
- */
- /**
- * Factory for creating instances of injectors in the NodeInjector.
- *
- * This factory is complicated by the fact that it can resolve `multi` factories as well.
- *
- * NOTE: Some of the fields are optional which means that this class has two hidden classes.
- * - One without `multi` support (most common)
- * - One with `multi` values, (rare).
- *
- * Since VMs can cache up to 4 inline hidden classes this is OK.
- *
- * - Single factory: Only `resolving` and `factory` is defined.
- * - `providers` factory: `componentProviders` is a number and `index = -1`.
- * - `viewProviders` factory: `componentProviders` is a number and `index` points to `providers`.
- */
- var NodeInjectorFactory = /** @class */ (function () {
- function NodeInjectorFactory(
- /**
- * Factory to invoke in order to create a new instance.
- */
- factory,
- /**
- * Set to `true` if the token is declared in `viewProviders` (or if it is component).
- */
- isViewProvider, injectImplementation) {
- this.factory = factory;
- /**
- * Marker set to true during factory invocation to see if we get into recursive loop.
- * Recursive loop causes an error to be displayed.
- */
- this.resolving = false;
- this.canSeeViewProviders = isViewProvider;
- this.injectImpl = injectImplementation;
- }
- return NodeInjectorFactory;
- }());
- function isFactory(obj) {
- // See: https://jsperf.com/instanceof-vs-getprototypeof
- return obj !== null && typeof obj == 'object' &&
- Object.getPrototypeOf(obj) == NodeInjectorFactory.prototype;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function assertNodeType(tNode, type) {
- assertDefined(tNode, 'should be called with a TNode');
- assertEqual(tNode.type, type, "should be a " + typeName(type));
- }
- function assertNodeOfPossibleTypes(tNode) {
- var types = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- types[_i - 1] = arguments[_i];
- }
- assertDefined(tNode, 'should be called with a TNode');
- var found = types.some(function (type) { return tNode.type === type; });
- assertEqual(found, true, "Should be one of " + types.map(typeName).join(', ') + " but got " + typeName(tNode.type));
- }
- function typeName(type) {
- if (type == 1 /* Projection */)
- return 'Projection';
- if (type == 0 /* Container */)
- return 'Container';
- if (type == 2 /* View */)
- return 'View';
- if (type == 3 /* Element */)
- return 'Element';
- if (type == 4 /* ElementContainer */)
- return 'ElementContainer';
- return '<unknown>';
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // TODO: cleanup once the code is merged in angular/angular
- var RendererStyleFlags3;
- (function (RendererStyleFlags3) {
- RendererStyleFlags3[RendererStyleFlags3["Important"] = 1] = "Important";
- RendererStyleFlags3[RendererStyleFlags3["DashCase"] = 2] = "DashCase";
- })(RendererStyleFlags3 || (RendererStyleFlags3 = {}));
- /** Returns whether the `renderer` is a `ProceduralRenderer3` */
- function isProceduralRenderer(renderer) {
- return !!(renderer.listen);
- }
- var ɵ0$7 = function (hostElement, rendererType) { return document; };
- var domRendererFactory3 = {
- createRenderer: ɵ0$7
- };
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /** Returns the matching `LContext` data for a given DOM node, directive or component instance.
- *
- * This function will examine the provided DOM element, component, or directive instance\'s
- * monkey-patched property to derive the `LContext` data. Once called then the monkey-patched
- * value will be that of the newly created `LContext`.
- *
- * If the monkey-patched value is the `LView` instance then the context value for that
- * target will be created and the monkey-patch reference will be updated. Therefore when this
- * function is called it may mutate the provided element\'s, component\'s or any of the associated
- * directive\'s monkey-patch values.
- *
- * If the monkey-patch value is not detected then the code will walk up the DOM until an element
- * is found which contains a monkey-patch reference. When that occurs then the provided element
- * will be updated with a new context (which is then returned). If the monkey-patch value is not
- * detected for a component/directive instance then it will throw an error (all components and
- * directives should be automatically monkey-patched by ivy).
- *
- * @param target Component, Directive or DOM Node.
- */
- function getLContext(target) {
- var mpValue = readPatchedData(target);
- if (mpValue) {
- // only when it's an array is it considered an LView instance
- // ... otherwise it's an already constructed LContext instance
- if (Array.isArray(mpValue)) {
- var lView = mpValue;
- var nodeIndex = void 0;
- var component = undefined;
- var directives = undefined;
- if (isComponentInstance(target)) {
- nodeIndex = findViaComponent(lView, target);
- if (nodeIndex == -1) {
- throw new Error('The provided component was not found in the application');
- }
- component = target;
- }
- else if (isDirectiveInstance(target)) {
- nodeIndex = findViaDirective(lView, target);
- if (nodeIndex == -1) {
- throw new Error('The provided directive was not found in the application');
- }
- directives = getDirectivesAtNodeIndex(nodeIndex, lView, false);
- }
- else {
- nodeIndex = findViaNativeElement(lView, target);
- if (nodeIndex == -1) {
- return null;
- }
- }
- // the goal is not to fill the entire context full of data because the lookups
- // are expensive. Instead, only the target data (the element, component, container, ICU
- // expression or directive details) are filled into the context. If called multiple times
- // with different target values then the missing target data will be filled in.
- var native = unwrapRNode(lView[nodeIndex]);
- var existingCtx = readPatchedData(native);
- var context = (existingCtx && !Array.isArray(existingCtx)) ?
- existingCtx :
- createLContext(lView, nodeIndex, native);
- // only when the component has been discovered then update the monkey-patch
- if (component && context.component === undefined) {
- context.component = component;
- attachPatchData(context.component, context);
- }
- // only when the directives have been discovered then update the monkey-patch
- if (directives && context.directives === undefined) {
- context.directives = directives;
- for (var i = 0; i < directives.length; i++) {
- attachPatchData(directives[i], context);
- }
- }
- attachPatchData(context.native, context);
- mpValue = context;
- }
- }
- else {
- var rElement = target;
- ngDevMode && assertDomNode(rElement);
- // if the context is not found then we need to traverse upwards up the DOM
- // to find the nearest element that has already been monkey patched with data
- var parent_1 = rElement;
- while (parent_1 = parent_1.parentNode) {
- var parentContext = readPatchedData(parent_1);
- if (parentContext) {
- var lView = void 0;
- if (Array.isArray(parentContext)) {
- lView = parentContext;
- }
- else {
- lView = parentContext.lView;
- }
- // the edge of the app was also reached here through another means
- // (maybe because the DOM was changed manually).
- if (!lView) {
- return null;
- }
- var index = findViaNativeElement(lView, rElement);
- if (index >= 0) {
- var native = unwrapRNode(lView[index]);
- var context = createLContext(lView, index, native);
- attachPatchData(native, context);
- mpValue = context;
- break;
- }
- }
- }
- }
- return mpValue || null;
- }
- /**
- * Creates an empty instance of a `LContext` context
- */
- function createLContext(lView, nodeIndex, native) {
- return {
- lView: lView,
- nodeIndex: nodeIndex,
- native: native,
- component: undefined,
- directives: undefined,
- localRefs: undefined,
- };
- }
- /**
- * Assigns the given data to the given target (which could be a component,
- * directive or DOM node instance) using monkey-patching.
- */
- function attachPatchData(target, data) {
- target[MONKEY_PATCH_KEY_NAME] = data;
- }
- function isComponentInstance(instance) {
- return instance && instance.constructor && instance.constructor.ngComponentDef;
- }
- function isDirectiveInstance(instance) {
- return instance && instance.constructor && instance.constructor.ngDirectiveDef;
- }
- /**
- * Locates the element within the given LView and returns the matching index
- */
- function findViaNativeElement(lView, target) {
- var tNode = lView[TVIEW].firstChild;
- while (tNode) {
- var native = getNativeByTNode(tNode, lView);
- if (native === target) {
- return tNode.index;
- }
- tNode = traverseNextElement(tNode);
- }
- return -1;
- }
- /**
- * Locates the next tNode (child, sibling or parent).
- */
- function traverseNextElement(tNode) {
- if (tNode.child) {
- return tNode.child;
- }
- else if (tNode.next) {
- return tNode.next;
- }
- else {
- // Let's take the following template: <div><span>text</span></div><component/>
- // After checking the text node, we need to find the next parent that has a "next" TNode,
- // in this case the parent `div`, so that we can find the component.
- while (tNode.parent && !tNode.parent.next) {
- tNode = tNode.parent;
- }
- return tNode.parent && tNode.parent.next;
- }
- }
- /**
- * Locates the component within the given LView and returns the matching index
- */
- function findViaComponent(lView, componentInstance) {
- var componentIndices = lView[TVIEW].components;
- if (componentIndices) {
- for (var i = 0; i < componentIndices.length; i++) {
- var elementComponentIndex = componentIndices[i];
- var componentView = getComponentViewByIndex(elementComponentIndex, lView);
- if (componentView[CONTEXT] === componentInstance) {
- return elementComponentIndex;
- }
- }
- }
- else {
- var rootComponentView = getComponentViewByIndex(HEADER_OFFSET, lView);
- var rootComponent = rootComponentView[CONTEXT];
- if (rootComponent === componentInstance) {
- // we are dealing with the root element here therefore we know that the
- // element is the very first element after the HEADER data in the lView
- return HEADER_OFFSET;
- }
- }
- return -1;
- }
- /**
- * Locates the directive within the given LView and returns the matching index
- */
- function findViaDirective(lView, directiveInstance) {
- // if a directive is monkey patched then it will (by default)
- // have a reference to the LView of the current view. The
- // element bound to the directive being search lives somewhere
- // in the view data. We loop through the nodes and check their
- // list of directives for the instance.
- var tNode = lView[TVIEW].firstChild;
- while (tNode) {
- var directiveIndexStart = tNode.directiveStart;
- var directiveIndexEnd = tNode.directiveEnd;
- for (var i = directiveIndexStart; i < directiveIndexEnd; i++) {
- if (lView[i] === directiveInstance) {
- return tNode.index;
- }
- }
- tNode = traverseNextElement(tNode);
- }
- return -1;
- }
- /**
- * Returns a list of directives extracted from the given view based on the
- * provided list of directive index values.
- *
- * @param nodeIndex The node index
- * @param lView The target view data
- * @param includeComponents Whether or not to include components in returned directives
- */
- function getDirectivesAtNodeIndex(nodeIndex, lView, includeComponents) {
- var tNode = lView[TVIEW].data[nodeIndex];
- var directiveStartIndex = tNode.directiveStart;
- if (directiveStartIndex == 0)
- return EMPTY_ARRAY$3;
- var directiveEndIndex = tNode.directiveEnd;
- if (!includeComponents && tNode.flags & 1 /* isComponent */)
- directiveStartIndex++;
- return lView.slice(directiveStartIndex, directiveEndIndex);
- }
- function getComponentAtNodeIndex(nodeIndex, lView) {
- var tNode = lView[TVIEW].data[nodeIndex];
- var directiveStartIndex = tNode.directiveStart;
- return tNode.flags & 1 /* isComponent */ ? lView[directiveStartIndex] : null;
- }
- /**
- * Returns a map of local references (local reference name => element or directive instance) that
- * exist on a given element.
- */
- function discoverLocalRefs(lView, nodeIndex) {
- var tNode = lView[TVIEW].data[nodeIndex];
- if (tNode && tNode.localNames) {
- var result = {};
- var localIndex = tNode.index + 1;
- for (var i = 0; i < tNode.localNames.length; i += 2) {
- result[tNode.localNames[i]] = lView[localIndex];
- localIndex++;
- }
- return result;
- }
- return null;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * The default directive styling index value for template-based bindings.
- *
- * All host-level bindings (e.g. `hostStyleProp` and `hostStyleMap`) are
- * assigned a directive styling index value based on the current directive
- * uniqueId and the directive super-class inheritance depth. But for template
- * bindings they always have the same directive styling index value.
- */
- var DEFAULT_TEMPLATE_DIRECTIVE_INDEX = 0;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function createEmptyStylingContext(wrappedElement, sanitizer, initialStyles, initialClasses) {
- var context = [
- wrappedElement || null,
- 0,
- [],
- initialStyles || [null, null],
- initialClasses || [null, null],
- [0, 0],
- [0],
- [0],
- null,
- null,
- ];
- // whenever a context is created there is always a `null` directive
- // that is registered (which is a placeholder for the "template").
- allocateOrUpdateDirectiveIntoContext(context, DEFAULT_TEMPLATE_DIRECTIVE_INDEX);
- return context;
- }
- /**
- * Allocates (registers) a directive into the directive registry within the provided styling
- * context.
- *
- * For each and every `[style]`, `[style.prop]`, `[class]`, `[class.name]` binding
- * (as well as static style and class attributes) a directive, component or template
- * is marked as the owner. When an owner is determined (this happens when the template
- * is first passed over) the directive owner is allocated into the styling context. When
- * this happens, each owner gets its own index value. This then ensures that once any
- * style and/or class binding are assigned into the context then they are marked to
- * that directive's index value.
- *
- * @param context the target StylingContext
- * @param directiveRef the directive that will be allocated into the context
- * @returns the index where the directive was inserted into
- */
- function allocateOrUpdateDirectiveIntoContext(context, directiveIndex, singlePropValuesIndex, styleSanitizer) {
- if (singlePropValuesIndex === void 0) { singlePropValuesIndex = -1; }
- var directiveRegistry = context[2 /* DirectiveRegistryPosition */];
- var index = directiveIndex * 2 /* Size */;
- // we preemptively make space into the directives array and then
- // assign values slot-by-slot to ensure that if the directive ordering
- // changes then it will still function
- var limit = index + 2 /* Size */;
- for (var i = directiveRegistry.length; i < limit; i += 2 /* Size */) {
- // -1 is used to signal that the directive has been allocated, but
- // no actual style or class bindings have been registered yet...
- directiveRegistry.push(-1, null);
- }
- var propValuesStartPosition = index + 0 /* SinglePropValuesIndexOffset */;
- if (singlePropValuesIndex >= 0 && directiveRegistry[propValuesStartPosition] === -1) {
- directiveRegistry[propValuesStartPosition] = singlePropValuesIndex;
- directiveRegistry[index + 1 /* StyleSanitizerOffset */] =
- styleSanitizer || null;
- }
- }
- /**
- * Used clone a copy of a pre-computed template of a styling context.
- *
- * A pre-computed template is designed to be computed once for a given element
- * (instructions.ts has logic for caching this).
- */
- function allocStylingContext(element, templateStyleContext) {
- // each instance gets a copy
- var context = templateStyleContext.slice();
- // the HEADER values contain arrays which also need
- // to be copied over into the new context
- for (var i = 0; i < 10 /* SingleStylesStartPosition */; i++) {
- var value = templateStyleContext[i];
- if (Array.isArray(value)) {
- context[i] = value.slice();
- }
- }
- context[0 /* ElementPosition */] = element;
- // this will prevent any other directives from extending the context
- context[1 /* MasterFlagPosition */] |= 16 /* BindingAllocationLocked */;
- return context;
- }
- /**
- * Retrieve the `StylingContext` at a given index.
- *
- * This method lazily creates the `StylingContext`. This is because in most cases
- * we have styling without any bindings. Creating `StylingContext` eagerly would mean that
- * every style declaration such as `<div style="color: red">` would result `StyleContext`
- * which would create unnecessary memory pressure.
- *
- * @param index Index of the style allocation. See: `styling`.
- * @param viewData The view to search for the styling context
- */
- function getStylingContextFromLView(index, viewData) {
- var storageIndex = index;
- var slotValue = viewData[storageIndex];
- var wrapper = viewData;
- while (Array.isArray(slotValue)) {
- wrapper = slotValue;
- slotValue = slotValue[HOST];
- }
- if (isStylingContext(wrapper)) {
- return wrapper;
- }
- else {
- // This is an LView or an LContainer
- var stylingTemplate = getTNode(index - HEADER_OFFSET, viewData).stylingTemplate;
- if (wrapper !== viewData) {
- storageIndex = HOST;
- }
- return wrapper[storageIndex] = stylingTemplate ?
- allocStylingContext(slotValue, stylingTemplate) :
- createEmptyStylingContext(slotValue);
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /// Parent Injector Utils ///////////////////////////////////////////////////////////////
- function hasParentInjector(parentLocation) {
- return parentLocation !== NO_PARENT_INJECTOR;
- }
- function getParentInjectorIndex(parentLocation) {
- return parentLocation & 32767 /* InjectorIndexMask */;
- }
- function getParentInjectorViewOffset(parentLocation) {
- return parentLocation >> 16 /* ViewOffsetShift */;
- }
- /**
- * Unwraps a parent injector location number to find the view offset from the current injector,
- * then walks up the declaration view tree until the view is found that contains the parent
- * injector.
- *
- * @param location The location of the parent injector, which contains the view offset
- * @param startView The LView instance from which to start walking up the view tree
- * @returns The LView instance that contains the parent injector
- */
- function getParentInjectorView(location, startView) {
- var viewOffset = getParentInjectorViewOffset(location);
- var parentView = startView;
- // For most cases, the parent injector can be found on the host node (e.g. for component
- // or container), but we must keep the loop here to support the rarer case of deeply nested
- // <ng-template> tags or inline views, where the parent injector might live many views
- // above the child injector.
- while (viewOffset > 0) {
- parentView = parentView[DECLARATION_VIEW];
- viewOffset--;
- }
- return parentView;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Gets the parent LView of the passed LView, if the PARENT is an LContainer, will get the parent of
- * that LContainer, which is an LView
- * @param lView the lView whose parent to get
- */
- function getLViewParent(lView) {
- ngDevMode && assertLView(lView);
- var parent = lView[PARENT];
- return isLContainer(parent) ? parent[PARENT] : parent;
- }
- /**
- * Retrieve the root view from any component or `LView` by walking the parent `LView` until
- * reaching the root `LView`.
- *
- * @param componentOrLView any component or `LView`
- */
- function getRootView(componentOrLView) {
- ngDevMode && assertDefined(componentOrLView, 'component');
- var lView = isLView(componentOrLView) ? componentOrLView : readPatchedLView(componentOrLView);
- while (lView && !(lView[FLAGS] & 512 /* IsRoot */)) {
- lView = getLViewParent(lView);
- }
- ngDevMode && assertLView(lView);
- return lView;
- }
- /**
- * Given an `LView`, find the closest declaration view which is not an embedded view.
- *
- * This method searches for the `LView` associated with the component which declared the `LView`.
- *
- * This function may return itself if the `LView` passed in is not an embedded `LView`. Otherwise
- * it walks the declaration parents until it finds a component view (non-embedded-view.)
- *
- * @param lView LView for which we want a host element node
- * @returns The host node
- */
- function findComponentView(lView) {
- var rootTNode = lView[T_HOST];
- while (rootTNode !== null && rootTNode.type === 2 /* View */) {
- ngDevMode && assertDefined(lView[DECLARATION_VIEW], 'lView[DECLARATION_VIEW]');
- lView = lView[DECLARATION_VIEW];
- rootTNode = lView[T_HOST];
- }
- ngDevMode && assertLView(lView);
- return lView;
- }
- /**
- * Returns the `RootContext` instance that is associated with
- * the application where the target is situated. It does this by walking the parent views until it
- * gets to the root view, then getting the context off of that.
- *
- * @param viewOrComponent the `LView` or component to get the root context for.
- */
- function getRootContext(viewOrComponent) {
- var rootView = getRootView(viewOrComponent);
- ngDevMode &&
- assertDefined(rootView[CONTEXT], 'RootView has no context. Perhaps it is disconnected?');
- return rootView[CONTEXT];
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Defines if the call to `inject` should include `viewProviders` in its resolution.
- *
- * This is set to true when we try to instantiate a component. This value is reset in
- * `getNodeInjectable` to a value which matches the declaration location of the token about to be
- * instantiated. This is done so that if we are injecting a token which was declared outside of
- * `viewProviders` we don't accidentally pull `viewProviders` in.
- *
- * Example:
- *
- * ```
- * @Injectable()
- * class MyService {
- * constructor(public value: String) {}
- * }
- *
- * @Component({
- * providers: [
- * MyService,
- * {provide: String, value: 'providers' }
- * ]
- * viewProviders: [
- * {provide: String, value: 'viewProviders'}
- * ]
- * })
- * class MyComponent {
- * constructor(myService: MyService, value: String) {
- * // We expect that Component can see into `viewProviders`.
- * expect(value).toEqual('viewProviders');
- * // `MyService` was not declared in `viewProviders` hence it can't see it.
- * expect(myService.value).toEqual('providers');
- * }
- * }
- *
- * ```
- */
- var includeViewProviders = true;
- function setIncludeViewProviders(v) {
- var oldValue = includeViewProviders;
- includeViewProviders = v;
- return oldValue;
- }
- /**
- * The number of slots in each bloom filter (used by DI). The larger this number, the fewer
- * directives that will share slots, and thus, the fewer false positives when checking for
- * the existence of a directive.
- */
- var BLOOM_SIZE = 256;
- var BLOOM_MASK = BLOOM_SIZE - 1;
- /** Counter used to generate unique IDs for directives. */
- var nextNgElementId = 0;
- /**
- * Registers this directive as present in its node's injector by flipping the directive's
- * corresponding bit in the injector's bloom filter.
- *
- * @param injectorIndex The index of the node injector where this token should be registered
- * @param tView The TView for the injector's bloom filters
- * @param type The directive token to register
- */
- function bloomAdd(injectorIndex, tView, type) {
- ngDevMode && assertEqual(tView.firstTemplatePass, true, 'expected firstTemplatePass to be true');
- var id = typeof type !== 'string' ? type[NG_ELEMENT_ID] : type.charCodeAt(0) || 0;
- // Set a unique ID on the directive type, so if something tries to inject the directive,
- // we can easily retrieve the ID and hash it into the bloom bit that should be checked.
- if (id == null) {
- id = type[NG_ELEMENT_ID] = nextNgElementId++;
- }
- // We only have BLOOM_SIZE (256) slots in our bloom filter (8 buckets * 32 bits each),
- // so all unique IDs must be modulo-ed into a number from 0 - 255 to fit into the filter.
- var bloomBit = id & BLOOM_MASK;
- // Create a mask that targets the specific bit associated with the directive.
- // JS bit operations are 32 bits, so this will be a number between 2^0 and 2^31, corresponding
- // to bit positions 0 - 31 in a 32 bit integer.
- var mask = 1 << bloomBit;
- // Use the raw bloomBit number to determine which bloom filter bucket we should check
- // e.g: bf0 = [0 - 31], bf1 = [32 - 63], bf2 = [64 - 95], bf3 = [96 - 127], etc
- var b7 = bloomBit & 0x80;
- var b6 = bloomBit & 0x40;
- var b5 = bloomBit & 0x20;
- var tData = tView.data;
- if (b7) {
- b6 ? (b5 ? (tData[injectorIndex + 7] |= mask) : (tData[injectorIndex + 6] |= mask)) :
- (b5 ? (tData[injectorIndex + 5] |= mask) : (tData[injectorIndex + 4] |= mask));
- }
- else {
- b6 ? (b5 ? (tData[injectorIndex + 3] |= mask) : (tData[injectorIndex + 2] |= mask)) :
- (b5 ? (tData[injectorIndex + 1] |= mask) : (tData[injectorIndex] |= mask));
- }
- }
- /**
- * Creates (or gets an existing) injector for a given element or container.
- *
- * @param tNode for which an injector should be retrieved / created.
- * @param hostView View where the node is stored
- * @returns Node injector
- */
- function getOrCreateNodeInjectorForNode(tNode, hostView) {
- var existingInjectorIndex = getInjectorIndex(tNode, hostView);
- if (existingInjectorIndex !== -1) {
- return existingInjectorIndex;
- }
- var tView = hostView[TVIEW];
- if (tView.firstTemplatePass) {
- tNode.injectorIndex = hostView.length;
- insertBloom(tView.data, tNode); // foundation for node bloom
- insertBloom(hostView, null); // foundation for cumulative bloom
- insertBloom(tView.blueprint, null);
- ngDevMode && assertEqual(tNode.flags === 0 || tNode.flags === 1 /* isComponent */, true, 'expected tNode.flags to not be initialized');
- }
- var parentLoc = getParentInjectorLocation(tNode, hostView);
- var parentIndex = getParentInjectorIndex(parentLoc);
- var parentLView = getParentInjectorView(parentLoc, hostView);
- var injectorIndex = tNode.injectorIndex;
- // If a parent injector can't be found, its location is set to -1.
- // In that case, we don't need to set up a cumulative bloom
- if (hasParentInjector(parentLoc)) {
- var parentData = parentLView[TVIEW].data;
- // Creates a cumulative bloom filter that merges the parent's bloom filter
- // and its own cumulative bloom (which contains tokens for all ancestors)
- for (var i = 0; i < 8; i++) {
- hostView[injectorIndex + i] = parentLView[parentIndex + i] | parentData[parentIndex + i];
- }
- }
- hostView[injectorIndex + PARENT_INJECTOR] = parentLoc;
- return injectorIndex;
- }
- function insertBloom(arr, footer) {
- arr.push(0, 0, 0, 0, 0, 0, 0, 0, footer);
- }
- function getInjectorIndex(tNode, hostView) {
- if (tNode.injectorIndex === -1 ||
- // If the injector index is the same as its parent's injector index, then the index has been
- // copied down from the parent node. No injector has been created yet on this node.
- (tNode.parent && tNode.parent.injectorIndex === tNode.injectorIndex) ||
- // After the first template pass, the injector index might exist but the parent values
- // might not have been calculated yet for this instance
- hostView[tNode.injectorIndex + PARENT_INJECTOR] == null) {
- return -1;
- }
- else {
- return tNode.injectorIndex;
- }
- }
- /**
- * Finds the index of the parent injector, with a view offset if applicable. Used to set the
- * parent injector initially.
- *
- * Returns a combination of number of `ViewData` we have to go up and index in that `Viewdata`
- */
- function getParentInjectorLocation(tNode, view) {
- if (tNode.parent && tNode.parent.injectorIndex !== -1) {
- return tNode.parent.injectorIndex; // ViewOffset is 0
- }
- // For most cases, the parent injector index can be found on the host node (e.g. for component
- // or container), so this loop will be skipped, but we must keep the loop here to support
- // the rarer case of deeply nested <ng-template> tags or inline views.
- var hostTNode = view[T_HOST];
- var viewOffset = 1;
- while (hostTNode && hostTNode.injectorIndex === -1) {
- view = view[DECLARATION_VIEW];
- hostTNode = view ? view[T_HOST] : null;
- viewOffset++;
- }
- return hostTNode ?
- hostTNode.injectorIndex | (viewOffset << 16 /* ViewOffsetShift */) :
- -1;
- }
- /**
- * Makes a type or an injection token public to the DI system by adding it to an
- * injector's bloom filter.
- *
- * @param di The node injector in which a directive will be added
- * @param token The type or the injection token to be made public
- */
- function diPublicInInjector(injectorIndex, view, token) {
- bloomAdd(injectorIndex, view[TVIEW], token);
- }
- /**
- * Returns the value associated to the given token from the NodeInjectors => ModuleInjector.
- *
- * Look for the injector providing the token by walking up the node injector tree and then
- * the module injector tree.
- *
- * This function patches `token` with `__NG_ELEMENT_ID__` which contains the id for the bloom
- * filter. Negative values are reserved for special objects.
- * - `-1` is reserved for injecting `Injector` (implemented by `NodeInjector`)
- *
- * @param tNode The Node where the search for the injector should start
- * @param lView The `LView` that contains the `tNode`
- * @param token The token to look for
- * @param flags Injection flags
- * @param notFoundValue The value to return when the injection flags is `InjectFlags.Optional`
- * @returns the value from the injector, `null` when not found, or `notFoundValue` if provided
- */
- function getOrCreateInjectable(tNode, lView, token, flags, notFoundValue) {
- if (flags === void 0) { flags = InjectFlags.Default; }
- if (tNode) {
- var bloomHash = bloomHashBitOrFactory(token);
- // If the ID stored here is a function, this is a special object like ElementRef or TemplateRef
- // so just call the factory function to create it.
- if (typeof bloomHash === 'function') {
- var savePreviousOrParentTNode = getPreviousOrParentTNode();
- var saveLView = getLView();
- setTNodeAndViewData(tNode, lView);
- try {
- var value = bloomHash();
- if (value == null && !(flags & InjectFlags.Optional)) {
- throw new Error("No provider for " + stringifyForError(token) + "!");
- }
- else {
- return value;
- }
- }
- finally {
- setTNodeAndViewData(savePreviousOrParentTNode, saveLView);
- }
- }
- else if (typeof bloomHash == 'number') {
- if (bloomHash === -1) {
- // `-1` is a special value used to identify `Injector` types.
- return new NodeInjector(tNode, lView);
- }
- // If the token has a bloom hash, then it is a token which could be in NodeInjector.
- // A reference to the previous injector TView that was found while climbing the element
- // injector tree. This is used to know if viewProviders can be accessed on the current
- // injector.
- var previousTView = null;
- var injectorIndex = getInjectorIndex(tNode, lView);
- var parentLocation = NO_PARENT_INJECTOR;
- var hostTElementNode = flags & InjectFlags.Host ? findComponentView(lView)[T_HOST] : null;
- // If we should skip this injector, or if there is no injector on this node, start by
- // searching
- // the parent injector.
- if (injectorIndex === -1 || flags & InjectFlags.SkipSelf) {
- parentLocation = injectorIndex === -1 ? getParentInjectorLocation(tNode, lView) :
- lView[injectorIndex + PARENT_INJECTOR];
- if (!shouldSearchParent(flags, false)) {
- injectorIndex = -1;
- }
- else {
- previousTView = lView[TVIEW];
- injectorIndex = getParentInjectorIndex(parentLocation);
- lView = getParentInjectorView(parentLocation, lView);
- }
- }
- // Traverse up the injector tree until we find a potential match or until we know there
- // *isn't* a match.
- while (injectorIndex !== -1) {
- parentLocation = lView[injectorIndex + PARENT_INJECTOR];
- // Check the current injector. If it matches, see if it contains token.
- var tView = lView[TVIEW];
- if (bloomHasToken(bloomHash, injectorIndex, tView.data)) {
- // At this point, we have an injector which *may* contain the token, so we step through
- // the providers and directives associated with the injector's corresponding node to get
- // the instance.
- var instance = searchTokensOnInjector(injectorIndex, lView, token, previousTView, flags, hostTElementNode);
- if (instance !== NOT_FOUND) {
- return instance;
- }
- }
- if (shouldSearchParent(flags, lView[TVIEW].data[injectorIndex + TNODE] === hostTElementNode) &&
- bloomHasToken(bloomHash, injectorIndex, lView)) {
- // The def wasn't found anywhere on this node, so it was a false positive.
- // Traverse up the tree and continue searching.
- previousTView = tView;
- injectorIndex = getParentInjectorIndex(parentLocation);
- lView = getParentInjectorView(parentLocation, lView);
- }
- else {
- // If we should not search parent OR If the ancestor bloom filter value does not have the
- // bit corresponding to the directive we can give up on traversing up to find the specific
- // injector.
- injectorIndex = -1;
- }
- }
- }
- }
- if (flags & InjectFlags.Optional && notFoundValue === undefined) {
- // This must be set or the NullInjector will throw for optional deps
- notFoundValue = null;
- }
- if ((flags & (InjectFlags.Self | InjectFlags.Host)) === 0) {
- var moduleInjector = lView[INJECTOR$1];
- // switch to `injectInjectorOnly` implementation for module injector, since module injector
- // should not have access to Component/Directive DI scope (that may happen through
- // `directiveInject` implementation)
- var previousInjectImplementation = setInjectImplementation(undefined);
- try {
- if (moduleInjector) {
- return moduleInjector.get(token, notFoundValue, flags & InjectFlags.Optional);
- }
- else {
- return injectRootLimpMode(token, notFoundValue, flags & InjectFlags.Optional);
- }
- }
- finally {
- setInjectImplementation(previousInjectImplementation);
- }
- }
- if (flags & InjectFlags.Optional) {
- return notFoundValue;
- }
- else {
- throw new Error("NodeInjector: NOT_FOUND [" + stringifyForError(token) + "]");
- }
- }
- var NOT_FOUND = {};
- function searchTokensOnInjector(injectorIndex, lView, token, previousTView, flags, hostTElementNode) {
- var currentTView = lView[TVIEW];
- var tNode = currentTView.data[injectorIndex + TNODE];
- // First, we need to determine if view providers can be accessed by the starting element.
- // There are two possibities
- var canAccessViewProviders = previousTView == null ?
- // 1) This is the first invocation `previousTView == null` which means that we are at the
- // `TNode` of where injector is starting to look. In such a case the only time we are allowed
- // to look into the ViewProviders is if:
- // - we are on a component
- // - AND the injector set `includeViewProviders` to true (implying that the token can see
- // ViewProviders because it is the Component or a Service which itself was declared in
- // ViewProviders)
- (isComponent(tNode) && includeViewProviders) :
- // 2) `previousTView != null` which means that we are now walking across the parent nodes.
- // In such a case we are only allowed to look into the ViewProviders if:
- // - We just crossed from child View to Parent View `previousTView != currentTView`
- // - AND the parent TNode is an Element.
- // This means that we just came from the Component's View and therefore are allowed to see
- // into the ViewProviders.
- (previousTView != currentTView && (tNode.type === 3 /* Element */));
- // This special case happens when there is a @host on the inject and when we are searching
- // on the host element node.
- var isHostSpecialCase = (flags & InjectFlags.Host) && hostTElementNode === tNode;
- var injectableIdx = locateDirectiveOrProvider(tNode, currentTView, token, canAccessViewProviders, isHostSpecialCase);
- if (injectableIdx !== null) {
- return getNodeInjectable(currentTView.data, lView, injectableIdx, tNode);
- }
- else {
- return NOT_FOUND;
- }
- }
- /**
- * Searches for the given token among the node's directives and providers.
- *
- * @param tNode TNode on which directives are present.
- * @param tView The tView we are currently processing
- * @param token Provider token or type of a directive to look for.
- * @param canAccessViewProviders Whether view providers should be considered.
- * @param isHostSpecialCase Whether the host special case applies.
- * @returns Index of a found directive or provider, or null when none found.
- */
- function locateDirectiveOrProvider(tNode, tView, token, canAccessViewProviders, isHostSpecialCase) {
- var nodeProviderIndexes = tNode.providerIndexes;
- var tInjectables = tView.data;
- var injectablesStart = nodeProviderIndexes & 65535 /* ProvidersStartIndexMask */;
- var directivesStart = tNode.directiveStart;
- var directiveEnd = tNode.directiveEnd;
- var cptViewProvidersCount = nodeProviderIndexes >> 16 /* CptViewProvidersCountShift */;
- var startingIndex = canAccessViewProviders ? injectablesStart : injectablesStart + cptViewProvidersCount;
- // When the host special case applies, only the viewProviders and the component are visible
- var endIndex = isHostSpecialCase ? injectablesStart + cptViewProvidersCount : directiveEnd;
- for (var i = startingIndex; i < endIndex; i++) {
- var providerTokenOrDef = tInjectables[i];
- if (i < directivesStart && token === providerTokenOrDef ||
- i >= directivesStart && providerTokenOrDef.type === token) {
- return i;
- }
- }
- if (isHostSpecialCase) {
- var dirDef = tInjectables[directivesStart];
- if (dirDef && isComponentDef(dirDef) && dirDef.type === token) {
- return directivesStart;
- }
- }
- return null;
- }
- /**
- * Retrieve or instantiate the injectable from the `lData` at particular `index`.
- *
- * This function checks to see if the value has already been instantiated and if so returns the
- * cached `injectable`. Otherwise if it detects that the value is still a factory it
- * instantiates the `injectable` and caches the value.
- */
- function getNodeInjectable(tData, lData, index, tNode) {
- var value = lData[index];
- if (isFactory(value)) {
- var factory = value;
- if (factory.resolving) {
- throw new Error("Circular dep for " + stringifyForError(tData[index]));
- }
- var previousIncludeViewProviders = setIncludeViewProviders(factory.canSeeViewProviders);
- factory.resolving = true;
- var previousInjectImplementation = void 0;
- if (factory.injectImpl) {
- previousInjectImplementation = setInjectImplementation(factory.injectImpl);
- }
- var savePreviousOrParentTNode = getPreviousOrParentTNode();
- var saveLView = getLView();
- setTNodeAndViewData(tNode, lData);
- try {
- value = lData[index] = factory.factory(null, tData, lData, tNode);
- }
- finally {
- if (factory.injectImpl)
- setInjectImplementation(previousInjectImplementation);
- setIncludeViewProviders(previousIncludeViewProviders);
- factory.resolving = false;
- setTNodeAndViewData(savePreviousOrParentTNode, saveLView);
- }
- }
- return value;
- }
- /**
- * Returns the bit in an injector's bloom filter that should be used to determine whether or not
- * the directive might be provided by the injector.
- *
- * When a directive is public, it is added to the bloom filter and given a unique ID that can be
- * retrieved on the Type. When the directive isn't public or the token is not a directive `null`
- * is returned as the node injector can not possibly provide that token.
- *
- * @param token the injection token
- * @returns the matching bit to check in the bloom filter or `null` if the token is not known.
- * When the returned value is negative then it represents special values such as `Injector`.
- */
- function bloomHashBitOrFactory(token) {
- ngDevMode && assertDefined(token, 'token must be defined');
- if (typeof token === 'string') {
- return token.charCodeAt(0) || 0;
- }
- var tokenId = token[NG_ELEMENT_ID];
- // Negative token IDs are used for special objects such as `Injector`
- return (typeof tokenId === 'number' && tokenId > 0) ? tokenId & BLOOM_MASK : tokenId;
- }
- function bloomHasToken(bloomHash, injectorIndex, injectorView) {
- // Create a mask that targets the specific bit associated with the directive we're looking for.
- // JS bit operations are 32 bits, so this will be a number between 2^0 and 2^31, corresponding
- // to bit positions 0 - 31 in a 32 bit integer.
- var mask = 1 << bloomHash;
- var b7 = bloomHash & 0x80;
- var b6 = bloomHash & 0x40;
- var b5 = bloomHash & 0x20;
- // Our bloom filter size is 256 bits, which is eight 32-bit bloom filter buckets:
- // bf0 = [0 - 31], bf1 = [32 - 63], bf2 = [64 - 95], bf3 = [96 - 127], etc.
- // Get the bloom filter value from the appropriate bucket based on the directive's bloomBit.
- var value;
- if (b7) {
- value = b6 ? (b5 ? injectorView[injectorIndex + 7] : injectorView[injectorIndex + 6]) :
- (b5 ? injectorView[injectorIndex + 5] : injectorView[injectorIndex + 4]);
- }
- else {
- value = b6 ? (b5 ? injectorView[injectorIndex + 3] : injectorView[injectorIndex + 2]) :
- (b5 ? injectorView[injectorIndex + 1] : injectorView[injectorIndex]);
- }
- // If the bloom filter value has the bit corresponding to the directive's bloomBit flipped on,
- // this injector is a potential match.
- return !!(value & mask);
- }
- /** Returns true if flags prevent parent injector from being searched for tokens */
- function shouldSearchParent(flags, isFirstHostTNode) {
- return !(flags & InjectFlags.Self) && !(flags & InjectFlags.Host && isFirstHostTNode);
- }
- var NodeInjector = /** @class */ (function () {
- function NodeInjector(_tNode, _lView) {
- this._tNode = _tNode;
- this._lView = _lView;
- }
- NodeInjector.prototype.get = function (token, notFoundValue) {
- return getOrCreateInjectable(this._tNode, this._lView, token, undefined, notFoundValue);
- };
- return NodeInjector;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getDebugContext(error) {
- return error[ERROR_DEBUG_CONTEXT];
- }
- function getOriginalError(error) {
- return error[ERROR_ORIGINAL_ERROR];
- }
- function getErrorLogger(error) {
- return error[ERROR_LOGGER] || defaultErrorLogger;
- }
- function defaultErrorLogger(console) {
- var values = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- values[_i - 1] = arguments[_i];
- }
- console.error.apply(console, __spread(values));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Provides a hook for centralized exception handling.
- *
- * The default implementation of `ErrorHandler` prints error messages to the `console`. To
- * intercept error handling, write a custom exception handler that replaces this default as
- * appropriate for your app.
- *
- * @usageNotes
- * ### Example
- *
- * ```
- * class MyErrorHandler implements ErrorHandler {
- * handleError(error) {
- * // do something with the exception
- * }
- * }
- *
- * @NgModule({
- * providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
- * })
- * class MyModule {}
- * ```
- *
- * @publicApi
- */
- var ErrorHandler = /** @class */ (function () {
- function ErrorHandler() {
- /**
- * @internal
- */
- this._console = console;
- }
- ErrorHandler.prototype.handleError = function (error) {
- var originalError = this._findOriginalError(error);
- var context = this._findContext(error);
- // Note: Browser consoles show the place from where console.error was called.
- // We can use this to give users additional information about the error.
- var errorLogger = getErrorLogger(error);
- errorLogger(this._console, "ERROR", error);
- if (originalError) {
- errorLogger(this._console, "ORIGINAL ERROR", originalError);
- }
- if (context) {
- errorLogger(this._console, 'ERROR CONTEXT', context);
- }
- };
- /** @internal */
- ErrorHandler.prototype._findContext = function (error) {
- if (error) {
- return getDebugContext(error) ? getDebugContext(error) :
- this._findContext(getOriginalError(error));
- }
- return null;
- };
- /** @internal */
- ErrorHandler.prototype._findOriginalError = function (error) {
- var e = getOriginalError(error);
- while (e && getOriginalError(e)) {
- e = getOriginalError(e);
- }
- return e;
- };
- return ErrorHandler;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * THIS FILE CONTAINS CODE WHICH SHOULD BE TREE SHAKEN AND NEVER CALLED FROM PRODUCTION CODE!!!
- */
- /**
- * Creates an `Array` construction with a given name. This is useful when
- * looking for memory consumption to see what time of array it is.
- *
- *
- * @param name Name to give to the constructor
- * @returns A subclass of `Array` if possible. This can only be done in
- * environments which support `class` construct.
- */
- function createNamedArrayType(name) {
- // This should never be called in prod mode, so let's verify that is the case.
- if (ngDevMode) {
- try {
- // We need to do it this way so that TypeScript does not down-level the below code.
- var FunctionConstructor = createNamedArrayType.constructor;
- return (new FunctionConstructor('Array', "return class ABC extends Array{}"))(Array);
- }
- catch (e) {
- // If it does not work just give up and fall back to regular Array.
- return Array;
- }
- }
- else {
- throw new Error('Looks like we are in \'prod mode\', but we are creating a named Array type, which is wrong! Check your code');
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function normalizeDebugBindingName(name) {
- // Attribute names with `$` (eg `x-y$`) are valid per spec, but unsupported by some browsers
- name = camelCaseToDashCase(name.replace(/[$@]/g, '_'));
- return "ng-reflect-" + name;
- }
- var CAMEL_CASE_REGEXP = /([A-Z])/g;
- function camelCaseToDashCase(input) {
- return input.replace(CAMEL_CASE_REGEXP, function () {
- var m = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- m[_i] = arguments[_i];
- }
- return '-' + m[1].toLowerCase();
- });
- }
- function normalizeDebugBindingValue(value) {
- try {
- // Limit the size of the value as otherwise the DOM just gets polluted.
- return value != null ? value.toString().slice(0, 30) : value;
- }
- catch (e) {
- return '[ERROR] Exception while trying to serialize the value';
- }
- }
- // Note: This hack is necessary so we don't erroneously get a circular dependency
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /** A special value which designates that a value has not changed. */
- var NO_CHANGE = {};
- /**
- * Combines the binding value and a factory for an animation player.
- *
- * Used to bind a player to an element template binding (currently only
- * `[style]`, `[style.prop]`, `[class]` and `[class.name]` bindings
- * supported). The provided `factoryFn` function will be run once all
- * the associated bindings have been evaluated on the element and is
- * designed to return a player which will then be placed on the element.
- *
- * @param factoryFn The function that is used to create a player
- * once all the rendering-related (styling values) have been
- * processed for the element binding.
- * @param value The raw value that will be exposed to the binding
- * so that the binding can update its internal values when
- * any changes are evaluated.
- */
- /**
- * Runs through the initial class values present in the provided
- * context and renders them via the provided renderer on the element.
- *
- * @param element the element the styling will be applied to
- * @param context the source styling context which contains the initial class values
- * @param renderer the renderer instance that will be used to apply the class
- * @returns the index that the classes were applied up until
- */
- function renderInitialClasses(element, context, renderer, startIndex) {
- var initialClasses = context[4 /* InitialClassValuesPosition */];
- var i = startIndex || 2 /* KeyValueStartPosition */;
- while (i < initialClasses.length) {
- var value = initialClasses[i + 1 /* ValueOffset */];
- if (value) {
- setClass(element, initialClasses[i + 0 /* PropOffset */], true, renderer, null);
- }
- i += 3 /* Size */;
- }
- return i;
- }
- /**
- * Runs through the initial styles values present in the provided
- * context and renders them via the provided renderer on the element.
- *
- * @param element the element the styling will be applied to
- * @param context the source styling context which contains the initial class values
- * @param renderer the renderer instance that will be used to apply the class
- * @returns the index that the styles were applied up until
- */
- function renderInitialStyles(element, context, renderer, startIndex) {
- var initialStyles = context[3 /* InitialStyleValuesPosition */];
- var i = startIndex || 2 /* KeyValueStartPosition */;
- while (i < initialStyles.length) {
- var value = initialStyles[i + 1 /* ValueOffset */];
- if (value) {
- setStyle(element, initialStyles[i + 0 /* PropOffset */], value, renderer, null);
- }
- i += 3 /* Size */;
- }
- return i;
- }
- /**
- * Assigns a style value to a style property for the given element.
- *
- * This function renders a given CSS prop/value entry using the
- * provided renderer. If a `store` value is provided then
- * that will be used a render context instead of the provided
- * renderer.
- *
- * @param native the DOM Element
- * @param prop the CSS style property that will be rendered
- * @param value the CSS style value that will be rendered
- * @param renderer
- * @param store an optional key/value map that will be used as a context to render styles on
- */
- function setStyle(native, prop, value, renderer, sanitizer, store, playerBuilder) {
- value =
- sanitizer && value ? sanitizer(prop, value, 3 /* ValidateAndSanitize */) : value;
- if (store || playerBuilder) {
- if (store) {
- store.setValue(prop, value);
- }
- if (playerBuilder) {
- playerBuilder.setValue(prop, value);
- }
- }
- else if (value) {
- value = value.toString(); // opacity, z-index and flexbox all have number values which may not
- // assign as numbers
- ngDevMode && ngDevMode.rendererSetStyle++;
- isProceduralRenderer(renderer) ?
- renderer.setStyle(native, prop, value, RendererStyleFlags3.DashCase) :
- native.style.setProperty(prop, value);
- }
- else {
- ngDevMode && ngDevMode.rendererRemoveStyle++;
- isProceduralRenderer(renderer) ?
- renderer.removeStyle(native, prop, RendererStyleFlags3.DashCase) :
- native.style.removeProperty(prop);
- }
- }
- /**
- * Adds/removes the provided className value to the provided element.
- *
- * This function renders a given CSS class value using the provided
- * renderer (by adding or removing it from the provided element).
- * If a `store` value is provided then that will be used a render
- * context instead of the provided renderer.
- *
- * @param native the DOM Element
- * @param prop the CSS style property that will be rendered
- * @param value the CSS style value that will be rendered
- * @param renderer
- * @param store an optional key/value map that will be used as a context to render styles on
- */
- function setClass(native, className, add, renderer, store, playerBuilder) {
- if (store || playerBuilder) {
- if (store) {
- store.setValue(className, add);
- }
- if (playerBuilder) {
- playerBuilder.setValue(className, add);
- }
- // DOMTokenList will throw if we try to add or remove an empty string.
- }
- else if (className !== '') {
- if (add) {
- ngDevMode && ngDevMode.rendererAddClass++;
- isProceduralRenderer(renderer) ? renderer.addClass(native, className) :
- native['classList'].add(className);
- }
- else {
- ngDevMode && ngDevMode.rendererRemoveClass++;
- isProceduralRenderer(renderer) ? renderer.removeClass(native, className) :
- native['classList'].remove(className);
- }
- }
- }
- function isClassBasedValue(context, index) {
- var adjustedIndex = index >= 10 /* SingleStylesStartPosition */ ? (index + 0 /* FlagsOffset */) : index;
- return (context[adjustedIndex] & 2 /* Class */) == 2 /* Class */;
- }
- function getValue(context, index) {
- return context[index + 2 /* ValueOffset */];
- }
- function getProp(context, index) {
- return context[index + 1 /* PropertyOffset */];
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Marks that the next string is for element.
- *
- * See `I18nMutateOpCodes` documentation.
- */
- var ELEMENT_MARKER = {
- marker: 'element'
- };
- /**
- * Marks that the next string is for comment.
- *
- * See `I18nMutateOpCodes` documentation.
- */
- var COMMENT_MARKER = {
- marker: 'comment'
- };
- var _stylingMode$1 = 0;
- function runtimeIsNewStylingInUse() {
- return _stylingMode$1 > 0 /* UseOld */;
- }
- var _currentSanitizer;
- function setCurrentStyleSanitizer(sanitizer) {
- _currentSanitizer = sanitizer;
- }
- function getCurrentStyleSanitizer() {
- return _currentSanitizer;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function attachDebugObject(obj, debug) {
- Object.defineProperty(obj, 'debug', { value: debug, enumerable: false });
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getConfig(context) {
- return context[0 /* ConfigPosition */];
- }
- function getProp$1(context, index) {
- return context[index + 2 /* PropOffset */];
- }
- function getPropConfig(context, index) {
- return context[index + 0 /* ConfigAndGuardOffset */] &
- 1 /* Mask */;
- }
- function isSanitizationRequired(context, index) {
- return (getPropConfig(context, index) & 1 /* SanitizationRequired */) > 0;
- }
- function getGuardMask(context, index) {
- var configGuardValue = context[index + 0 /* ConfigAndGuardOffset */];
- return configGuardValue >> 1 /* TotalBits */;
- }
- function setGuardMask(context, index, maskValue) {
- var config = getPropConfig(context, index);
- var guardMask = maskValue << 1 /* TotalBits */;
- context[index + 0 /* ConfigAndGuardOffset */] = config | guardMask;
- }
- function getValuesCount(context, index) {
- return context[index + 1 /* ValuesCountOffset */];
- }
- function getBindingValue(context, index, offset) {
- return context[index + 3 /* BindingsStartOffset */ + offset];
- }
- function getDefaultValue(context, index) {
- var valuesCount = getValuesCount(context, index);
- return context[index + 3 /* BindingsStartOffset */ + valuesCount - 1];
- }
- function isContextLocked(context) {
- return (getConfig(context) & 1 /* Locked */) > 0;
- }
- function getPropValuesStartPosition(context) {
- return 5 /* MapBindingsBindingsStartPosition */ +
- context[3 /* MapBindingsValuesCountPosition */];
- }
- /**
- * Determines whether the provided styling value is truthy or falsy.
- */
- function isStylingValueDefined(value) {
- // the reason why null is compared against is because
- // a CSS class value that is set to `false` must be
- // respected (otherwise it would be treated as falsy).
- // Empty string values are because developers usually
- // set a value to an empty string to remove it.
- return value != null && value !== '';
- }
- /**
- * Returns the current style sanitizer function for the given view.
- *
- * The default style sanitizer (which lives inside of `LView`) will
- * be returned depending on whether the `styleSanitizer` instruction
- * was called or not prior to any styling instructions running.
- */
- function getCurrentOrLViewSanitizer(lView) {
- var sanitizer = (getCurrentStyleSanitizer() || lView[SANITIZER]);
- if (sanitizer && typeof sanitizer !== 'function') {
- setCurrentStyleSanitizer(sanitizer);
- return sanitizeUsingSanitizerObject;
- }
- return sanitizer;
- }
- /**
- * Style sanitization function that internally uses a `Sanitizer` instance to handle style
- * sanitization.
- */
- var sanitizeUsingSanitizerObject = function (prop, value, mode) {
- var sanitizer = getCurrentStyleSanitizer();
- if (sanitizer) {
- if (mode & 2 /* SanitizeOnly */) {
- return sanitizer.sanitize(SecurityContext$1.STYLE, value);
- }
- else {
- return true;
- }
- }
- return value;
- };
- /**
- * --------
- *
- * This file contains the core logic for styling in Angular.
- *
- * All styling bindings (i.e. `[style]`, `[style.prop]`, `[class]` and `[class.name]`)
- * will have their values be applied through the logic in this file.
- *
- * When a binding is encountered (e.g. `<div [style.width]="w">`) then
- * the binding data will be populated into a `TStylingContext` data-structure.
- * There is only one `TStylingContext` per `TNode` and each element instance
- * will update its style/class binding values in concert with the styling
- * context.
- *
- * To learn more about the algorithm see `TStylingContext`.
- *
- * --------
- */
- var DEFAULT_BINDING_VALUE = null;
- var DEFAULT_SIZE_VALUE = 1;
- // The first bit value reflects a map-based binding value's bit.
- // The reason why it's always activated for every entry in the map
- // is so that if any map-binding values update then all other prop
- // based bindings will pass the guard check automatically without
- // any extra code or flags.
- var DEFAULT_GUARD_MASK_VALUE = 1;
- var deferredBindingQueue = [];
- /**
- * Flushes the collection of deferred bindings and causes each entry
- * to be registered into the context.
- */
- function flushDeferredBindings() {
- var i = 0;
- while (i < deferredBindingQueue.length) {
- var context = deferredBindingQueue[i++];
- var count = deferredBindingQueue[i++];
- var prop = deferredBindingQueue[i++];
- var bindingIndex = deferredBindingQueue[i++];
- var sanitizationRequired = deferredBindingQueue[i++];
- registerBinding(context, count, prop, bindingIndex, sanitizationRequired);
- }
- deferredBindingQueue.length = 0;
- }
- /**
- * Registers the provided binding (prop + bindingIndex) into the context.
- *
- * This function is shared between bindings that are assigned immediately
- * (via `updateBindingData`) and at a deferred stage. When called, it will
- * figure out exactly where to place the binding data in the context.
- *
- * It is needed because it will either update or insert a styling property
- * into the context at the correct spot.
- *
- * When called, one of two things will happen:
- *
- * 1) If the property already exists in the context then it will just add
- * the provided `bindingValue` to the end of the binding sources region
- * for that particular property.
- *
- * - If the binding value is a number then it will be added as a new
- * binding index source next to the other binding sources for the property.
- *
- * - Otherwise, if the binding value is a string/boolean/null type then it will
- * replace the default value for the property if the default value is `null`.
- *
- * 2) If the property does not exist then it will be inserted into the context.
- * The styling context relies on all properties being stored in alphabetical
- * order, so it knows exactly where to store it.
- *
- * When inserted, a default `null` value is created for the property which exists
- * as the default value for the binding. If the bindingValue property is inserted
- * and it is either a string, number or null value then that will replace the default
- * value.
- *
- * Note that this function is also used for map-based styling bindings. They are treated
- * much the same as prop-based bindings, but, because they do not have a property value
- * (since it's a map), all map-based entries are stored in an already populated area of
- * the context at the top (which is reserved for map-based entries).
- */
- function registerBinding(context, countId, prop, bindingValue, sanitizationRequired) {
- // prop-based bindings (e.g `<div [style.width]="w" [class.foo]="f">`)
- if (prop) {
- var found = false;
- var i = getPropValuesStartPosition(context);
- while (i < context.length) {
- var valuesCount = getValuesCount(context, i);
- var p = getProp$1(context, i);
- found = prop <= p;
- if (found) {
- // all style/class bindings are sorted by property name
- if (prop < p) {
- allocateNewContextEntry(context, i, prop, sanitizationRequired);
- }
- addBindingIntoContext(context, false, i, bindingValue, countId);
- break;
- }
- i += 3 /* BindingsStartOffset */ + valuesCount;
- }
- if (!found) {
- allocateNewContextEntry(context, context.length, prop, sanitizationRequired);
- addBindingIntoContext(context, false, i, bindingValue, countId);
- }
- }
- else {
- // map-based bindings (e.g `<div [style]="s" [class]="{className:true}">`)
- // there is no need to allocate the map-based binding region into the context
- // since it is already there when the context is first created.
- addBindingIntoContext(context, true, 2 /* MapBindingsPosition */, bindingValue, countId);
- }
- }
- function allocateNewContextEntry(context, index, prop, sanitizationRequired) {
- // 1,2: splice index locations
- // 3: each entry gets a config value (guard mask + flags)
- // 4. each entry gets a size value (which is always one because there is always a default binding
- // value)
- // 5. the property that is getting allocated into the context
- // 6. the default binding value (usually `null`)
- var config = sanitizationRequired ? 1 /* SanitizationRequired */ :
- 0 /* Default */;
- context.splice(index, 0, config, DEFAULT_SIZE_VALUE, prop, DEFAULT_BINDING_VALUE);
- setGuardMask(context, index, DEFAULT_GUARD_MASK_VALUE);
- }
- /**
- * Inserts a new binding value into a styling property tuple in the `TStylingContext`.
- *
- * A bindingValue is inserted into a context during the first update pass
- * of a template or host bindings function. When this occurs, two things
- * happen:
- *
- * - If the bindingValue value is a number then it is treated as a bindingIndex
- * value (a index in the `LView`) and it will be inserted next to the other
- * binding index entries.
- *
- * - Otherwise the binding value will update the default value for the property
- * and this will only happen if the default value is `null`.
- *
- * Note that this function also handles map-based bindings and will insert them
- * at the top of the context.
- */
- function addBindingIntoContext(context, isMapBased, index, bindingValue, countId) {
- var valuesCount = getValuesCount(context, index);
- var lastValueIndex = index + 3 /* BindingsStartOffset */ + valuesCount;
- if (!isMapBased) {
- // prop-based values all have default values, but map-based entries do not.
- // we want to access the index for the default value in this case and not just
- // the bindings...
- lastValueIndex--;
- }
- if (typeof bindingValue === 'number') {
- context.splice(lastValueIndex, 0, bindingValue);
- context[index + 1 /* ValuesCountOffset */]++;
- // now that a new binding index has been added to the property
- // the guard mask bit value (at the `countId` position) needs
- // to be included into the existing mask value.
- var guardMask = getGuardMask(context, index) | (1 << countId);
- setGuardMask(context, index, guardMask);
- }
- else if (typeof bindingValue === 'string' && context[lastValueIndex] == null) {
- context[lastValueIndex] = bindingValue;
- }
- }
- /**
- * Runs through the provided styling context and applies each value to
- * the provided element (via the renderer) if one or more values are present.
- *
- * This function will iterate over all entries present in the provided
- * `TStylingContext` array (both prop-based and map-based bindings).-
- *
- * Each entry, within the `TStylingContext` array, is stored alphabetically
- * and this means that each prop/value entry will be applied in order
- * (so long as it is marked dirty in the provided `bitMask` value).
- *
- * If there are any map-based entries present (which are applied to the
- * element via the `[style]` and `[class]` bindings) then those entries
- * will be applied as well. However, the code for that is not apart of
- * this function. Instead, each time a property is visited, then the
- * code below will call an external function called `stylingMapsSyncFn`
- * and, if present, it will keep the application of styling values in
- * map-based bindings up to sync with the application of prop-based
- * bindings.
- *
- * Visit `styling_next/map_based_bindings.ts` to learn more about how the
- * algorithm works for map-based styling bindings.
- *
- * Note that this function is not designed to be called in isolation (use
- * `applyClasses` and `applyStyles` to actually apply styling values).
- */
- function applyStyling(context, renderer, element, bindingData, bitMaskValue, applyStylingFn, sanitizer) {
- deferredBindingQueue.length && flushDeferredBindings();
- var bitMask = normalizeBitMaskValue(bitMaskValue);
- var stylingMapsSyncFn = getStylingMapsSyncFn();
- var mapsGuardMask = getGuardMask(context, 2 /* MapBindingsPosition */);
- var applyAllValues = (bitMask & mapsGuardMask) > 0;
- var mapsMode = applyAllValues ? 1 /* ApplyAllValues */ : 0 /* TraverseValues */;
- var i = getPropValuesStartPosition(context);
- while (i < context.length) {
- var valuesCount = getValuesCount(context, i);
- var guardMask = getGuardMask(context, i);
- if (bitMask & guardMask) {
- var valueApplied = false;
- var prop = getProp$1(context, i);
- var valuesCountUpToDefault = valuesCount - 1;
- var defaultValue = getBindingValue(context, i, valuesCountUpToDefault);
- // case 1: apply prop-based values
- // try to apply the binding values and see if a non-null
- // value gets set for the styling binding
- for (var j = 0; j < valuesCountUpToDefault; j++) {
- var bindingIndex = getBindingValue(context, i, j);
- var value = bindingData[bindingIndex];
- if (isStylingValueDefined(value)) {
- var finalValue = sanitizer && isSanitizationRequired(context, i) ?
- sanitizer(prop, value, 2 /* SanitizeOnly */) :
- value;
- applyStylingFn(renderer, element, prop, finalValue, bindingIndex);
- valueApplied = true;
- break;
- }
- }
- // case 2: apply map-based values
- // traverse through each map-based styling binding and update all values up to
- // the provided `prop` value. If the property was not applied in the loop above
- // then it will be attempted to be applied in the maps sync code below.
- if (stylingMapsSyncFn) {
- // determine whether or not to apply the target property or to skip it
- var mode = mapsMode | (valueApplied ? 4 /* SkipTargetProp */ :
- 2 /* ApplyTargetProp */);
- var valueAppliedWithinMap = stylingMapsSyncFn(context, renderer, element, bindingData, applyStylingFn, sanitizer, mode, prop, defaultValue);
- valueApplied = valueApplied || valueAppliedWithinMap;
- }
- // case 3: apply the default value
- // if the value has not yet been applied then a truthy value does not exist in the
- // prop-based or map-based bindings code. If and when this happens, just apply the
- // default value (even if the default value is `null`).
- if (!valueApplied) {
- applyStylingFn(renderer, element, prop, defaultValue);
- }
- }
- i += 3 /* BindingsStartOffset */ + valuesCount;
- }
- // the map-based styling entries may have not applied all their
- // values. For this reason, one more call to the sync function
- // needs to be issued at the end.
- if (stylingMapsSyncFn) {
- stylingMapsSyncFn(context, renderer, element, bindingData, applyStylingFn, sanitizer, mapsMode);
- }
- }
- function normalizeBitMaskValue(value) {
- // if pass => apply all values (-1 implies that all bits are flipped to true)
- if (value === true)
- return -1;
- // if pass => skip all values
- if (value === false)
- return 0;
- // return the bit mask value as is
- return value;
- }
- var _activeStylingMapApplyFn = null;
- function getStylingMapsSyncFn() {
- return _activeStylingMapApplyFn;
- }
- function setStylingMapsSyncFn(fn) {
- _activeStylingMapApplyFn = fn;
- }
- /**
- * --------
- *
- * This file contains the algorithm logic for applying map-based bindings
- * such as `[style]` and `[class]`.
- *
- * --------
- */
- /**
- * Used to apply styling values presently within any map-based bindings on an element.
- *
- * Angular supports map-based styling bindings which can be applied via the
- * `[style]` and `[class]` bindings which can be placed on any HTML element.
- * These bindings can work independently, together or alongside prop-based
- * styling bindings (e.g. `<div [style]="x" [style.width]="w">`).
- *
- * If a map-based styling binding is detected by the compiler, the following
- * AOT code is produced:
- *
- * ```typescript
- * styleMap(ctx.styles); // styles = {key:value}
- * classMap(ctx.classes); // classes = {key:value}|string
- * ```
- *
- * If and when either of the instructions above are evaluated, then the code
- * present in this file is included into the bundle. The mechanism used, to
- * activate support for map-based bindings at runtime is possible via the
- * `activeStylingMapFeature` function (which is also present in this file).
- *
- * # The Algorithm
- * Whenever a map-based binding updates (which is when the identity of the
- * map-value changes) then the map is iterated over and a `LStylingMap` array
- * is produced. The `LStylingMap` instance is stored in the binding location
- * where the `BINDING_INDEX` is situated when the `styleMap()` or `classMap()`
- * instruction were called. Once the binding changes, then the internal `bitMask`
- * value is marked as dirty.
- *
- * Styling values are applied once CD exits the element (which happens when
- * the `select(n)` instruction is called or the template function exits). When
- * this occurs, all prop-based bindings are applied. If a map-based binding is
- * present then a special flushing function (called a sync function) is made
- * available and it will be called each time a styling property is flushed.
- *
- * The flushing algorithm is designed to apply styling for a property (which is
- * a CSS property or a className value) one by one. If map-based bindings
- * are present, then the flushing algorithm will keep calling the maps styling
- * sync function each time a property is visited. This way, the flushing
- * behavior of map-based bindings will always be at the same property level
- * as the current prop-based property being iterated over (because everything
- * is alphabetically sorted).
- *
- * Let's imagine we have the following HTML template code:
- *
- * ```html
- * <div [style]="{width:'100px', height:'200px', 'z-index':'10'}"
- * [style.width.px]="200">...</div>
- * ```
- *
- * When CD occurs, both the `[style]` and `[style.width]` bindings
- * are evaluated. Then when the styles are flushed on screen, the
- * following operations happen:
- *
- * 1. `[style.width]` is attempted to be written to the element.
- *
- * 2. Once that happens, the algorithm instructs the map-based
- * entries (`[style]` in this case) to "catch up" and apply
- * all values up to the `width` value. When this happens the
- * `height` value is applied to the element (since it is
- * alphabetically situated before the `width` property).
- *
- * 3. Since there are no more prop-based entries anymore, the
- * loop exits and then, just before the flushing ends, it
- * instructs all map-based bindings to "finish up" applying
- * their values.
- *
- * 4. The only remaining value within the map-based entries is
- * the `z-index` value (`width` got skipped because it was
- * successfully applied via the prop-based `[style.width]`
- * binding). Since all map-based entries are told to "finish up",
- * the `z-index` value is iterated over and it is then applied
- * to the element.
- *
- * The most important thing to take note of here is that prop-based
- * bindings are evaluated in order alongside map-based bindings.
- * This allows all styling across an element to be applied in O(n)
- * time (a similar algorithm is that of the array merge algorithm
- * in merge sort).
- */
- var syncStylingMap = function (context, renderer, element, data, applyStylingFn, sanitizer, mode, targetProp, defaultValue) {
- var targetPropValueWasApplied = false;
- // once the map-based styling code is activate it is never deactivated. For this reason a
- // check to see if the current styling context has any map based bindings is required.
- var totalMaps = getValuesCount(context, 2 /* MapBindingsPosition */);
- if (totalMaps) {
- var runTheSyncAlgorithm = true;
- var loopUntilEnd = !targetProp;
- // If the code is told to finish up (run until the end), but the mode
- // hasn't been flagged to apply values (it only traverses values) then
- // there is no point in iterating over the array because nothing will
- // be applied to the element.
- if (loopUntilEnd && (mode & ~1 /* ApplyAllValues */)) {
- runTheSyncAlgorithm = false;
- targetPropValueWasApplied = true;
- }
- if (runTheSyncAlgorithm) {
- targetPropValueWasApplied = innerSyncStylingMap(context, renderer, element, data, applyStylingFn, sanitizer, mode, targetProp || null, 0, defaultValue || null);
- }
- if (loopUntilEnd) {
- resetSyncCursors();
- }
- }
- return targetPropValueWasApplied;
- };
- /**
- * Recursive function designed to apply map-based styling to an element one map at a time.
- *
- * This function is designed to be called from the `syncStylingMap` function and will
- * apply map-based styling data one map at a time to the provided `element`.
- *
- * This function is recursive and it will call itself if a follow-up map value is to be
- * processed. To learn more about how the algorithm works, see `syncStylingMap`.
- */
- function innerSyncStylingMap(context, renderer, element, data, applyStylingFn, sanitizer, mode, targetProp, currentMapIndex, defaultValue) {
- var targetPropValueWasApplied = false;
- var totalMaps = getValuesCount(context, 2 /* MapBindingsPosition */);
- if (currentMapIndex < totalMaps) {
- var bindingIndex = getBindingValue(context, 2 /* MapBindingsPosition */, currentMapIndex);
- var lStylingMap = data[bindingIndex];
- var cursor = getCurrentSyncCursor(currentMapIndex);
- while (cursor < lStylingMap.length) {
- var prop = getMapProp(lStylingMap, cursor);
- var iteratedTooFar = targetProp && prop > targetProp;
- var isTargetPropMatched = !iteratedTooFar && prop === targetProp;
- var value = getMapValue(lStylingMap, cursor);
- var valueIsDefined = isStylingValueDefined(value);
- // the recursive code is designed to keep applying until
- // it reaches or goes past the target prop. If and when
- // this happens then it will stop processing values, but
- // all other map values must also catch up to the same
- // point. This is why a recursive call is still issued
- // even if the code has iterated too far.
- var innerMode = iteratedTooFar ? mode : resolveInnerMapMode(mode, valueIsDefined, isTargetPropMatched);
- var innerProp = iteratedTooFar ? targetProp : prop;
- var valueApplied = innerSyncStylingMap(context, renderer, element, data, applyStylingFn, sanitizer, innerMode, innerProp, currentMapIndex + 1, defaultValue);
- if (iteratedTooFar) {
- break;
- }
- if (!valueApplied && isValueAllowedToBeApplied(mode, isTargetPropMatched)) {
- var useDefault = isTargetPropMatched && !valueIsDefined;
- var valueToApply = useDefault ? defaultValue : value;
- var bindingIndexToApply = useDefault ? bindingIndex : null;
- var finalValue = sanitizer ?
- sanitizer(prop, valueToApply, 3 /* ValidateAndSanitize */) :
- valueToApply;
- applyStylingFn(renderer, element, prop, finalValue, bindingIndexToApply);
- valueApplied = true;
- }
- targetPropValueWasApplied = valueApplied && isTargetPropMatched;
- cursor += 2 /* TupleSize */;
- }
- setCurrentSyncCursor(currentMapIndex, cursor);
- }
- return targetPropValueWasApplied;
- }
- /**
- * Enables support for map-based styling bindings (e.g. `[style]` and `[class]` bindings).
- */
- function activeStylingMapFeature() {
- setStylingMapsSyncFn(syncStylingMap);
- }
- /**
- * Used to determine the mode for the inner recursive call.
- *
- * If an inner map is iterated on then this is done so for one
- * of two reasons:
- *
- * - The target property was detected and the inner map
- * must now "catch up" (pointer-wise) up to where the current
- * map's cursor is situated.
- *
- * - The target property was not detected in the current map
- * and must be found in an inner map. This can only be allowed
- * if the current map iteration is not set to skip the target
- * property.
- */
- function resolveInnerMapMode(currentMode, valueIsDefined, isExactMatch) {
- var innerMode = currentMode;
- if (!valueIsDefined && isExactMatch && !(currentMode & 4 /* SkipTargetProp */)) {
- // case 1: set the mode to apply the targeted prop value if it
- // ends up being encountered in another map value
- innerMode |= 2 /* ApplyTargetProp */;
- innerMode &= ~4 /* SkipTargetProp */;
- }
- else {
- // case 2: set the mode to skip the targeted prop value if it
- // ends up being encountered in another map value
- innerMode |= 4 /* SkipTargetProp */;
- innerMode &= ~2 /* ApplyTargetProp */;
- }
- return innerMode;
- }
- /**
- * Decides whether or not a prop/value entry will be applied to an element.
- *
- * To determine whether or not a value is to be applied,
- * the following procedure is evaluated:
- *
- * First check to see the current `mode` status:
- * 1. If the mode value permits all props to be applied then allow.
- * - But do not allow if the current prop is set to be skipped.
- * 2. Otherwise if the current prop is permitted then allow.
- */
- function isValueAllowedToBeApplied(mode, isTargetPropMatched) {
- var doApplyValue = (mode & 1 /* ApplyAllValues */) > 0;
- if (!doApplyValue) {
- if (mode & 2 /* ApplyTargetProp */) {
- doApplyValue = isTargetPropMatched;
- }
- }
- else if ((mode & 4 /* SkipTargetProp */) && isTargetPropMatched) {
- doApplyValue = false;
- }
- return doApplyValue;
- }
- /**
- * Used to keep track of concurrent cursor values for multiple map-based styling bindings present on
- * an element.
- */
- var MAP_CURSORS = [];
- /**
- * Used to reset the state of each cursor value being used to iterate over map-based styling
- * bindings.
- */
- function resetSyncCursors() {
- for (var i = 0; i < MAP_CURSORS.length; i++) {
- MAP_CURSORS[i] = 1 /* ValuesStartPosition */;
- }
- }
- /**
- * Returns an active cursor value at a given mapIndex location.
- */
- function getCurrentSyncCursor(mapIndex) {
- if (mapIndex >= MAP_CURSORS.length) {
- MAP_CURSORS.push(1 /* ValuesStartPosition */);
- }
- return MAP_CURSORS[mapIndex];
- }
- /**
- * Sets a cursor value at a given mapIndex location.
- */
- function setCurrentSyncCursor(mapIndex, indexValue) {
- MAP_CURSORS[mapIndex] = indexValue;
- }
- function getMapProp(map, index) {
- return map[index + 0 /* PropOffset */];
- }
- function getMapValue(map, index) {
- return map[index + 1 /* ValueOffset */];
- }
- /**
- * A human-readable debug summary of the styling data present within `TStylingContext`.
- *
- * This class is designed to be used within testing code or when an
- * application has `ngDevMode` activated.
- */
- var TStylingContextDebug = /** @class */ (function () {
- function TStylingContextDebug(context) {
- this.context = context;
- }
- Object.defineProperty(TStylingContextDebug.prototype, "isLocked", {
- get: function () { return isContextLocked(this.context); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(TStylingContextDebug.prototype, "entries", {
- /**
- * Returns a detailed summary of each styling entry in the context.
- *
- * See `TStylingTupleSummary`.
- */
- get: function () {
- var context = this.context;
- var entries = {};
- var start = 2 /* MapBindingsPosition */;
- var i = start;
- while (i < context.length) {
- var valuesCount = getValuesCount(context, i);
- // the context may contain placeholder values which are populated ahead of time,
- // but contain no actual binding values. In this situation there is no point in
- // classifying this as an "entry" since no real data is stored here yet.
- if (valuesCount) {
- var prop = getProp$1(context, i);
- var guardMask = getGuardMask(context, i);
- var defaultValue = getDefaultValue(context, i);
- var sanitizationRequired = isSanitizationRequired(context, i);
- var bindingsStartPosition = i + 3 /* BindingsStartOffset */;
- var sources = [];
- for (var j = 0; j < valuesCount; j++) {
- sources.push(context[bindingsStartPosition + j]);
- }
- entries[prop] = { prop: prop, guardMask: guardMask, sanitizationRequired: sanitizationRequired, valuesCount: valuesCount, defaultValue: defaultValue, sources: sources };
- }
- i += 3 /* BindingsStartOffset */ + valuesCount;
- }
- return entries;
- },
- enumerable: true,
- configurable: true
- });
- return TStylingContextDebug;
- }());
- /**
- * A human-readable debug summary of the styling data present for a `DebugNode` instance.
- *
- * This class is designed to be used within testing code or when an
- * application has `ngDevMode` activated.
- */
- var NodeStylingDebug = /** @class */ (function () {
- function NodeStylingDebug(context, _data, _isClassBased) {
- this.context = context;
- this._data = _data;
- this._isClassBased = _isClassBased;
- this._sanitizer = null;
- }
- /**
- * Overrides the sanitizer used to process styles.
- */
- NodeStylingDebug.prototype.overrideSanitizer = function (sanitizer) { this._sanitizer = sanitizer; };
- Object.defineProperty(NodeStylingDebug.prototype, "summary", {
- /**
- * Returns a detailed summary of each styling entry in the context and
- * what their runtime representation is.
- *
- * See `LStylingSummary`.
- */
- get: function () {
- var entries = {};
- this._mapValues(function (prop, value, bindingIndex) {
- entries[prop] = { prop: prop, value: value, bindingIndex: bindingIndex };
- });
- return entries;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NodeStylingDebug.prototype, "values", {
- /**
- * Returns a key/value map of all the styles/classes that were last applied to the element.
- */
- get: function () {
- var entries = {};
- this._mapValues(function (prop, value) { entries[prop] = value; });
- return entries;
- },
- enumerable: true,
- configurable: true
- });
- NodeStylingDebug.prototype._mapValues = function (fn) {
- // there is no need to store/track an element instance. The
- // element is only used when the styling algorithm attempts to
- // style the value (and we mock out the stylingApplyFn anyway).
- var mockElement = {};
- var hasMaps = getValuesCount(this.context, 2 /* MapBindingsPosition */) > 0;
- if (hasMaps) {
- activeStylingMapFeature();
- }
- var mapFn = function (renderer, element, prop, value, bindingIndex) {
- fn(prop, value, bindingIndex || null);
- };
- var sanitizer = this._isClassBased ? null : (this._sanitizer ||
- getCurrentOrLViewSanitizer(this._data));
- applyStyling(this.context, null, mockElement, this._data, true, mapFn, sanitizer);
- };
- return NodeStylingDebug;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /*
- * This file contains conditionally attached classes which provide human readable (debug) level
- * information for `LView`, `LContainer` and other internal data structures. These data structures
- * are stored internally as array which makes it very difficult during debugging to reason about the
- * current state of the system.
- *
- * Patching the array with extra property does change the array's hidden class' but it does not
- * change the cost of access, therefore this patching should not have significant if any impact in
- * `ngDevMode` mode. (see: https://jsperf.com/array-vs-monkey-patch-array)
- *
- * So instead of seeing:
- * ```
- * Array(30) [Object, 659, null, …]
- * ```
- *
- * You get to see:
- * ```
- * LViewDebug {
- * views: [...],
- * flags: {attached: true, ...}
- * nodes: [
- * {html: '<div id="123">', ..., nodes: [
- * {html: '<span>', ..., nodes: null}
- * ]}
- * ]
- * }
- * ```
- */
- var LViewArray = ngDevMode && createNamedArrayType('LView');
- var LVIEW_EMPTY; // can't initialize here or it will not be tree shaken, because `LView`
- // constructor could have side-effects.
- /**
- * This function clones a blueprint and creates LView.
- *
- * Simple slice will keep the same type, and we need it to be LView
- */
- function cloneToLView(list) {
- if (LVIEW_EMPTY === undefined)
- LVIEW_EMPTY = new LViewArray();
- return LVIEW_EMPTY.concat(list);
- }
- /**
- * This class is a debug version of Object literal so that we can have constructor name show up in
- * debug tools in ngDevMode.
- */
- var TViewConstructor = /** @class */ (function () {
- function TView(id, //
- blueprint, //
- template, //
- viewQuery, //
- node, //
- data, //
- bindingStartIndex, //
- viewQueryStartIndex, //
- expandoStartIndex, //
- expandoInstructions, //
- firstTemplatePass, //
- staticViewQueries, //
- staticContentQueries, //
- preOrderHooks, //
- preOrderCheckHooks, //
- contentHooks, //
- contentCheckHooks, //
- viewHooks, //
- viewCheckHooks, //
- destroyHooks, //
- cleanup, //
- contentQueries, //
- components, //
- directiveRegistry, //
- pipeRegistry, //
- firstChild, //
- schemas) {
- this.id = id;
- this.blueprint = blueprint;
- this.template = template;
- this.viewQuery = viewQuery;
- this.node = node;
- this.data = data;
- this.bindingStartIndex = bindingStartIndex;
- this.viewQueryStartIndex = viewQueryStartIndex;
- this.expandoStartIndex = expandoStartIndex;
- this.expandoInstructions = expandoInstructions;
- this.firstTemplatePass = firstTemplatePass;
- this.staticViewQueries = staticViewQueries;
- this.staticContentQueries = staticContentQueries;
- this.preOrderHooks = preOrderHooks;
- this.preOrderCheckHooks = preOrderCheckHooks;
- this.contentHooks = contentHooks;
- this.contentCheckHooks = contentCheckHooks;
- this.viewHooks = viewHooks;
- this.viewCheckHooks = viewCheckHooks;
- this.destroyHooks = destroyHooks;
- this.cleanup = cleanup;
- this.contentQueries = contentQueries;
- this.components = components;
- this.directiveRegistry = directiveRegistry;
- this.pipeRegistry = pipeRegistry;
- this.firstChild = firstChild;
- this.schemas = schemas;
- }
- return TView;
- }());
- var TViewData = ngDevMode && createNamedArrayType('TViewData');
- var TVIEWDATA_EMPTY; // can't initialize here or it will not be tree shaken, because `LView`
- // constructor could have side-effects.
- /**
- * This function clones a blueprint and creates TData.
- *
- * Simple slice will keep the same type, and we need it to be TData
- */
- function cloneToTViewData(list) {
- if (TVIEWDATA_EMPTY === undefined)
- TVIEWDATA_EMPTY = new TViewData();
- return TVIEWDATA_EMPTY.concat(list);
- }
- var LViewBlueprint = ngDevMode && createNamedArrayType('LViewBlueprint');
- var MatchesArray = ngDevMode && createNamedArrayType('MatchesArray');
- var TViewComponents = ngDevMode && createNamedArrayType('TViewComponents');
- var TNodeLocalNames = ngDevMode && createNamedArrayType('TNodeLocalNames');
- var TNodeInitialInputs = ngDevMode && createNamedArrayType('TNodeInitialInputs');
- var TNodeInitialData = ngDevMode && createNamedArrayType('TNodeInitialData');
- var LCleanup = ngDevMode && createNamedArrayType('LCleanup');
- var TCleanup = ngDevMode && createNamedArrayType('TCleanup');
- function attachLViewDebug(lView) {
- attachDebugObject(lView, new LViewDebug(lView));
- }
- function toDebug(obj) {
- if (obj) {
- var debug = obj.debug;
- assertDefined(debug, 'Object does not have a debug representation.');
- return debug;
- }
- else {
- return obj;
- }
- }
- /**
- * Use this method to unwrap a native element in `LView` and convert it into HTML for easier
- * reading.
- *
- * @param value possibly wrapped native DOM node.
- * @param includeChildren If `true` then the serialized HTML form will include child elements (same
- * as `outerHTML`). If `false` then the serialized HTML form will only contain the element itself
- * (will not serialize child elements).
- */
- function toHtml(value, includeChildren) {
- if (includeChildren === void 0) { includeChildren = false; }
- var node = unwrapRNode(value);
- if (node) {
- var isTextNode = node.nodeType === Node.TEXT_NODE;
- var outerHTML = (isTextNode ? node.textContent : node.outerHTML) || '';
- if (includeChildren || isTextNode) {
- return outerHTML;
- }
- else {
- var innerHTML = node.innerHTML;
- return outerHTML.split(innerHTML)[0] || null;
- }
- }
- else {
- return null;
- }
- }
- var LViewDebug = /** @class */ (function () {
- function LViewDebug(_raw_lView) {
- this._raw_lView = _raw_lView;
- }
- Object.defineProperty(LViewDebug.prototype, "flags", {
- /**
- * Flags associated with the `LView` unpacked into a more readable state.
- */
- get: function () {
- var flags = this._raw_lView[FLAGS];
- return {
- __raw__flags__: flags,
- initPhaseState: flags & 3 /* InitPhaseStateMask */,
- creationMode: !!(flags & 4 /* CreationMode */),
- firstViewPass: !!(flags & 8 /* FirstLViewPass */),
- checkAlways: !!(flags & 16 /* CheckAlways */),
- dirty: !!(flags & 64 /* Dirty */),
- attached: !!(flags & 128 /* Attached */),
- destroyed: !!(flags & 256 /* Destroyed */),
- isRoot: !!(flags & 512 /* IsRoot */),
- indexWithinInitPhase: flags >> 10 /* IndexWithinInitPhaseShift */,
- };
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LViewDebug.prototype, "parent", {
- get: function () { return toDebug(this._raw_lView[PARENT]); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LViewDebug.prototype, "host", {
- get: function () { return toHtml(this._raw_lView[HOST], true); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LViewDebug.prototype, "context", {
- get: function () { return this._raw_lView[CONTEXT]; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LViewDebug.prototype, "nodes", {
- /**
- * The tree of nodes associated with the current `LView`. The nodes have been normalized into a
- * tree structure with relevant details pulled out for readability.
- */
- get: function () {
- var lView = this._raw_lView;
- var tNode = lView[TVIEW].firstChild;
- return toDebugNodes(tNode, lView);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LViewDebug.prototype, "__other__", {
- /**
- * Additional information which is hidden behind a property. The extra level of indirection is
- * done so that the debug view would not be cluttered with properties which are only rarely
- * relevant to the developer.
- */
- get: function () {
- return {
- tView: this._raw_lView[TVIEW],
- cleanup: this._raw_lView[CLEANUP],
- injector: this._raw_lView[INJECTOR$1],
- rendererFactory: this._raw_lView[RENDERER_FACTORY],
- renderer: this._raw_lView[RENDERER],
- sanitizer: this._raw_lView[SANITIZER],
- childHead: toDebug(this._raw_lView[CHILD_HEAD]),
- next: toDebug(this._raw_lView[NEXT]),
- childTail: toDebug(this._raw_lView[CHILD_TAIL]),
- declarationView: toDebug(this._raw_lView[DECLARATION_VIEW]),
- contentQueries: this._raw_lView[CONTENT_QUERIES],
- queries: this._raw_lView[QUERIES],
- tHost: this._raw_lView[T_HOST],
- bindingIndex: this._raw_lView[BINDING_INDEX],
- };
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LViewDebug.prototype, "childViews", {
- /**
- * Normalized view of child views (and containers) attached at this location.
- */
- get: function () {
- var childViews = [];
- var child = this.__other__.childHead;
- while (child) {
- childViews.push(child);
- child = child.__other__.next;
- }
- return childViews;
- },
- enumerable: true,
- configurable: true
- });
- return LViewDebug;
- }());
- /**
- * Turns a flat list of nodes into a tree by walking the associated `TNode` tree.
- *
- * @param tNode
- * @param lView
- */
- function toDebugNodes(tNode, lView) {
- if (tNode) {
- var debugNodes = [];
- var tNodeCursor = tNode;
- while (tNodeCursor) {
- var rawValue = lView[tNode.index];
- var native = unwrapRNode(rawValue);
- var componentLViewDebug = isStylingContext(rawValue) ? null : toDebug(readLViewValue(rawValue));
- var styles = null;
- var classes = null;
- if (runtimeIsNewStylingInUse()) {
- styles = tNode.newStyles ? new NodeStylingDebug(tNode.newStyles, lView, false) : null;
- classes = tNode.newClasses ? new NodeStylingDebug(tNode.newClasses, lView, true) : null;
- }
- debugNodes.push({
- html: toHtml(native),
- native: native, styles: styles, classes: classes,
- nodes: toDebugNodes(tNode.child, lView),
- component: componentLViewDebug,
- });
- tNodeCursor = tNodeCursor.next;
- }
- return debugNodes;
- }
- else {
- return null;
- }
- }
- var LContainerDebug = /** @class */ (function () {
- function LContainerDebug(_raw_lContainer) {
- this._raw_lContainer = _raw_lContainer;
- }
- Object.defineProperty(LContainerDebug.prototype, "activeIndex", {
- get: function () { return this._raw_lContainer[ACTIVE_INDEX]; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LContainerDebug.prototype, "views", {
- get: function () {
- return this._raw_lContainer.slice(CONTAINER_HEADER_OFFSET)
- .map(toDebug);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LContainerDebug.prototype, "parent", {
- get: function () { return toDebug(this._raw_lContainer[PARENT]); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LContainerDebug.prototype, "queries", {
- get: function () { return this._raw_lContainer[QUERIES]; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LContainerDebug.prototype, "host", {
- get: function () { return this._raw_lContainer[HOST]; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LContainerDebug.prototype, "native", {
- get: function () { return this._raw_lContainer[NATIVE]; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(LContainerDebug.prototype, "__other__", {
- get: function () {
- return {
- next: toDebug(this._raw_lContainer[NEXT]),
- };
- },
- enumerable: true,
- configurable: true
- });
- return LContainerDebug;
- }());
- /**
- * Return an `LView` value if found.
- *
- * @param value `LView` if any
- */
- function readLViewValue(value) {
- while (Array.isArray(value)) {
- // This check is not quite right, as it does not take into account `StylingContext`
- // This is why it is in debug, not in util.ts
- if (value.length >= HEADER_OFFSET - 1)
- return value;
- value = value[HOST];
- }
- return null;
- }
- var I18NDebugItem = /** @class */ (function () {
- function I18NDebugItem(__raw_opCode, _lView, nodeIndex, type) {
- this.__raw_opCode = __raw_opCode;
- this._lView = _lView;
- this.nodeIndex = nodeIndex;
- this.type = type;
- }
- Object.defineProperty(I18NDebugItem.prototype, "tNode", {
- get: function () { return getTNode(this.nodeIndex, this._lView); },
- enumerable: true,
- configurable: true
- });
- return I18NDebugItem;
- }());
- var I18nMutateOpCodesDebug = /** @class */ (function () {
- function I18nMutateOpCodesDebug(__raw_opCodes, __lView) {
- this.__raw_opCodes = __raw_opCodes;
- this.__lView = __lView;
- }
- Object.defineProperty(I18nMutateOpCodesDebug.prototype, "operations", {
- /**
- * A list of operation information about how the OpCodes will act on the view.
- */
- get: function () {
- var _a = this, __lView = _a.__lView, __raw_opCodes = _a.__raw_opCodes;
- var results = [];
- for (var i = 0; i < __raw_opCodes.length; i++) {
- var opCode = __raw_opCodes[i];
- var result = void 0;
- if (typeof opCode === 'string') {
- result = {
- __raw_opCode: opCode,
- type: 'Create Text Node',
- nodeIndex: __raw_opCodes[++i],
- text: opCode,
- };
- }
- if (typeof opCode === 'number') {
- switch (opCode & 7 /* MASK_OPCODE */) {
- case 1 /* AppendChild */:
- var destinationNodeIndex = opCode >>> 17 /* SHIFT_PARENT */;
- result = new I18NDebugItem(opCode, __lView, destinationNodeIndex, 'AppendChild');
- break;
- case 0 /* Select */:
- var nodeIndex = opCode >>> 3 /* SHIFT_REF */;
- result = new I18NDebugItem(opCode, __lView, nodeIndex, 'Select');
- break;
- case 5 /* ElementEnd */:
- var elementIndex = opCode >>> 3 /* SHIFT_REF */;
- result = new I18NDebugItem(opCode, __lView, elementIndex, 'ElementEnd');
- break;
- case 4 /* Attr */:
- elementIndex = opCode >>> 3 /* SHIFT_REF */;
- result = new I18NDebugItem(opCode, __lView, elementIndex, 'Attr');
- result['attrName'] = __raw_opCodes[++i];
- result['attrValue'] = __raw_opCodes[++i];
- break;
- }
- }
- if (!result) {
- switch (opCode) {
- case COMMENT_MARKER:
- result = {
- __raw_opCode: opCode,
- type: 'COMMENT_MARKER',
- commentValue: __raw_opCodes[++i],
- nodeIndex: __raw_opCodes[++i],
- };
- break;
- case ELEMENT_MARKER:
- result = {
- __raw_opCode: opCode,
- type: 'ELEMENT_MARKER',
- };
- break;
- }
- }
- if (!result) {
- result = {
- __raw_opCode: opCode,
- type: 'Unknown Op Code',
- code: opCode,
- };
- }
- results.push(result);
- }
- return results;
- },
- enumerable: true,
- configurable: true
- });
- return I18nMutateOpCodesDebug;
- }());
- var I18nUpdateOpCodesDebug = /** @class */ (function () {
- function I18nUpdateOpCodesDebug(__raw_opCodes, icus, __lView) {
- this.__raw_opCodes = __raw_opCodes;
- this.icus = icus;
- this.__lView = __lView;
- }
- Object.defineProperty(I18nUpdateOpCodesDebug.prototype, "operations", {
- /**
- * A list of operation information about how the OpCodes will act on the view.
- */
- get: function () {
- var _a = this, __lView = _a.__lView, __raw_opCodes = _a.__raw_opCodes, icus = _a.icus;
- var results = [];
- for (var i = 0; i < __raw_opCodes.length; i++) {
- // bit code to check if we should apply the next update
- var checkBit = __raw_opCodes[i];
- // Number of opCodes to skip until next set of update codes
- var skipCodes = __raw_opCodes[++i];
- var value = '';
- for (var j = i + 1; j <= (i + skipCodes); j++) {
- var opCode = __raw_opCodes[j];
- if (typeof opCode === 'string') {
- value += opCode;
- }
- else if (typeof opCode == 'number') {
- if (opCode < 0) {
- // It's a binding index whose value is negative
- // We cannot know the value of the binding so we only show the index
- value += "\uFFFD" + (-opCode - 1) + "\uFFFD";
- }
- else {
- var nodeIndex = opCode >>> 2 /* SHIFT_REF */;
- var tIcuIndex = void 0;
- var tIcu = void 0;
- switch (opCode & 3 /* MASK_OPCODE */) {
- case 1 /* Attr */:
- var attrName = __raw_opCodes[++j];
- var sanitizeFn = __raw_opCodes[++j];
- results.push({
- __raw_opCode: opCode,
- checkBit: checkBit,
- type: 'Attr',
- attrValue: value, attrName: attrName, sanitizeFn: sanitizeFn,
- });
- break;
- case 0 /* Text */:
- results.push({
- __raw_opCode: opCode,
- checkBit: checkBit,
- type: 'Text', nodeIndex: nodeIndex,
- text: value,
- });
- break;
- case 2 /* IcuSwitch */:
- tIcuIndex = __raw_opCodes[++j];
- tIcu = icus[tIcuIndex];
- var result = new I18NDebugItem(opCode, __lView, nodeIndex, 'IcuSwitch');
- result['tIcuIndex'] = tIcuIndex;
- result['checkBit'] = checkBit;
- result['mainBinding'] = value;
- result['tIcu'] = tIcu;
- results.push(result);
- break;
- case 3 /* IcuUpdate */:
- tIcuIndex = __raw_opCodes[++j];
- tIcu = icus[tIcuIndex];
- result = new I18NDebugItem(opCode, __lView, nodeIndex, 'IcuUpdate');
- result['tIcuIndex'] = tIcuIndex;
- result['checkBit'] = checkBit;
- result['tIcu'] = tIcu;
- results.push(result);
- break;
- }
- }
- }
- }
- i += skipCodes;
- }
- return results;
- },
- enumerable: true,
- configurable: true
- });
- return I18nUpdateOpCodesDebug;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function selectInternal(lView, index) {
- // Flush the initial hooks for elements in the view that have been added up to this point.
- executePreOrderHooks(lView, lView[TVIEW], getCheckNoChangesMode(), index);
- }
- var ɵ0$8 = function () { return Promise.resolve(null); };
- /**
- * A permanent marker promise which signifies that the current CD tree is
- * clean.
- */
- var _CLEAN_PROMISE = (ɵ0$8)();
- /**
- * Refreshes the view, executing the following steps in that order:
- * triggers init hooks, refreshes dynamic embedded views, triggers content hooks, sets host
- * bindings, refreshes child components.
- * Note: view hooks are triggered later when leaving the view.
- */
- function refreshDescendantViews(lView) {
- var tView = lView[TVIEW];
- var creationMode = isCreationMode(lView);
- // This needs to be set before children are processed to support recursive components
- tView.firstTemplatePass = false;
- // Resetting the bindingIndex of the current LView as the next steps may trigger change detection.
- lView[BINDING_INDEX] = tView.bindingStartIndex;
- // If this is a creation pass, we should not call lifecycle hooks or evaluate bindings.
- // This will be done in the update pass.
- if (!creationMode) {
- var checkNoChangesMode = getCheckNoChangesMode();
- executePreOrderHooks(lView, tView, checkNoChangesMode, undefined);
- refreshDynamicEmbeddedViews(lView);
- // Content query results must be refreshed before content hooks are called.
- refreshContentQueries(tView, lView);
- resetPreOrderHookFlags(lView);
- executeHooks(lView, tView.contentHooks, tView.contentCheckHooks, checkNoChangesMode, 1 /* AfterContentInitHooksToBeRun */, undefined);
- setHostBindings(tView, lView);
- }
- // We resolve content queries specifically marked as `static` in creation mode. Dynamic
- // content queries are resolved during change detection (i.e. update mode), after embedded
- // views are refreshed (see block above).
- if (creationMode && tView.staticContentQueries) {
- refreshContentQueries(tView, lView);
- }
- refreshChildComponents(tView.components);
- }
- /** Sets the host bindings for the current view. */
- function setHostBindings(tView, viewData) {
- try {
- if (tView.expandoInstructions) {
- var bindingRootIndex = viewData[BINDING_INDEX] = tView.expandoStartIndex;
- setBindingRoot(bindingRootIndex);
- var currentDirectiveIndex = -1;
- var currentElementIndex = -1;
- for (var i = 0; i < tView.expandoInstructions.length; i++) {
- var instruction = tView.expandoInstructions[i];
- if (typeof instruction === 'number') {
- if (instruction <= 0) {
- // Negative numbers mean that we are starting new EXPANDO block and need to update
- // the current element and directive index.
- currentElementIndex = -instruction;
- // Injector block and providers are taken into account.
- var providerCount = tView.expandoInstructions[++i];
- bindingRootIndex += INJECTOR_BLOOM_PARENT_SIZE + providerCount;
- currentDirectiveIndex = bindingRootIndex;
- }
- else {
- // This is either the injector size (so the binding root can skip over directives
- // and get to the first set of host bindings on this node) or the host var count
- // (to get to the next set of host bindings on this node).
- bindingRootIndex += instruction;
- }
- setBindingRoot(bindingRootIndex);
- }
- else {
- // If it's not a number, it's a host binding function that needs to be executed.
- if (instruction !== null) {
- viewData[BINDING_INDEX] = bindingRootIndex;
- var hostCtx = unwrapRNode(viewData[currentDirectiveIndex]);
- instruction(2 /* Update */, hostCtx, currentElementIndex);
- }
- currentDirectiveIndex++;
- }
- }
- }
- }
- finally {
- }
- }
- /** Refreshes content queries for all directives in the given view. */
- function refreshContentQueries(tView, lView) {
- if (tView.contentQueries != null) {
- for (var i = 0; i < tView.contentQueries.length; i++) {
- var directiveDefIdx = tView.contentQueries[i];
- var directiveDef = tView.data[directiveDefIdx];
- ngDevMode &&
- assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined');
- directiveDef.contentQueries(2 /* Update */, lView[directiveDefIdx], directiveDefIdx);
- }
- }
- }
- /** Refreshes child components in the current view. */
- function refreshChildComponents(components) {
- if (components != null) {
- for (var i = 0; i < components.length; i++) {
- componentRefresh(components[i]);
- }
- }
- }
- /**
- * Creates a native element from a tag name, using a renderer.
- * @param name the tag name
- * @param overriddenRenderer Optional A renderer to override the default one
- * @returns the element created
- */
- function elementCreate(name, overriddenRenderer) {
- var native;
- var rendererToUse = overriddenRenderer || getLView()[RENDERER];
- var namespace = getNamespace();
- if (isProceduralRenderer(rendererToUse)) {
- native = rendererToUse.createElement(name, namespace);
- }
- else {
- if (namespace === null) {
- native = rendererToUse.createElement(name);
- }
- else {
- native = rendererToUse.createElementNS(namespace, name);
- }
- }
- return native;
- }
- function createLView(parentLView, tView, context, flags, host, tHostNode, rendererFactory, renderer, sanitizer, injector) {
- var lView = ngDevMode ? cloneToLView(tView.blueprint) : tView.blueprint.slice();
- lView[HOST] = host;
- lView[FLAGS] = flags | 4 /* CreationMode */ | 128 /* Attached */ | 8 /* FirstLViewPass */;
- resetPreOrderHookFlags(lView);
- lView[PARENT] = lView[DECLARATION_VIEW] = parentLView;
- lView[CONTEXT] = context;
- lView[RENDERER_FACTORY] = (rendererFactory || parentLView && parentLView[RENDERER_FACTORY]);
- ngDevMode && assertDefined(lView[RENDERER_FACTORY], 'RendererFactory is required');
- lView[RENDERER] = (renderer || parentLView && parentLView[RENDERER]);
- ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required');
- lView[SANITIZER] = sanitizer || parentLView && parentLView[SANITIZER] || null;
- lView[INJECTOR$1] = injector || parentLView && parentLView[INJECTOR$1] || null;
- lView[T_HOST] = tHostNode;
- ngDevMode && attachLViewDebug(lView);
- return lView;
- }
- function getOrCreateTNode(tView, tHostNode, index, type, name, attrs) {
- // Keep this function short, so that the VM will inline it.
- var adjustedIndex = index + HEADER_OFFSET;
- var tNode = tView.data[adjustedIndex] ||
- createTNodeAtIndex(tView, tHostNode, adjustedIndex, type, name, attrs, index);
- setPreviousOrParentTNode(tNode, true);
- return tNode;
- }
- function createTNodeAtIndex(tView, tHostNode, adjustedIndex, type, name, attrs, index) {
- var previousOrParentTNode = getPreviousOrParentTNode();
- var isParent = getIsParent();
- var parent = isParent ? previousOrParentTNode : previousOrParentTNode && previousOrParentTNode.parent;
- // Parents cannot cross component boundaries because components will be used in multiple places,
- // so it's only set if the view is the same.
- var parentInSameView = parent && parent !== tHostNode;
- var tParentNode = parentInSameView ? parent : null;
- var tNode = tView.data[adjustedIndex] =
- createTNode(tParentNode, type, adjustedIndex, name, attrs);
- // The first node is not always the one at index 0, in case of i18n, index 0 can be the
- // instruction `i18nStart` and the first node has the index 1 or more
- if (index === 0 || !tView.firstChild) {
- tView.firstChild = tNode;
- }
- // Now link ourselves into the tree.
- if (previousOrParentTNode) {
- if (isParent && previousOrParentTNode.child == null &&
- (tNode.parent !== null || previousOrParentTNode.type === 2 /* View */)) {
- // We are in the same view, which means we are adding content node to the parent view.
- previousOrParentTNode.child = tNode;
- }
- else if (!isParent) {
- previousOrParentTNode.next = tNode;
- }
- }
- return tNode;
- }
- function assignTViewNodeToLView(tView, tParentNode, index, lView) {
- // View nodes are not stored in data because they can be added / removed at runtime (which
- // would cause indices to change). Their TNodes are instead stored in tView.node.
- var tNode = tView.node;
- if (tNode == null) {
- ngDevMode && tParentNode &&
- assertNodeOfPossibleTypes(tParentNode, 3 /* Element */, 0 /* Container */);
- tView.node = tNode = createTNode(tParentNode, //
- 2 /* View */, index, null, null);
- }
- return lView[T_HOST] = tNode;
- }
- /**
- * Used for rendering embedded views (e.g. dynamically created views)
- *
- * Dynamically created views must store/retrieve their TViews differently from component views
- * because their template functions are nested in the template functions of their hosts, creating
- * closures. If their host template happens to be an embedded template in a loop (e.g. ngFor
- * inside
- * an ngFor), the nesting would mean we'd have multiple instances of the template function, so we
- * can't store TViews in the template function itself (as we do for comps). Instead, we store the
- * TView for dynamically created views on their host TNode, which only has one instance.
- */
- function renderEmbeddedTemplate(viewToRender, tView, context) {
- var _isParent = getIsParent();
- var _previousOrParentTNode = getPreviousOrParentTNode();
- var oldView;
- if (viewToRender[FLAGS] & 512 /* IsRoot */) {
- // This is a root view inside the view tree
- tickRootContext(getRootContext(viewToRender));
- }
- else {
- // Will become true if the `try` block executes with no errors.
- var safeToRunHooks = false;
- try {
- setPreviousOrParentTNode(null, true);
- oldView = enterView(viewToRender, viewToRender[T_HOST]);
- resetPreOrderHookFlags(viewToRender);
- executeTemplate(viewToRender, tView.template, getRenderFlags(viewToRender), context);
- // This must be set to false immediately after the first creation run because in an
- // ngFor loop, all the views will be created together before update mode runs and turns
- // off firstTemplatePass. If we don't set it here, instances will perform directive
- // matching, etc again and again.
- viewToRender[TVIEW].firstTemplatePass = false;
- refreshDescendantViews(viewToRender);
- safeToRunHooks = true;
- }
- finally {
- leaveView(oldView, safeToRunHooks);
- setPreviousOrParentTNode(_previousOrParentTNode, _isParent);
- }
- }
- }
- function renderComponentOrTemplate(hostView, context, templateFn) {
- var rendererFactory = hostView[RENDERER_FACTORY];
- var oldView = enterView(hostView, hostView[T_HOST]);
- var normalExecutionPath = !getCheckNoChangesMode();
- var creationModeIsActive = isCreationMode(hostView);
- // Will become true if the `try` block executes with no errors.
- var safeToRunHooks = false;
- try {
- if (normalExecutionPath && !creationModeIsActive && rendererFactory.begin) {
- rendererFactory.begin();
- }
- if (creationModeIsActive) {
- // creation mode pass
- templateFn && executeTemplate(hostView, templateFn, 1 /* Create */, context);
- refreshDescendantViews(hostView);
- hostView[FLAGS] &= ~4 /* CreationMode */;
- }
- // update mode pass
- resetPreOrderHookFlags(hostView);
- templateFn && executeTemplate(hostView, templateFn, 2 /* Update */, context);
- refreshDescendantViews(hostView);
- safeToRunHooks = true;
- }
- finally {
- if (normalExecutionPath && !creationModeIsActive && rendererFactory.end) {
- rendererFactory.end();
- }
- leaveView(oldView, safeToRunHooks);
- }
- }
- function executeTemplate(lView, templateFn, rf, context) {
- ɵɵnamespaceHTML();
- try {
- if (rf & 2 /* Update */) {
- // When we're updating, have an inherent ɵɵselect(0) so we don't have to generate that
- // instruction for most update blocks
- selectInternal(lView, 0);
- }
- templateFn(rf, context);
- }
- finally {
- }
- }
- /**
- * This function returns the default configuration of rendering flags depending on when the
- * template is in creation mode or update mode. Update block and create block are
- * always run separately.
- */
- function getRenderFlags(view) {
- return isCreationMode(view) ? 1 /* Create */ : 2 /* Update */;
- }
- /**
- * Gets TView from a template function or creates a new TView
- * if it doesn't already exist.
- *
- * @param def ComponentDef
- * @returns TView
- */
- function getOrCreateTView(def) {
- return def.tView || (def.tView = createTView(-1, def.template, def.consts, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, def.schemas));
- }
- /**
- * Creates a TView instance
- *
- * @param viewIndex The viewBlockId for inline views, or -1 if it's a component/dynamic
- * @param templateFn Template function
- * @param consts The number of nodes, local refs, and pipes in this template
- * @param directives Registry of directives for this view
- * @param pipes Registry of pipes for this view
- * @param viewQuery View queries for this view
- * @param schemas Schemas for this view
- */
- function createTView(viewIndex, templateFn, consts, vars, directives, pipes, viewQuery, schemas) {
- ngDevMode && ngDevMode.tView++;
- var bindingStartIndex = HEADER_OFFSET + consts;
- // This length does not yet contain host bindings from child directives because at this point,
- // we don't know which directives are active on this template. As soon as a directive is matched
- // that has a host binding, we will update the blueprint with that def's hostVars count.
- var initialViewLength = bindingStartIndex + vars;
- var blueprint = createViewBlueprint(bindingStartIndex, initialViewLength);
- return blueprint[TVIEW] = ngDevMode ?
- new TViewConstructor(viewIndex, // id: number,
- blueprint, // blueprint: LView,
- templateFn, // template: ComponentTemplate<{}>|null,
- viewQuery, // viewQuery: ViewQueriesFunction<{}>|null,
- null, // node: TViewNode|TElementNode|null,
- cloneToTViewData(blueprint).fill(null, bindingStartIndex), // data: TData,
- bindingStartIndex, // bindingStartIndex: number,
- initialViewLength, // viewQueryStartIndex: number,
- initialViewLength, // expandoStartIndex: number,
- null, // expandoInstructions: ExpandoInstructions|null,
- true, // firstTemplatePass: boolean,
- false, // staticViewQueries: boolean,
- false, // staticContentQueries: boolean,
- null, // preOrderHooks: HookData|null,
- null, // preOrderCheckHooks: HookData|null,
- null, // contentHooks: HookData|null,
- null, // contentCheckHooks: HookData|null,
- null, // viewHooks: HookData|null,
- null, // viewCheckHooks: HookData|null,
- null, // destroyHooks: HookData|null,
- null, // cleanup: any[]|null,
- null, // contentQueries: number[]|null,
- null, // components: number[]|null,
- typeof directives === 'function' ?
- directives() :
- directives, // directiveRegistry: DirectiveDefList|null,
- typeof pipes === 'function' ? pipes() : pipes, // pipeRegistry: PipeDefList|null,
- null, // firstChild: TNode|null,
- schemas) :
- {
- id: viewIndex,
- blueprint: blueprint,
- template: templateFn,
- viewQuery: viewQuery,
- node: null,
- data: blueprint.slice().fill(null, bindingStartIndex),
- bindingStartIndex: bindingStartIndex,
- viewQueryStartIndex: initialViewLength,
- expandoStartIndex: initialViewLength,
- expandoInstructions: null,
- firstTemplatePass: true,
- staticViewQueries: false,
- staticContentQueries: false,
- preOrderHooks: null,
- preOrderCheckHooks: null,
- contentHooks: null,
- contentCheckHooks: null,
- viewHooks: null,
- viewCheckHooks: null,
- destroyHooks: null,
- cleanup: null,
- contentQueries: null,
- components: null,
- directiveRegistry: typeof directives === 'function' ? directives() : directives,
- pipeRegistry: typeof pipes === 'function' ? pipes() : pipes,
- firstChild: null,
- schemas: schemas,
- };
- }
- function createViewBlueprint(bindingStartIndex, initialViewLength) {
- var blueprint = new (ngDevMode ? LViewBlueprint : Array)(initialViewLength)
- .fill(null, 0, bindingStartIndex)
- .fill(NO_CHANGE, bindingStartIndex);
- blueprint[BINDING_INDEX] = bindingStartIndex;
- return blueprint;
- }
- function createError(text, token) {
- return new Error("Renderer: " + text + " [" + stringifyForError(token) + "]");
- }
- /**
- * Locates the host native element, used for bootstrapping existing nodes into rendering pipeline.
- *
- * @param elementOrSelector Render element or CSS selector to locate the element.
- */
- function locateHostElement(factory, elementOrSelector) {
- var defaultRenderer = factory.createRenderer(null, null);
- var rNode = typeof elementOrSelector === 'string' ?
- (isProceduralRenderer(defaultRenderer) ?
- defaultRenderer.selectRootElement(elementOrSelector) :
- defaultRenderer.querySelector(elementOrSelector)) :
- elementOrSelector;
- if (ngDevMode && !rNode) {
- if (typeof elementOrSelector === 'string') {
- throw createError('Host node with selector not found:', elementOrSelector);
- }
- else {
- throw createError('Host node is required:', elementOrSelector);
- }
- }
- return rNode;
- }
- /**
- * Saves the cleanup function itself in LView.cleanupInstances.
- *
- * This is necessary for functions that are wrapped with their contexts, like in renderer2
- * listeners.
- *
- * On the first template pass, the index of the cleanup function is saved in TView.
- */
- function storeCleanupFn(view, cleanupFn) {
- getCleanup(view).push(cleanupFn);
- if (view[TVIEW].firstTemplatePass) {
- getTViewCleanup(view).push(view[CLEANUP].length - 1, null);
- }
- }
- /**
- * Constructs a TNode object from the arguments.
- *
- * @param type The type of the node
- * @param adjustedIndex The index of the TNode in TView.data, adjusted for HEADER_OFFSET
- * @param tagName The tag name of the node
- * @param attrs The attributes defined on this node
- * @param tViews Any TViews attached to this node
- * @returns the TNode object
- */
- function createTNode(tParent, type, adjustedIndex, tagName, attrs) {
- ngDevMode && ngDevMode.tNode++;
- return {
- type: type,
- index: adjustedIndex,
- injectorIndex: tParent ? tParent.injectorIndex : -1,
- directiveStart: -1,
- directiveEnd: -1,
- propertyMetadataStartIndex: -1,
- propertyMetadataEndIndex: -1,
- flags: 0,
- providerIndexes: 0,
- tagName: tagName,
- attrs: attrs,
- localNames: null,
- initialInputs: undefined,
- inputs: undefined,
- outputs: undefined,
- tViews: null,
- next: null,
- projectionNext: null,
- child: null,
- parent: tParent,
- stylingTemplate: null,
- projection: null,
- onElementCreationFns: null,
- // TODO (matsko): rename this to `styles` once the old styling impl is gone
- newStyles: null,
- // TODO (matsko): rename this to `classes` once the old styling impl is gone
- newClasses: null,
- };
- }
- /**
- * Instantiate a root component.
- */
- function instantiateRootComponent(tView, viewData, def) {
- var rootTNode = getPreviousOrParentTNode();
- if (tView.firstTemplatePass) {
- if (def.providersResolver)
- def.providersResolver(def);
- generateExpandoInstructionBlock(tView, rootTNode, 1);
- baseResolveDirective(tView, viewData, def, def.factory);
- }
- var directive = getNodeInjectable(tView.data, viewData, viewData.length - 1, rootTNode);
- postProcessBaseDirective(viewData, rootTNode, directive);
- return directive;
- }
- function invokeHostBindingsInCreationMode(def, expando, directive, tNode, firstTemplatePass) {
- var previousExpandoLength = expando.length;
- var elementIndex = tNode.index - HEADER_OFFSET;
- def.hostBindings(1 /* Create */, directive, elementIndex);
- // `hostBindings` function may or may not contain `allocHostVars` call
- // (e.g. it may not if it only contains host listeners), so we need to check whether
- // `expandoInstructions` has changed and if not - we still push `hostBindings` to
- // expando block, to make sure we execute it for DI cycle
- if (previousExpandoLength === expando.length && firstTemplatePass) {
- expando.push(def.hostBindings);
- }
- }
- /**
- * Generates a new block in TView.expandoInstructions for this node.
- *
- * Each expando block starts with the element index (turned negative so we can distinguish
- * it from the hostVar count) and the directive count. See more in VIEW_DATA.md.
- */
- function generateExpandoInstructionBlock(tView, tNode, directiveCount) {
- ngDevMode && assertEqual(tView.firstTemplatePass, true, 'Expando block should only be generated on first template pass.');
- var elementIndex = -(tNode.index - HEADER_OFFSET);
- var providerStartIndex = tNode.providerIndexes & 65535 /* ProvidersStartIndexMask */;
- var providerCount = tView.data.length - providerStartIndex;
- (tView.expandoInstructions || (tView.expandoInstructions = [])).push(elementIndex, providerCount, directiveCount);
- }
- /**
- * A lighter version of postProcessDirective() that is used for the root component.
- */
- function postProcessBaseDirective(lView, previousOrParentTNode, directive) {
- var native = getNativeByTNode(previousOrParentTNode, lView);
- ngDevMode && assertEqual(lView[BINDING_INDEX], lView[TVIEW].bindingStartIndex, 'directives should be created before any bindings');
- ngDevMode && assertPreviousIsParent(getIsParent());
- attachPatchData(directive, lView);
- if (native) {
- attachPatchData(native, lView);
- }
- }
- /** Stores index of component's host element so it will be queued for view refresh during CD. */
- function queueComponentIndexForCheck(previousOrParentTNode) {
- var tView = getLView()[TVIEW];
- ngDevMode &&
- assertEqual(tView.firstTemplatePass, true, 'Should only be called in first template pass.');
- (tView.components || (tView.components = ngDevMode ? new TViewComponents() : [])).push(previousOrParentTNode.index);
- }
- /**
- * Initializes the flags on the current node, setting all indices to the initial index,
- * the directive count to 0, and adding the isComponent flag.
- * @param index the initial index
- */
- function initNodeFlags(tNode, index, numberOfDirectives) {
- var flags = tNode.flags;
- ngDevMode && assertEqual(flags === 0 || flags === 1 /* isComponent */, true, 'expected node flags to not be initialized');
- ngDevMode && assertNotEqual(numberOfDirectives, tNode.directiveEnd - tNode.directiveStart, 'Reached the max number of directives');
- // When the first directive is created on a node, save the index
- tNode.flags = flags & 1 /* isComponent */;
- tNode.directiveStart = index;
- tNode.directiveEnd = index + numberOfDirectives;
- tNode.providerIndexes = index;
- }
- function baseResolveDirective(tView, viewData, def, directiveFactory) {
- tView.data.push(def);
- var nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), null);
- tView.blueprint.push(nodeInjectorFactory);
- viewData.push(nodeInjectorFactory);
- }
- //////////////////////////
- //// ViewContainer & View
- //////////////////////////
- // Not sure why I need to do `any` here but TS complains later.
- var LContainerArray = ngDevMode && createNamedArrayType('LContainer');
- /**
- * Goes over dynamic embedded views (ones created through ViewContainerRef APIs) and refreshes
- * them
- * by executing an associated template function.
- */
- function refreshDynamicEmbeddedViews(lView) {
- for (var current = lView[CHILD_HEAD]; current !== null; current = current[NEXT]) {
- // Note: current can be an LView or an LContainer instance, but here we are only interested
- // in LContainer. We can tell it's an LContainer because its length is less than the LView
- // header.
- if (current[ACTIVE_INDEX] === -1 && isLContainer(current)) {
- for (var i = CONTAINER_HEADER_OFFSET; i < current.length; i++) {
- var dynamicViewData = current[i];
- // The directives and pipes are not needed here as an existing view is only being
- // refreshed.
- ngDevMode && assertDefined(dynamicViewData[TVIEW], 'TView must be allocated');
- renderEmbeddedTemplate(dynamicViewData, dynamicViewData[TVIEW], dynamicViewData[CONTEXT]);
- }
- }
- }
- }
- /////////////
- /**
- * Refreshes components by entering the component view and processing its bindings, queries, etc.
- *
- * @param adjustedElementIndex Element index in LView[] (adjusted for HEADER_OFFSET)
- */
- function componentRefresh(adjustedElementIndex) {
- var lView = getLView();
- ngDevMode && assertDataInRange(lView, adjustedElementIndex);
- var hostView = getComponentViewByIndex(adjustedElementIndex, lView);
- ngDevMode && assertNodeType(lView[TVIEW].data[adjustedElementIndex], 3 /* Element */);
- // Only components in creation mode, attached CheckAlways
- // components or attached, dirty OnPush components should be checked
- if ((viewAttachedToChangeDetector(hostView) || isCreationMode(lView)) &&
- hostView[FLAGS] & (16 /* CheckAlways */ | 64 /* Dirty */)) {
- syncViewWithBlueprint(hostView);
- checkView(hostView, hostView[CONTEXT]);
- }
- }
- /**
- * Syncs an LView instance with its blueprint if they have gotten out of sync.
- *
- * Typically, blueprints and their view instances should always be in sync, so the loop here
- * will be skipped. However, consider this case of two components side-by-side:
- *
- * App template:
- * ```
- * <comp></comp>
- * <comp></comp>
- * ```
- *
- * The following will happen:
- * 1. App template begins processing.
- * 2. First <comp> is matched as a component and its LView is created.
- * 3. Second <comp> is matched as a component and its LView is created.
- * 4. App template completes processing, so it's time to check child templates.
- * 5. First <comp> template is checked. It has a directive, so its def is pushed to blueprint.
- * 6. Second <comp> template is checked. Its blueprint has been updated by the first
- * <comp> template, but its LView was created before this update, so it is out of sync.
- *
- * Note that embedded views inside ngFor loops will never be out of sync because these views
- * are processed as soon as they are created.
- *
- * @param componentView The view to sync
- */
- function syncViewWithBlueprint(componentView) {
- var componentTView = componentView[TVIEW];
- for (var i = componentView.length; i < componentTView.blueprint.length; i++) {
- componentView[i] = componentTView.blueprint[i];
- }
- }
- /**
- * Adds LView or LContainer to the end of the current view tree.
- *
- * This structure will be used to traverse through nested views to remove listeners
- * and call onDestroy callbacks.
- *
- * @param lView The view where LView or LContainer should be added
- * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header
- * @param lViewOrLContainer The LView or LContainer to add to the view tree
- * @returns The state passed in
- */
- function addToViewTree(lView, lViewOrLContainer) {
- // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer
- // to
- // the end of the queue, which means if the developer retrieves the LContainers from RNodes out
- // of
- // order, the change detection will run out of order, as the act of retrieving the the
- // LContainer
- // from the RNode is what adds it to the queue.
- if (lView[CHILD_HEAD]) {
- lView[CHILD_TAIL][NEXT] = lViewOrLContainer;
- }
- else {
- lView[CHILD_HEAD] = lViewOrLContainer;
- }
- lView[CHILD_TAIL] = lViewOrLContainer;
- return lViewOrLContainer;
- }
- ///////////////////////////////
- //// Change detection
- ///////////////////////////////
- /**
- * Marks current view and all ancestors dirty.
- *
- * Returns the root view because it is found as a byproduct of marking the view tree
- * dirty, and can be used by methods that consume markViewDirty() to easily schedule
- * change detection. Otherwise, such methods would need to traverse up the view tree
- * an additional time to get the root view and schedule a tick on it.
- *
- * @param lView The starting LView to mark dirty
- * @returns the root LView
- */
- function markViewDirty(lView) {
- while (lView) {
- lView[FLAGS] |= 64 /* Dirty */;
- var parent_1 = getLViewParent(lView);
- // Stop traversing up as soon as you find a root view that wasn't attached to any container
- if (isRootView(lView) && !parent_1) {
- return lView;
- }
- // continue otherwise
- lView = parent_1;
- }
- return null;
- }
- function tickRootContext(rootContext) {
- for (var i = 0; i < rootContext.components.length; i++) {
- var rootComponent = rootContext.components[i];
- renderComponentOrTemplate(readPatchedLView(rootComponent), rootComponent);
- }
- }
- function detectChangesInternal(view, context) {
- var rendererFactory = view[RENDERER_FACTORY];
- if (rendererFactory.begin)
- rendererFactory.begin();
- try {
- if (isCreationMode(view)) {
- checkView(view, context); // creation mode pass
- }
- checkView(view, context); // update mode pass
- }
- catch (error) {
- handleError(view, error);
- throw error;
- }
- finally {
- if (rendererFactory.end)
- rendererFactory.end();
- }
- }
- /**
- * Synchronously perform change detection on a root view and its components.
- *
- * @param lView The view which the change detection should be performed on.
- */
- function detectChangesInRootView(lView) {
- tickRootContext(lView[CONTEXT]);
- }
- function checkNoChangesInternal(view, context) {
- setCheckNoChangesMode(true);
- try {
- detectChangesInternal(view, context);
- }
- finally {
- setCheckNoChangesMode(false);
- }
- }
- /**
- * Checks the change detector on a root view and its components, and throws if any changes are
- * detected.
- *
- * This is used in development mode to verify that running change detection doesn't
- * introduce other changes.
- *
- * @param lView The view which the change detection should be checked on.
- */
- function checkNoChangesInRootView(lView) {
- setCheckNoChangesMode(true);
- try {
- detectChangesInRootView(lView);
- }
- finally {
- setCheckNoChangesMode(false);
- }
- }
- /** Checks the view of the component provided. Does not gate on dirty checks or execute doCheck.
- */
- function checkView(hostView, component) {
- var hostTView = hostView[TVIEW];
- var oldView = enterView(hostView, hostView[T_HOST]);
- var templateFn = hostTView.template;
- var creationMode = isCreationMode(hostView);
- // Will become true if the `try` block executes with no errors.
- var safeToRunHooks = false;
- try {
- resetPreOrderHookFlags(hostView);
- creationMode && executeViewQueryFn(1 /* Create */, hostTView, component);
- executeTemplate(hostView, templateFn, getRenderFlags(hostView), component);
- refreshDescendantViews(hostView);
- // Only check view queries again in creation mode if there are static view queries
- if (!creationMode || hostTView.staticViewQueries) {
- executeViewQueryFn(2 /* Update */, hostTView, component);
- }
- safeToRunHooks = true;
- }
- finally {
- leaveView(oldView, safeToRunHooks);
- }
- }
- function executeViewQueryFn(flags, tView, component) {
- var viewQuery = tView.viewQuery;
- if (viewQuery) {
- setCurrentQueryIndex(tView.viewQueryStartIndex);
- viewQuery(flags, component);
- }
- }
- var CLEAN_PROMISE = _CLEAN_PROMISE;
- function getCleanup(view) {
- // top level variables should not be exported for performance reasons (PERF_NOTES.md)
- return view[CLEANUP] || (view[CLEANUP] = ngDevMode ? new LCleanup() : []);
- }
- function getTViewCleanup(view) {
- return view[TVIEW].cleanup || (view[TVIEW].cleanup = ngDevMode ? new TCleanup() : []);
- }
- /** Handles an error thrown in an LView. */
- function handleError(lView, error) {
- var injector = lView[INJECTOR$1];
- var errorHandler = injector ? injector.get(ErrorHandler, null) : null;
- errorHandler && errorHandler.handleError(error);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function applyOnCreateInstructions(tNode) {
- // there may be some instructions that need to run in a specific
- // order because the CREATE block in a directive runs before the
- // CREATE block in a template. To work around this instructions
- // can get access to the function array below and defer any code
- // to run after the element is created.
- var fns;
- if (fns = tNode.onElementCreationFns) {
- for (var i = 0; i < fns.length; i++) {
- fns[i]();
- }
- tNode.onElementCreationFns = null;
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _symbolIterator = null;
- function getSymbolIterator() {
- if (!_symbolIterator) {
- var Symbol_1 = _global$1['Symbol'];
- if (Symbol_1 && Symbol_1.iterator) {
- _symbolIterator = Symbol_1.iterator;
- }
- else {
- // es6-shim specific logic
- var keys = Object.getOwnPropertyNames(Map.prototype);
- for (var i = 0; i < keys.length; ++i) {
- var key = keys[i];
- if (key !== 'entries' && key !== 'size' &&
- Map.prototype[key] === Map.prototype['entries']) {
- _symbolIterator = key;
- }
- }
- }
- }
- return _symbolIterator;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // JS has NaN !== NaN
- function looseIdentical(a, b) {
- return a === b || typeof a === 'number' && typeof b === 'number' && isNaN(a) && isNaN(b);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function devModeEqual(a, b) {
- var isListLikeIterableA = isListLikeIterable(a);
- var isListLikeIterableB = isListLikeIterable(b);
- if (isListLikeIterableA && isListLikeIterableB) {
- return areIterablesEqual(a, b, devModeEqual);
- }
- else {
- var isAObject = a && (typeof a === 'object' || typeof a === 'function');
- var isBObject = b && (typeof b === 'object' || typeof b === 'function');
- if (!isListLikeIterableA && isAObject && !isListLikeIterableB && isBObject) {
- return true;
- }
- else {
- return looseIdentical(a, b);
- }
- }
- }
- /**
- * Indicates that the result of a {@link Pipe} transformation has changed even though the
- * reference has not changed.
- *
- * Wrapped values are unwrapped automatically during the change detection, and the unwrapped value
- * is stored.
- *
- * Example:
- *
- * ```
- * if (this._latestValue === this._latestReturnedValue) {
- * return this._latestReturnedValue;
- * } else {
- * this._latestReturnedValue = this._latestValue;
- * return WrappedValue.wrap(this._latestValue); // this will force update
- * }
- * ```
- *
- * @publicApi
- */
- var WrappedValue = /** @class */ (function () {
- function WrappedValue(value) {
- this.wrapped = value;
- }
- /** Creates a wrapped value. */
- WrappedValue.wrap = function (value) { return new WrappedValue(value); };
- /**
- * Returns the underlying value of a wrapped value.
- * Returns the given `value` when it is not wrapped.
- **/
- WrappedValue.unwrap = function (value) { return WrappedValue.isWrapped(value) ? value.wrapped : value; };
- /** Returns true if `value` is a wrapped value. */
- WrappedValue.isWrapped = function (value) { return value instanceof WrappedValue; };
- return WrappedValue;
- }());
- function isListLikeIterable(obj) {
- if (!isJsObject(obj))
- return false;
- return Array.isArray(obj) ||
- (!(obj instanceof Map) && // JS Map are iterables but return entries as [k, v]
- getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop
- }
- function areIterablesEqual(a, b, comparator) {
- var iterator1 = a[getSymbolIterator()]();
- var iterator2 = b[getSymbolIterator()]();
- while (true) {
- var item1 = iterator1.next();
- var item2 = iterator2.next();
- if (item1.done && item2.done)
- return true;
- if (item1.done || item2.done)
- return false;
- if (!comparator(item1.value, item2.value))
- return false;
- }
- }
- function iterateListLike(obj, fn) {
- if (Array.isArray(obj)) {
- for (var i = 0; i < obj.length; i++) {
- fn(obj[i]);
- }
- }
- else {
- var iterator = obj[getSymbolIterator()]();
- var item = void 0;
- while (!((item = iterator.next()).done)) {
- fn(item.value);
- }
- }
- }
- function isJsObject(o) {
- return o !== null && (typeof o === 'function' || typeof o === 'object');
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function getLContainer(tNode, embeddedView) {
- ngDevMode && assertLView(embeddedView);
- var container = embeddedView[PARENT];
- if (tNode.index === -1) {
- // This is a dynamically created view inside a dynamic container.
- // The parent isn't an LContainer if the embedded view hasn't been attached yet.
- return isLContainer(container) ? container : null;
- }
- else {
- ngDevMode && assertLContainer(container);
- // This is a inline view node (e.g. embeddedViewStart)
- return container;
- }
- }
- /**
- * NOTE: for performance reasons, the possible actions are inlined within the function instead of
- * being passed as an argument.
- */
- function executeActionOnElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode) {
- ngDevMode && assertDefined(lNodeToHandle, '\'lNodeToHandle\' is undefined');
- var lContainer;
- var isComponent = false;
- // We are expecting an RNode, but in the case of a component or LContainer the `RNode` is wrapped
- // in an array which needs to be unwrapped. We need to know if it is a component and if
- // it has LContainer so that we can process all of those cases appropriately.
- if (isLContainer(lNodeToHandle)) {
- lContainer = lNodeToHandle;
- }
- else if (isLView(lNodeToHandle)) {
- isComponent = true;
- ngDevMode && assertDefined(lNodeToHandle[HOST], 'HOST must be defined for a component LView');
- lNodeToHandle = lNodeToHandle[HOST];
- }
- var rNode = unwrapRNode(lNodeToHandle);
- ngDevMode && assertDomNode(rNode);
- if (action === 0 /* Insert */) {
- nativeInsertBefore(renderer, parent, rNode, beforeNode || null);
- }
- else if (action === 1 /* Detach */) {
- nativeRemoveNode(renderer, rNode, isComponent);
- }
- else if (action === 2 /* Destroy */) {
- ngDevMode && ngDevMode.rendererDestroyNode++;
- renderer.destroyNode(rNode);
- }
- if (lContainer != null) {
- executeActionOnContainer(renderer, action, lContainer, parent, beforeNode);
- }
- }
- /**
- * Detach a `LView` from the DOM by detaching its nodes.
- *
- * @param lView the `LView` to be detached.
- */
- function renderDetachView(lView) {
- executeActionOnView(lView[RENDERER], 1 /* Detach */, lView, null, null);
- }
- /**
- * Traverses down and up the tree of views and containers to remove listeners and
- * call onDestroy callbacks.
- *
- * Notes:
- * - Because it's used for onDestroy calls, it needs to be bottom-up.
- * - Must process containers instead of their views to avoid splicing
- * when views are destroyed and re-added.
- * - Using a while loop because it's faster than recursion
- * - Destroy only called on movement to sibling or movement to parent (laterally or up)
- *
- * @param rootView The view to destroy
- */
- function destroyViewTree(rootView) {
- // If the view has no children, we can clean it up and return early.
- var lViewOrLContainer = rootView[CHILD_HEAD];
- if (!lViewOrLContainer) {
- return cleanUpView(rootView);
- }
- while (lViewOrLContainer) {
- var next = null;
- if (isLView(lViewOrLContainer)) {
- // If LView, traverse down to child.
- next = lViewOrLContainer[CHILD_HEAD];
- }
- else {
- ngDevMode && assertLContainer(lViewOrLContainer);
- // If container, traverse down to its first LView.
- var firstView = lViewOrLContainer[CONTAINER_HEADER_OFFSET];
- if (firstView)
- next = firstView;
- }
- if (!next) {
- // Only clean up view when moving to the side or up, as destroy hooks
- // should be called in order from the bottom up.
- while (lViewOrLContainer && !lViewOrLContainer[NEXT] && lViewOrLContainer !== rootView) {
- cleanUpView(lViewOrLContainer);
- lViewOrLContainer = getParentState(lViewOrLContainer, rootView);
- }
- cleanUpView(lViewOrLContainer || rootView);
- next = lViewOrLContainer && lViewOrLContainer[NEXT];
- }
- lViewOrLContainer = next;
- }
- }
- /**
- * A standalone function which destroys an LView,
- * conducting cleanup (e.g. removing listeners, calling onDestroys).
- *
- * @param lView The view to be destroyed.
- */
- function destroyLView(lView) {
- if (!(lView[FLAGS] & 256 /* Destroyed */)) {
- var renderer = lView[RENDERER];
- if (isProceduralRenderer(renderer) && renderer.destroyNode) {
- executeActionOnView(renderer, 2 /* Destroy */, lView, null, null);
- }
- destroyViewTree(lView);
- }
- }
- /**
- * Determines which LViewOrLContainer to jump to when traversing back up the
- * tree in destroyViewTree.
- *
- * Normally, the view's parent LView should be checked, but in the case of
- * embedded views, the container (which is the view node's parent, but not the
- * LView's parent) needs to be checked for a possible next property.
- *
- * @param lViewOrLContainer The LViewOrLContainer for which we need a parent state
- * @param rootView The rootView, so we don't propagate too far up the view tree
- * @returns The correct parent LViewOrLContainer
- */
- function getParentState(lViewOrLContainer, rootView) {
- var tNode;
- if (isLView(lViewOrLContainer) && (tNode = lViewOrLContainer[T_HOST]) &&
- tNode.type === 2 /* View */) {
- // if it's an embedded view, the state needs to go up to the container, in case the
- // container has a next
- return getLContainer(tNode, lViewOrLContainer);
- }
- else {
- // otherwise, use parent view for containers or component views
- return lViewOrLContainer[PARENT] === rootView ? null : lViewOrLContainer[PARENT];
- }
- }
- /**
- * Calls onDestroys hooks for all directives and pipes in a given view and then removes all
- * listeners. Listeners are removed as the last step so events delivered in the onDestroys hooks
- * can be propagated to @Output listeners.
- *
- * @param view The LView to clean up
- */
- function cleanUpView(view) {
- if (isLView(view) && !(view[FLAGS] & 256 /* Destroyed */)) {
- // Usually the Attached flag is removed when the view is detached from its parent, however
- // if it's a root view, the flag won't be unset hence why we're also removing on destroy.
- view[FLAGS] &= ~128 /* Attached */;
- // Mark the LView as destroyed *before* executing the onDestroy hooks. An onDestroy hook
- // runs arbitrary user code, which could include its own `viewRef.destroy()` (or similar). If
- // We don't flag the view as destroyed before the hooks, this could lead to an infinite loop.
- // This also aligns with the ViewEngine behavior. It also means that the onDestroy hook is
- // really more of an "afterDestroy" hook if you think about it.
- view[FLAGS] |= 256 /* Destroyed */;
- executeOnDestroys(view);
- removeListeners(view);
- var hostTNode = view[T_HOST];
- // For component views only, the local renderer is destroyed as clean up time.
- if (hostTNode && hostTNode.type === 3 /* Element */ && isProceduralRenderer(view[RENDERER])) {
- ngDevMode && ngDevMode.rendererDestroy++;
- view[RENDERER].destroy();
- }
- // For embedded views still attached to a container: remove query result from this view.
- if (viewAttachedToContainer(view) && view[QUERIES]) {
- view[QUERIES].removeView();
- }
- }
- }
- /** Removes listeners and unsubscribes from output subscriptions */
- function removeListeners(lView) {
- var tCleanup = lView[TVIEW].cleanup;
- if (tCleanup !== null) {
- var lCleanup = lView[CLEANUP];
- for (var i = 0; i < tCleanup.length - 1; i += 2) {
- if (typeof tCleanup[i] === 'string') {
- // This is a native DOM listener
- var idxOrTargetGetter = tCleanup[i + 1];
- var target = typeof idxOrTargetGetter === 'function' ?
- idxOrTargetGetter(lView) :
- unwrapRNode(lView[idxOrTargetGetter]);
- var listener = lCleanup[tCleanup[i + 2]];
- var useCaptureOrSubIdx = tCleanup[i + 3];
- if (typeof useCaptureOrSubIdx === 'boolean') {
- // native DOM listener registered with Renderer3
- target.removeEventListener(tCleanup[i], listener, useCaptureOrSubIdx);
- }
- else {
- if (useCaptureOrSubIdx >= 0) {
- // unregister
- lCleanup[useCaptureOrSubIdx]();
- }
- else {
- // Subscription
- lCleanup[-useCaptureOrSubIdx].unsubscribe();
- }
- }
- i += 2;
- }
- else {
- // This is a cleanup function that is grouped with the index of its context
- var context = lCleanup[tCleanup[i + 1]];
- tCleanup[i].call(context);
- }
- }
- lView[CLEANUP] = null;
- }
- }
- /** Calls onDestroy hooks for this view */
- function executeOnDestroys(view) {
- var tView = view[TVIEW];
- var destroyHooks;
- if (tView != null && (destroyHooks = tView.destroyHooks) != null) {
- for (var i = 0; i < destroyHooks.length; i += 2) {
- var context = view[destroyHooks[i]];
- // Only call the destroy hook if the context has been requested.
- if (!(context instanceof NodeInjectorFactory)) {
- destroyHooks[i + 1].call(context);
- }
- }
- }
- }
- /**
- * Inserts a native node before another native node for a given parent using {@link Renderer3}.
- * This is a utility function that can be used when native nodes were determined - it abstracts an
- * actual renderer being used.
- */
- function nativeInsertBefore(renderer, parent, child, beforeNode) {
- ngDevMode && ngDevMode.rendererInsertBefore++;
- if (isProceduralRenderer(renderer)) {
- renderer.insertBefore(parent, child, beforeNode);
- }
- else {
- parent.insertBefore(child, beforeNode, true);
- }
- }
- /** Removes a node from the DOM given its native parent. */
- function nativeRemoveChild(renderer, parent, child, isHostElement) {
- if (isProceduralRenderer(renderer)) {
- renderer.removeChild(parent, child, isHostElement);
- }
- else {
- parent.removeChild(child);
- }
- }
- /**
- * Returns a native parent of a given native node.
- */
- function nativeParentNode(renderer, node) {
- return (isProceduralRenderer(renderer) ? renderer.parentNode(node) : node.parentNode);
- }
- /**
- * Removes a native node itself using a given renderer. To remove the node we are looking up its
- * parent from the native tree as not all platforms / browsers support the equivalent of
- * node.remove().
- *
- * @param renderer A renderer to be used
- * @param rNode The native node that should be removed
- * @param isHostElement A flag indicating if a node to be removed is a host of a component.
- */
- function nativeRemoveNode(renderer, rNode, isHostElement) {
- var nativeParent = nativeParentNode(renderer, rNode);
- if (nativeParent) {
- nativeRemoveChild(renderer, nativeParent, rNode, isHostElement);
- }
- }
- /**
- * `executeActionOnView` performs an operation on the view as specified in `action` (insert, detach,
- * destroy)
- *
- * Inserting a view without projection or containers at top level is simple. Just iterate over the
- * root nodes of the View, and for each node perform the `action`.
- *
- * Things get more complicated with containers and projections. That is because coming across:
- * - Container: implies that we have to insert/remove/destroy the views of that container as well
- * which in turn can have their own Containers at the View roots.
- * - Projection: implies that we have to insert/remove/destroy the nodes of the projection. The
- * complication is that the nodes we are projecting can themselves have Containers
- * or other Projections.
- *
- * As you can see this is a very recursive problem. While the recursive implementation is not the
- * most efficient one, trying to unroll the nodes non-recursively results in very complex code that
- * is very hard (to maintain). We are sacrificing a bit of performance for readability using a
- * recursive implementation.
- *
- * @param renderer Renderer to use
- * @param action action to perform (insert, detach, destroy)
- * @param lView The LView which needs to be inserted, detached, destroyed.
- * @param renderParent parent DOM element for insertion/removal.
- * @param beforeNode Before which node the insertions should happen.
- */
- function executeActionOnView(renderer, action, lView, renderParent, beforeNode) {
- var tView = lView[TVIEW];
- ngDevMode && assertNodeType(tView.node, 2 /* View */);
- var viewRootTNode = tView.node.child;
- while (viewRootTNode !== null) {
- executeActionOnNode(renderer, action, lView, viewRootTNode, renderParent, beforeNode);
- viewRootTNode = viewRootTNode.next;
- }
- }
- /**
- * `executeActionOnProjection` performs an operation on the projection specified by `action`
- * (insert, detach, destroy).
- *
- * Inserting a projection requires us to locate the projected nodes from the parent component. The
- * complication is that those nodes themselves could be re-projected from their parent component.
- *
- * @param renderer Renderer to use
- * @param action action to perform (insert, detach, destroy)
- * @param lView The LView which needs to be inserted, detached, destroyed.
- * @param renderParent parent DOM element for insertion/removal.
- * @param beforeNode Before which node the insertions should happen.
- */
- function executeActionOnProjection(renderer, action, lView, tProjectionNode, renderParent, beforeNode) {
- var componentLView = findComponentView(lView);
- var componentNode = componentLView[T_HOST];
- var nodeToProject = componentNode.projection[tProjectionNode.projection];
- if (Array.isArray(nodeToProject)) {
- for (var i = 0; i < nodeToProject.length; i++) {
- var rNode = nodeToProject[i];
- ngDevMode && assertDomNode(rNode);
- executeActionOnElementOrContainer(action, renderer, renderParent, rNode, beforeNode);
- }
- }
- else {
- var projectionTNode = nodeToProject;
- var projectedComponentLView = componentLView[PARENT];
- while (projectionTNode !== null) {
- executeActionOnNode(renderer, action, projectedComponentLView, projectionTNode, renderParent, beforeNode);
- projectionTNode = projectionTNode.projectionNext;
- }
- }
- }
- /**
- * `executeActionOnContainer` performs an operation on the container and its views as specified by
- * `action` (insert, detach, destroy)
- *
- * Inserting a Container is complicated by the fact that the container may have Views which
- * themselves have containers or projections.
- *
- * @param renderer Renderer to use
- * @param action action to perform (insert, detach, destroy)
- * @param lContainer The LContainer which needs to be inserted, detached, destroyed.
- * @param renderParent parent DOM element for insertion/removal.
- * @param beforeNode Before which node the insertions should happen.
- */
- function executeActionOnContainer(renderer, action, lContainer, renderParent, beforeNode) {
- ngDevMode && assertLContainer(lContainer);
- var anchor = lContainer[NATIVE]; // LContainer has its own before node.
- var native = unwrapRNode(lContainer);
- // An LContainer can be created dynamically on any node by injecting ViewContainerRef.
- // Asking for a ViewContainerRef on an element will result in a creation of a separate anchor node
- // (comment in the DOM) that will be different from the LContainer's host node. In this particular
- // case we need to execute action on 2 nodes:
- // - container's host node (this is done in the executeNodeAction)
- // - container's host node (this is done here)
- if (anchor !== native) {
- executeActionOnElementOrContainer(action, renderer, renderParent, anchor, beforeNode);
- }
- for (var i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
- var lView = lContainer[i];
- executeActionOnView(renderer, action, lView, renderParent, anchor);
- }
- }
- /**
- * `executeActionOnElementContainer` performs an operation on the ng-container node and its child
- * nodes as specified by the `action` (insert, detach, destroy).
- *
- * @param renderer Renderer to use
- * @param action action to perform (insert, detach, destroy)
- * @param lView The LView which needs to be inserted, detached, destroyed.
- * @param tElementContainerNode The TNode associated with the ElementContainer.
- * @param renderParent parent DOM element for insertion/removal.
- * @param beforeNode Before which node the insertions should happen.
- */
- function executeActionOnElementContainer(renderer, action, lView, tElementContainerNode, renderParent, beforeNode) {
- var node = lView[tElementContainerNode.index];
- executeActionOnElementOrContainer(action, renderer, renderParent, node, beforeNode);
- var childTNode = tElementContainerNode.child;
- while (childTNode) {
- executeActionOnNode(renderer, action, lView, childTNode, renderParent, beforeNode);
- childTNode = childTNode.next;
- }
- }
- function executeActionOnNode(renderer, action, lView, tNode, renderParent, beforeNode) {
- var elementContainerRootTNodeType = tNode.type;
- if (elementContainerRootTNodeType === 4 /* ElementContainer */) {
- executeActionOnElementContainer(renderer, action, lView, tNode, renderParent, beforeNode);
- }
- else if (elementContainerRootTNodeType === 1 /* Projection */) {
- executeActionOnProjection(renderer, action, lView, tNode, renderParent, beforeNode);
- }
- else {
- ngDevMode && assertNodeOfPossibleTypes(tNode, 3 /* Element */, 0 /* Container */);
- executeActionOnElementOrContainer(action, renderer, renderParent, lView[tNode.index], beforeNode);
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Determine if the argument is shaped like a Promise
- */
- function isPromise$1(obj) {
- // allow any Promise/A+ compliant thenable.
- // It's up to the caller to ensure that obj.then conforms to the spec
- return !!obj && typeof obj.then === 'function';
- }
- /**
- * Determine if the argument is an Observable
- */
- function isObservable(obj) {
- // TODO: use isObservable once we update pass rxjs 6.1
- // https://github.com/ReactiveX/rxjs/blob/master/CHANGELOG.md#610-2018-05-03
- return !!obj && typeof obj.subscribe === 'function';
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Returns the component instance associated with a given DOM host element.
- * Elements which don't represent components return `null`.
- *
- * @param element Host DOM element from which the component should be retrieved.
- *
- * ```
- * <my-app>
- * #VIEW
- * <div>
- * <child-comp></child-comp>
- * </div>
- * </mp-app>
- *
- * expect(getComponent(<child-comp>) instanceof ChildComponent).toBeTruthy();
- * expect(getComponent(<my-app>) instanceof MyApp).toBeTruthy();
- * ```
- *
- * @publicApi
- */
- function getComponent(element) {
- var context = loadLContextFromNode(element);
- if (context.component === undefined) {
- context.component = getComponentAtNodeIndex(context.nodeIndex, context.lView);
- }
- return context.component;
- }
- /**
- * Returns the component instance associated with a given DOM host element.
- * Elements which don't represent components return `null`.
- *
- * @param element Host DOM element from which the component should be retrieved.
- *
- * ```
- * <my-app>
- * #VIEW
- * <div>
- * <child-comp></child-comp>
- * </div>
- * </mp-app>
- *
- * expect(getComponent(<child-comp>) instanceof ChildComponent).toBeTruthy();
- * expect(getComponent(<my-app>) instanceof MyApp).toBeTruthy();
- * ```
- *
- * @publicApi
- */
- function getContext(element) {
- var context = loadLContextFromNode(element);
- return context.lView[CONTEXT];
- }
- /**
- * Returns the component instance associated with view which owns the DOM element (`null`
- * otherwise).
- *
- * @param element DOM element which is owned by an existing component's view.
- *
- * ```
- * <my-app>
- * #VIEW
- * <div>
- * <child-comp></child-comp>
- * </div>
- * </mp-app>
- *
- * expect(getViewComponent(<child-comp>) instanceof MyApp).toBeTruthy();
- * expect(getViewComponent(<my-app>)).toEqual(null);
- * ```
- *
- * @publicApi
- */
- function getViewComponent(element) {
- var context = loadLContext(element);
- var lView = context.lView;
- var parent;
- ngDevMode && assertLView(lView);
- while (lView[HOST] === null && (parent = getLViewParent(lView))) {
- // As long as lView[HOST] is null we know we are part of sub-template such as `*ngIf`
- lView = parent;
- }
- return lView[FLAGS] & 512 /* IsRoot */ ? null : lView[CONTEXT];
- }
- /**
- * Retrieves an `Injector` associated with the element, component or directive.
- *
- * @param target A DOM element, component or directive instance.
- *
- * @publicApi
- */
- function getInjector(target) {
- var context = loadLContext(target);
- var tNode = context.lView[TVIEW].data[context.nodeIndex];
- return new NodeInjector(tNode, context.lView);
- }
- /**
- * Retrieve a set of injection tokens at a given DOM node.
- *
- * @param element Element for which the injection tokens should be retrieved.
- * @publicApi
- */
- function getInjectionTokens(element) {
- var context = loadLContext(element, false);
- if (!context)
- return [];
- var lView = context.lView;
- var tView = lView[TVIEW];
- var tNode = tView.data[context.nodeIndex];
- var providerTokens = [];
- var startIndex = tNode.providerIndexes & 65535 /* ProvidersStartIndexMask */;
- var endIndex = tNode.directiveEnd;
- for (var i = startIndex; i < endIndex; i++) {
- var value = tView.data[i];
- if (isDirectiveDefHack(value)) {
- // The fact that we sometimes store Type and sometimes DirectiveDef in this location is a
- // design flaw. We should always store same type so that we can be monomorphic. The issue
- // is that for Components/Directives we store the def instead the type. The correct behavior
- // is that we should always be storing injectable type in this location.
- value = value.type;
- }
- providerTokens.push(value);
- }
- return providerTokens;
- }
- function loadLContext(target, throwOnNotFound) {
- if (throwOnNotFound === void 0) { throwOnNotFound = true; }
- var context = getLContext(target);
- if (!context && throwOnNotFound) {
- throw new Error(ngDevMode ? "Unable to find context associated with " + stringifyForError(target) :
- 'Invalid ng target');
- }
- return context;
- }
- /**
- * Retrieve map of local references.
- *
- * The references are retrieved as a map of local reference name to element or directive instance.
- *
- * @param target A DOM element, component or directive instance.
- *
- * @publicApi
- */
- function getLocalRefs(target) {
- var context = loadLContext(target);
- if (context.localRefs === undefined) {
- context.localRefs = discoverLocalRefs(context.lView, context.nodeIndex);
- }
- return context.localRefs || {};
- }
- function loadLContextFromNode(node) {
- if (!(node instanceof Node))
- throw new Error('Expecting instance of DOM Node');
- return loadLContext(node);
- }
- function isBrowserEvents(listener) {
- // Browser events are those which don't have `useCapture` as boolean.
- return typeof listener.useCapture === 'boolean';
- }
- /**
- * Retrieves a list of DOM listeners.
- *
- * ```
- * <my-app>
- * #VIEW
- * <div (click)="doSomething()">
- * </div>
- * </mp-app>
- *
- * expect(getListeners(<div>)).toEqual({
- * name: 'click',
- * element: <div>,
- * callback: () => doSomething(),
- * useCapture: false
- * });
- * ```
- *
- * @param element Element for which the DOM listeners should be retrieved.
- * @publicApi
- */
- function getListeners(element) {
- var lContext = loadLContextFromNode(element);
- var lView = lContext.lView;
- var tView = lView[TVIEW];
- var lCleanup = lView[CLEANUP];
- var tCleanup = tView.cleanup;
- var listeners = [];
- if (tCleanup && lCleanup) {
- for (var i = 0; i < tCleanup.length;) {
- var firstParam = tCleanup[i++];
- var secondParam = tCleanup[i++];
- if (typeof firstParam === 'string') {
- var name_1 = firstParam;
- var listenerElement = unwrapRNode(lView[secondParam]);
- var callback = lCleanup[tCleanup[i++]];
- var useCaptureOrIndx = tCleanup[i++];
- // if useCaptureOrIndx is boolean then report it as is.
- // if useCaptureOrIndx is positive number then it in unsubscribe method
- // if useCaptureOrIndx is negative number then it is a Subscription
- var useCapture = typeof useCaptureOrIndx === 'boolean' ?
- useCaptureOrIndx :
- (useCaptureOrIndx >= 0 ? false : null);
- if (element == listenerElement) {
- listeners.push({ element: element, name: name_1, callback: callback, useCapture: useCapture });
- }
- }
- }
- }
- listeners.sort(sortListeners);
- return listeners;
- }
- function sortListeners(a, b) {
- if (a.name == b.name)
- return 0;
- return a.name < b.name ? -1 : 1;
- }
- /**
- * This function should not exist because it is megamorphic and only mostly correct.
- *
- * See call site for more info.
- */
- function isDirectiveDefHack(obj) {
- return obj.type !== undefined && obj.template !== undefined && obj.declaredInputs !== undefined;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Creates the root component view and the root component node.
- *
- * @param rNode Render host element.
- * @param def ComponentDef
- * @param rootView The parent view where the host node is stored
- * @param renderer The current renderer
- * @param sanitizer The sanitizer, if provided
- *
- * @returns Component view created
- */
- function createRootComponentView(rNode, def, rootView, rendererFactory, renderer, sanitizer) {
- resetComponentState();
- var tView = rootView[TVIEW];
- ngDevMode && assertDataInRange(rootView, 0 + HEADER_OFFSET);
- rootView[0 + HEADER_OFFSET] = rNode;
- var tNode = getOrCreateTNode(tView, null, 0, 3 /* Element */, null, null);
- var componentView = createLView(rootView, getOrCreateTView(def), null, def.onPush ? 64 /* Dirty */ : 16 /* CheckAlways */, rootView[HEADER_OFFSET], tNode, rendererFactory, renderer, sanitizer);
- if (tView.firstTemplatePass) {
- diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, rootView), rootView, def.type);
- tNode.flags = 1 /* isComponent */;
- initNodeFlags(tNode, rootView.length, 1);
- queueComponentIndexForCheck(tNode);
- }
- // Store component view at node index, with node as the HOST
- return rootView[HEADER_OFFSET] = componentView;
- }
- /**
- * Creates a root component and sets it up with features and host bindings. Shared by
- * renderComponent() and ViewContainerRef.createComponent().
- */
- function createRootComponent(componentView, componentDef, rootView, rootContext, hostFeatures) {
- var tView = rootView[TVIEW];
- // Create directive instance with factory() and store at next index in viewData
- var component = instantiateRootComponent(tView, rootView, componentDef);
- rootContext.components.push(component);
- componentView[CONTEXT] = component;
- hostFeatures && hostFeatures.forEach(function (feature) { return feature(component, componentDef); });
- // We want to generate an empty QueryList for root content queries for backwards
- // compatibility with ViewEngine.
- if (componentDef.contentQueries) {
- componentDef.contentQueries(1 /* Create */, component, rootView.length - 1);
- }
- var rootTNode = getPreviousOrParentTNode();
- if (tView.firstTemplatePass && componentDef.hostBindings) {
- var elementIndex = rootTNode.index - HEADER_OFFSET;
- var expando = tView.expandoInstructions;
- invokeHostBindingsInCreationMode(componentDef, expando, component, rootTNode, tView.firstTemplatePass);
- rootTNode.onElementCreationFns && applyOnCreateInstructions(rootTNode);
- }
- if (rootTNode.stylingTemplate) {
- var native = componentView[HOST];
- renderInitialClasses(native, rootTNode.stylingTemplate, componentView[RENDERER]);
- renderInitialStyles(native, rootTNode.stylingTemplate, componentView[RENDERER]);
- }
- return component;
- }
- function createRootContext(scheduler, playerHandler) {
- return {
- components: [],
- scheduler: scheduler || defaultScheduler,
- clean: CLEAN_PROMISE,
- playerHandler: playerHandler || null,
- flags: 0 /* Empty */
- };
- }
- /**
- * Used to enable lifecycle hooks on the root component.
- *
- * Include this feature when calling `renderComponent` if the root component
- * you are rendering has lifecycle hooks defined. Otherwise, the hooks won't
- * be called properly.
- *
- * Example:
- *
- * ```
- * renderComponent(AppComponent, {features: [RootLifecycleHooks]});
- * ```
- */
- function LifecycleHooksFeature(component, def) {
- var rootTView = readPatchedLView(component)[TVIEW];
- var dirIndex = rootTView.data.length - 1;
- registerPreOrderHooks(dirIndex, def, rootTView, -1, -1, -1);
- // TODO(misko): replace `as TNode` with createTNode call. (needs refactoring to lose dep on
- // LNode).
- registerPostOrderHooks(rootTView, { directiveStart: dirIndex, directiveEnd: dirIndex + 1 });
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Represents a basic change from a previous to a new value for a single
- * property on a directive instance. Passed as a value in a
- * {@link SimpleChanges} object to the `ngOnChanges` hook.
- *
- * @see `OnChanges`
- *
- * @publicApi
- */
- var SimpleChange = /** @class */ (function () {
- function SimpleChange(previousValue, currentValue, firstChange) {
- this.previousValue = previousValue;
- this.currentValue = currentValue;
- this.firstChange = firstChange;
- }
- /**
- * Check whether the new value is the first value assigned.
- */
- SimpleChange.prototype.isFirstChange = function () { return this.firstChange; };
- return SimpleChange;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Represents a component created by a `ComponentFactory`.
- * Provides access to the component instance and related objects,
- * and provides the means of destroying the instance.
- *
- * @publicApi
- */
- var ComponentRef = /** @class */ (function () {
- function ComponentRef() {
- }
- return ComponentRef;
- }());
- /**
- * Base class for a factory that can create a component dynamically.
- * Instantiate a factory for a given type of component with `resolveComponentFactory()`.
- * Use the resulting `ComponentFactory.create()` method to create a component of that type.
- *
- * @see [Dynamic Components](guide/dynamic-component-loader)
- *
- * @publicApi
- */
- var ComponentFactory = /** @class */ (function () {
- function ComponentFactory() {
- }
- return ComponentFactory;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function noComponentFactoryError(component) {
- var error = Error("No component factory found for " + stringify$1(component) + ". Did you add it to @NgModule.entryComponents?");
- error[ERROR_COMPONENT] = component;
- return error;
- }
- var ERROR_COMPONENT = 'ngComponent';
- var _NullComponentFactoryResolver = /** @class */ (function () {
- function _NullComponentFactoryResolver() {
- }
- _NullComponentFactoryResolver.prototype.resolveComponentFactory = function (component) {
- throw noComponentFactoryError(component);
- };
- return _NullComponentFactoryResolver;
- }());
- /**
- * A simple registry that maps `Components` to generated `ComponentFactory` classes
- * that can be used to create instances of components.
- * Use to obtain the factory for a given component type,
- * then use the factory's `create()` method to create a component of that type.
- *
- * @see [Dynamic Components](guide/dynamic-component-loader)
- * @publicApi
- */
- var ComponentFactoryResolver = /** @class */ (function () {
- function ComponentFactoryResolver() {
- }
- ComponentFactoryResolver.NULL = new _NullComponentFactoryResolver();
- return ComponentFactoryResolver;
- }());
- var ComponentFactoryBoundToModule = /** @class */ (function (_super) {
- __extends(ComponentFactoryBoundToModule, _super);
- function ComponentFactoryBoundToModule(factory, ngModule) {
- var _this = _super.call(this) || this;
- _this.factory = factory;
- _this.ngModule = ngModule;
- _this.selector = factory.selector;
- _this.componentType = factory.componentType;
- _this.ngContentSelectors = factory.ngContentSelectors;
- _this.inputs = factory.inputs;
- _this.outputs = factory.outputs;
- return _this;
- }
- ComponentFactoryBoundToModule.prototype.create = function (injector, projectableNodes, rootSelectorOrNode, ngModule) {
- return this.factory.create(injector, projectableNodes, rootSelectorOrNode, ngModule || this.ngModule);
- };
- return ComponentFactoryBoundToModule;
- }(ComponentFactory));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Represents an instance of an NgModule created via a {@link NgModuleFactory}.
- *
- * `NgModuleRef` provides access to the NgModule Instance as well other objects related to this
- * NgModule Instance.
- *
- * @publicApi
- */
- var NgModuleRef = /** @class */ (function () {
- function NgModuleRef() {
- }
- return NgModuleRef;
- }());
- /**
- * @publicApi
- */
- var NgModuleFactory = /** @class */ (function () {
- function NgModuleFactory() {
- }
- return NgModuleFactory;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ViewRef = /** @class */ (function () {
- function ViewRef(_lView, _context, _componentIndex) {
- this._context = _context;
- this._componentIndex = _componentIndex;
- this._appRef = null;
- this._viewContainerRef = null;
- /**
- * @internal
- */
- this._tViewNode = null;
- this._lView = _lView;
- }
- Object.defineProperty(ViewRef.prototype, "rootNodes", {
- get: function () {
- if (this._lView[HOST] == null) {
- var tView = this._lView[T_HOST];
- return collectNativeNodes(this._lView, tView, []);
- }
- return [];
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ViewRef.prototype, "context", {
- get: function () { return this._context ? this._context : this._lookUpContext(); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ViewRef.prototype, "destroyed", {
- get: function () {
- return (this._lView[FLAGS] & 256 /* Destroyed */) === 256 /* Destroyed */;
- },
- enumerable: true,
- configurable: true
- });
- ViewRef.prototype.destroy = function () {
- if (this._appRef) {
- this._appRef.detachView(this);
- }
- else if (this._viewContainerRef) {
- var index = this._viewContainerRef.indexOf(this);
- if (index > -1) {
- this._viewContainerRef.detach(index);
- }
- this._viewContainerRef = null;
- }
- destroyLView(this._lView);
- };
- ViewRef.prototype.onDestroy = function (callback) { storeCleanupFn(this._lView, callback); };
- /**
- * Marks a view and all of its ancestors dirty.
- *
- * It also triggers change detection by calling `scheduleTick` internally, which coalesces
- * multiple `markForCheck` calls to into one change detection run.
- *
- * This can be used to ensure an {@link ChangeDetectionStrategy#OnPush OnPush} component is
- * checked when it needs to be re-rendered but the two normal triggers haven't marked it
- * dirty (i.e. inputs haven't changed and events haven't fired in the view).
- *
- * <!-- TODO: Add a link to a chapter on OnPush components -->
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * @Component({
- * selector: 'my-app',
- * template: `Number of ticks: {{numberOfTicks}}`
- * changeDetection: ChangeDetectionStrategy.OnPush,
- * })
- * class AppComponent {
- * numberOfTicks = 0;
- *
- * constructor(private ref: ChangeDetectorRef) {
- * setInterval(() => {
- * this.numberOfTicks++;
- * // the following is required, otherwise the view will not be updated
- * this.ref.markForCheck();
- * }, 1000);
- * }
- * }
- * ```
- */
- ViewRef.prototype.markForCheck = function () { markViewDirty(this._lView); };
- /**
- * Detaches the view from the change detection tree.
- *
- * Detached views will not be checked during change detection runs until they are
- * re-attached, even if they are dirty. `detach` can be used in combination with
- * {@link ChangeDetectorRef#detectChanges detectChanges} to implement local change
- * detection checks.
- *
- * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
- * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
- *
- * @usageNotes
- * ### Example
- *
- * The following example defines a component with a large list of readonly data.
- * Imagine the data changes constantly, many times per second. For performance reasons,
- * we want to check and update the list every five seconds. We can do that by detaching
- * the component's change detector and doing a local check every five seconds.
- *
- * ```typescript
- * class DataProvider {
- * // in a real application the returned data will be different every time
- * get data() {
- * return [1,2,3,4,5];
- * }
- * }
- *
- * @Component({
- * selector: 'giant-list',
- * template: `
- * <li *ngFor="let d of dataProvider.data">Data {{d}}</li>
- * `,
- * })
- * class GiantList {
- * constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {
- * ref.detach();
- * setInterval(() => {
- * this.ref.detectChanges();
- * }, 5000);
- * }
- * }
- *
- * @Component({
- * selector: 'app',
- * providers: [DataProvider],
- * template: `
- * <giant-list><giant-list>
- * `,
- * })
- * class App {
- * }
- * ```
- */
- ViewRef.prototype.detach = function () { this._lView[FLAGS] &= ~128 /* Attached */; };
- /**
- * Re-attaches a view to the change detection tree.
- *
- * This can be used to re-attach views that were previously detached from the tree
- * using {@link ChangeDetectorRef#detach detach}. Views are attached to the tree by default.
- *
- * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
- *
- * @usageNotes
- * ### Example
- *
- * The following example creates a component displaying `live` data. The component will detach
- * its change detector from the main change detector tree when the component's live property
- * is set to false.
- *
- * ```typescript
- * class DataProvider {
- * data = 1;
- *
- * constructor() {
- * setInterval(() => {
- * this.data = this.data * 2;
- * }, 500);
- * }
- * }
- *
- * @Component({
- * selector: 'live-data',
- * inputs: ['live'],
- * template: 'Data: {{dataProvider.data}}'
- * })
- * class LiveData {
- * constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {}
- *
- * set live(value) {
- * if (value) {
- * this.ref.reattach();
- * } else {
- * this.ref.detach();
- * }
- * }
- * }
- *
- * @Component({
- * selector: 'my-app',
- * providers: [DataProvider],
- * template: `
- * Live Update: <input type="checkbox" [(ngModel)]="live">
- * <live-data [live]="live"><live-data>
- * `,
- * })
- * class AppComponent {
- * live = true;
- * }
- * ```
- */
- ViewRef.prototype.reattach = function () { this._lView[FLAGS] |= 128 /* Attached */; };
- /**
- * Checks the view and its children.
- *
- * This can also be used in combination with {@link ChangeDetectorRef#detach detach} to implement
- * local change detection checks.
- *
- * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
- * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
- *
- * @usageNotes
- * ### Example
- *
- * The following example defines a component with a large list of readonly data.
- * Imagine, the data changes constantly, many times per second. For performance reasons,
- * we want to check and update the list every five seconds.
- *
- * We can do that by detaching the component's change detector and doing a local change detection
- * check every five seconds.
- *
- * See {@link ChangeDetectorRef#detach detach} for more information.
- */
- ViewRef.prototype.detectChanges = function () { detectChangesInternal(this._lView, this.context); };
- /**
- * Checks the change detector and its children, and throws if any changes are detected.
- *
- * This is used in development mode to verify that running change detection doesn't
- * introduce other changes.
- */
- ViewRef.prototype.checkNoChanges = function () { checkNoChangesInternal(this._lView, this.context); };
- ViewRef.prototype.attachToViewContainerRef = function (vcRef) {
- if (this._appRef) {
- throw new Error('This view is already attached directly to the ApplicationRef!');
- }
- this._viewContainerRef = vcRef;
- };
- ViewRef.prototype.detachFromAppRef = function () {
- this._appRef = null;
- renderDetachView(this._lView);
- };
- ViewRef.prototype.attachToAppRef = function (appRef) {
- if (this._viewContainerRef) {
- throw new Error('This view is already attached to a ViewContainer!');
- }
- this._appRef = appRef;
- };
- ViewRef.prototype._lookUpContext = function () {
- return this._context = getLViewParent(this._lView)[this._componentIndex];
- };
- return ViewRef;
- }());
- /** @internal */
- var RootViewRef = /** @class */ (function (_super) {
- __extends(RootViewRef, _super);
- function RootViewRef(_view) {
- var _this = _super.call(this, _view, null, -1) || this;
- _this._view = _view;
- return _this;
- }
- RootViewRef.prototype.detectChanges = function () { detectChangesInRootView(this._view); };
- RootViewRef.prototype.checkNoChanges = function () { checkNoChangesInRootView(this._view); };
- Object.defineProperty(RootViewRef.prototype, "context", {
- get: function () { return null; },
- enumerable: true,
- configurable: true
- });
- return RootViewRef;
- }(ViewRef));
- function collectNativeNodes(lView, parentTNode, result) {
- var tNodeChild = parentTNode.child;
- while (tNodeChild) {
- var nativeNode = getNativeByTNode(tNodeChild, lView);
- nativeNode && result.push(nativeNode);
- if (tNodeChild.type === 4 /* ElementContainer */) {
- collectNativeNodes(lView, tNodeChild, result);
- }
- else if (tNodeChild.type === 1 /* Projection */) {
- var componentView = findComponentView(lView);
- var componentHost = componentView[T_HOST];
- var parentView = getLViewParent(componentView);
- var currentProjectedNode = componentHost.projection[tNodeChild.projection];
- while (currentProjectedNode && parentView) {
- result.push(getNativeByTNode(currentProjectedNode, parentView));
- currentProjectedNode = currentProjectedNode.next;
- }
- }
- tNodeChild = tNodeChild.next;
- }
- return result;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var R3ElementRef;
- /**
- * Creates an ElementRef given a node.
- *
- * @param ElementRefToken The ElementRef type
- * @param tNode The node for which you'd like an ElementRef
- * @param view The view to which the node belongs
- * @returns The ElementRef instance to use
- */
- function createElementRef(ElementRefToken, tNode, view) {
- if (!R3ElementRef) {
- // TODO: Fix class name, should be ElementRef, but there appears to be a rollup bug
- R3ElementRef = /** @class */ (function (_super) {
- __extends(ElementRef_, _super);
- function ElementRef_() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return ElementRef_;
- }(ElementRefToken));
- }
- return new R3ElementRef(getNativeByTNode(tNode, view));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function noop() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- // Do nothing.
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A wrapper around a native element inside of a View.
- *
- * An `ElementRef` is backed by a render-specific element. In the browser, this is usually a DOM
- * element.
- *
- * @security Permitting direct access to the DOM can make your application more vulnerable to
- * XSS attacks. Carefully review any use of `ElementRef` in your code. For more detail, see the
- * [Security Guide](http://g.co/ng/security).
- *
- * @publicApi
- */
- // Note: We don't expose things like `Injector`, `ViewContainer`, ... here,
- // i.e. users have to ask for what they need. With that, we can build better analysis tools
- // and could do better codegen in the future.
- var ElementRef = /** @class */ (function () {
- function ElementRef(nativeElement) {
- this.nativeElement = nativeElement;
- }
- /**
- * @internal
- * @nocollapse
- */
- ElementRef.__NG_ELEMENT_ID__ = function () { return SWITCH_ELEMENT_REF_FACTORY(ElementRef); };
- return ElementRef;
- }());
- var SWITCH_ELEMENT_REF_FACTORY__PRE_R3__ = noop;
- var SWITCH_ELEMENT_REF_FACTORY = SWITCH_ELEMENT_REF_FACTORY__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @deprecated Use the `Renderer2` instead.
- * @publicApi
- */
- var Renderer = /** @class */ (function () {
- function Renderer() {
- }
- return Renderer;
- }());
- var Renderer2Interceptor = new InjectionToken('Renderer2Interceptor');
- /**
- * Creates and initializes a custom renderer that implements the `Renderer2` base class.
- *
- * @publicApi
- */
- var RendererFactory2 = /** @class */ (function () {
- function RendererFactory2() {
- }
- return RendererFactory2;
- }());
- /**
- * Flags for renderer-specific style modifiers.
- * @publicApi
- */
- var RendererStyleFlags2;
- (function (RendererStyleFlags2) {
- /**
- * Marks a style as important.
- */
- RendererStyleFlags2[RendererStyleFlags2["Important"] = 1] = "Important";
- /**
- * Marks a style as using dash case naming (this-is-dash-case).
- */
- RendererStyleFlags2[RendererStyleFlags2["DashCase"] = 2] = "DashCase";
- })(RendererStyleFlags2 || (RendererStyleFlags2 = {}));
- /**
- * Extend this base class to implement custom rendering. By default, Angular
- * renders a template into DOM. You can use custom rendering to intercept
- * rendering calls, or to render to something other than DOM.
- *
- * Create your custom renderer using `RendererFactory2`.
- *
- * Use a custom renderer to bypass Angular's templating and
- * make custom UI changes that can't be expressed declaratively.
- * For example if you need to set a property or an attribute whose name is
- * not statically known, use the `setProperty()` or
- * `setAttribute()` method.
- *
- * @publicApi
- */
- var Renderer2 = /** @class */ (function () {
- function Renderer2() {
- }
- /**
- * @internal
- * @nocollapse
- */
- Renderer2.__NG_ELEMENT_ID__ = function () { return SWITCH_RENDERER2_FACTORY(); };
- return Renderer2;
- }());
- var SWITCH_RENDERER2_FACTORY__PRE_R3__ = noop;
- var SWITCH_RENDERER2_FACTORY = SWITCH_RENDERER2_FACTORY__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @description Represents the version of Angular
- *
- * @publicApi
- */
- var Version$1 = /** @class */ (function () {
- function Version(full) {
- this.full = full;
- this.major = full.split('.')[0];
- this.minor = full.split('.')[1];
- this.patch = full.split('.').slice(2).join('.');
- }
- return Version;
- }());
- /**
- * @publicApi
- */
- var VERSION$2 = new Version$1('8.1.3');
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var DefaultIterableDifferFactory = /** @class */ (function () {
- function DefaultIterableDifferFactory() {
- }
- DefaultIterableDifferFactory.prototype.supports = function (obj) { return isListLikeIterable(obj); };
- DefaultIterableDifferFactory.prototype.create = function (trackByFn) {
- return new DefaultIterableDiffer(trackByFn);
- };
- return DefaultIterableDifferFactory;
- }());
- var trackByIdentity = function (index, item) { return item; };
- /**
- * @deprecated v4.0.0 - Should not be part of public API.
- * @publicApi
- */
- var DefaultIterableDiffer = /** @class */ (function () {
- function DefaultIterableDiffer(trackByFn) {
- this.length = 0;
- // Keeps track of the used records at any point in time (during & across `_check()` calls)
- this._linkedRecords = null;
- // Keeps track of the removed records at any point in time during `_check()` calls.
- this._unlinkedRecords = null;
- this._previousItHead = null;
- this._itHead = null;
- this._itTail = null;
- this._additionsHead = null;
- this._additionsTail = null;
- this._movesHead = null;
- this._movesTail = null;
- this._removalsHead = null;
- this._removalsTail = null;
- // Keeps track of records where custom track by is the same, but item identity has changed
- this._identityChangesHead = null;
- this._identityChangesTail = null;
- this._trackByFn = trackByFn || trackByIdentity;
- }
- DefaultIterableDiffer.prototype.forEachItem = function (fn) {
- var record;
- for (record = this._itHead; record !== null; record = record._next) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachOperation = function (fn) {
- var nextIt = this._itHead;
- var nextRemove = this._removalsHead;
- var addRemoveOffset = 0;
- var moveOffsets = null;
- while (nextIt || nextRemove) {
- // Figure out which is the next record to process
- // Order: remove, add, move
- var record = !nextRemove ||
- nextIt &&
- nextIt.currentIndex <
- getPreviousIndex(nextRemove, addRemoveOffset, moveOffsets) ?
- nextIt :
- nextRemove;
- var adjPreviousIndex = getPreviousIndex(record, addRemoveOffset, moveOffsets);
- var currentIndex = record.currentIndex;
- // consume the item, and adjust the addRemoveOffset and update moveDistance if necessary
- if (record === nextRemove) {
- addRemoveOffset--;
- nextRemove = nextRemove._nextRemoved;
- }
- else {
- nextIt = nextIt._next;
- if (record.previousIndex == null) {
- addRemoveOffset++;
- }
- else {
- // INVARIANT: currentIndex < previousIndex
- if (!moveOffsets)
- moveOffsets = [];
- var localMovePreviousIndex = adjPreviousIndex - addRemoveOffset;
- var localCurrentIndex = currentIndex - addRemoveOffset;
- if (localMovePreviousIndex != localCurrentIndex) {
- for (var i = 0; i < localMovePreviousIndex; i++) {
- var offset = i < moveOffsets.length ? moveOffsets[i] : (moveOffsets[i] = 0);
- var index = offset + i;
- if (localCurrentIndex <= index && index < localMovePreviousIndex) {
- moveOffsets[i] = offset + 1;
- }
- }
- var previousIndex = record.previousIndex;
- moveOffsets[previousIndex] = localCurrentIndex - localMovePreviousIndex;
- }
- }
- }
- if (adjPreviousIndex !== currentIndex) {
- fn(record, adjPreviousIndex, currentIndex);
- }
- }
- };
- DefaultIterableDiffer.prototype.forEachPreviousItem = function (fn) {
- var record;
- for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachAddedItem = function (fn) {
- var record;
- for (record = this._additionsHead; record !== null; record = record._nextAdded) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachMovedItem = function (fn) {
- var record;
- for (record = this._movesHead; record !== null; record = record._nextMoved) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachRemovedItem = function (fn) {
- var record;
- for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.forEachIdentityChange = function (fn) {
- var record;
- for (record = this._identityChangesHead; record !== null; record = record._nextIdentityChange) {
- fn(record);
- }
- };
- DefaultIterableDiffer.prototype.diff = function (collection) {
- if (collection == null)
- collection = [];
- if (!isListLikeIterable(collection)) {
- throw new Error("Error trying to diff '" + stringify$1(collection) + "'. Only arrays and iterables are allowed");
- }
- if (this.check(collection)) {
- return this;
- }
- else {
- return null;
- }
- };
- DefaultIterableDiffer.prototype.onDestroy = function () { };
- DefaultIterableDiffer.prototype.check = function (collection) {
- var _this = this;
- this._reset();
- var record = this._itHead;
- var mayBeDirty = false;
- var index;
- var item;
- var itemTrackBy;
- if (Array.isArray(collection)) {
- this.length = collection.length;
- for (var index_1 = 0; index_1 < this.length; index_1++) {
- item = collection[index_1];
- itemTrackBy = this._trackByFn(index_1, item);
- if (record === null || !looseIdentical(record.trackById, itemTrackBy)) {
- record = this._mismatch(record, item, itemTrackBy, index_1);
- mayBeDirty = true;
- }
- else {
- if (mayBeDirty) {
- // TODO(misko): can we limit this to duplicates only?
- record = this._verifyReinsertion(record, item, itemTrackBy, index_1);
- }
- if (!looseIdentical(record.item, item))
- this._addIdentityChange(record, item);
- }
- record = record._next;
- }
- }
- else {
- index = 0;
- iterateListLike(collection, function (item) {
- itemTrackBy = _this._trackByFn(index, item);
- if (record === null || !looseIdentical(record.trackById, itemTrackBy)) {
- record = _this._mismatch(record, item, itemTrackBy, index);
- mayBeDirty = true;
- }
- else {
- if (mayBeDirty) {
- // TODO(misko): can we limit this to duplicates only?
- record = _this._verifyReinsertion(record, item, itemTrackBy, index);
- }
- if (!looseIdentical(record.item, item))
- _this._addIdentityChange(record, item);
- }
- record = record._next;
- index++;
- });
- this.length = index;
- }
- this._truncate(record);
- this.collection = collection;
- return this.isDirty;
- };
- Object.defineProperty(DefaultIterableDiffer.prototype, "isDirty", {
- /* CollectionChanges is considered dirty if it has any additions, moves, removals, or identity
- * changes.
- */
- get: function () {
- return this._additionsHead !== null || this._movesHead !== null ||
- this._removalsHead !== null || this._identityChangesHead !== null;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * Reset the state of the change objects to show no changes. This means set previousKey to
- * currentKey, and clear all of the queues (additions, moves, removals).
- * Set the previousIndexes of moved and added items to their currentIndexes
- * Reset the list of additions, moves and removals
- *
- * @internal
- */
- DefaultIterableDiffer.prototype._reset = function () {
- if (this.isDirty) {
- var record = void 0;
- var nextRecord = void 0;
- for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {
- record._nextPrevious = record._next;
- }
- for (record = this._additionsHead; record !== null; record = record._nextAdded) {
- record.previousIndex = record.currentIndex;
- }
- this._additionsHead = this._additionsTail = null;
- for (record = this._movesHead; record !== null; record = nextRecord) {
- record.previousIndex = record.currentIndex;
- nextRecord = record._nextMoved;
- }
- this._movesHead = this._movesTail = null;
- this._removalsHead = this._removalsTail = null;
- this._identityChangesHead = this._identityChangesTail = null;
- // TODO(vicb): when assert gets supported
- // assert(!this.isDirty);
- }
- };
- /**
- * This is the core function which handles differences between collections.
- *
- * - `record` is the record which we saw at this position last time. If null then it is a new
- * item.
- * - `item` is the current item in the collection
- * - `index` is the position of the item in the collection
- *
- * @internal
- */
- DefaultIterableDiffer.prototype._mismatch = function (record, item, itemTrackBy, index) {
- // The previous record after which we will append the current one.
- var previousRecord;
- if (record === null) {
- previousRecord = this._itTail;
- }
- else {
- previousRecord = record._prev;
- // Remove the record from the collection since we know it does not match the item.
- this._remove(record);
- }
- // Attempt to see if we have seen the item before.
- record = this._linkedRecords === null ? null : this._linkedRecords.get(itemTrackBy, index);
- if (record !== null) {
- // We have seen this before, we need to move it forward in the collection.
- // But first we need to check if identity changed, so we can update in view if necessary
- if (!looseIdentical(record.item, item))
- this._addIdentityChange(record, item);
- this._moveAfter(record, previousRecord, index);
- }
- else {
- // Never seen it, check evicted list.
- record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy, null);
- if (record !== null) {
- // It is an item which we have evicted earlier: reinsert it back into the list.
- // But first we need to check if identity changed, so we can update in view if necessary
- if (!looseIdentical(record.item, item))
- this._addIdentityChange(record, item);
- this._reinsertAfter(record, previousRecord, index);
- }
- else {
- // It is a new item: add it.
- record =
- this._addAfter(new IterableChangeRecord_(item, itemTrackBy), previousRecord, index);
- }
- }
- return record;
- };
- /**
- * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)
- *
- * Use case: `[a, a]` => `[b, a, a]`
- *
- * If we did not have this check then the insertion of `b` would:
- * 1) evict first `a`
- * 2) insert `b` at `0` index.
- * 3) leave `a` at index `1` as is. <-- this is wrong!
- * 3) reinsert `a` at index 2. <-- this is wrong!
- *
- * The correct behavior is:
- * 1) evict first `a`
- * 2) insert `b` at `0` index.
- * 3) reinsert `a` at index 1.
- * 3) move `a` at from `1` to `2`.
- *
- *
- * Double check that we have not evicted a duplicate item. We need to check if the item type may
- * have already been removed:
- * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted
- * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a
- * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'
- * at the end.
- *
- * @internal
- */
- DefaultIterableDiffer.prototype._verifyReinsertion = function (record, item, itemTrackBy, index) {
- var reinsertRecord = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy, null);
- if (reinsertRecord !== null) {
- record = this._reinsertAfter(reinsertRecord, record._prev, index);
- }
- else if (record.currentIndex != index) {
- record.currentIndex = index;
- this._addToMoves(record, index);
- }
- return record;
- };
- /**
- * Get rid of any excess {@link IterableChangeRecord_}s from the previous collection
- *
- * - `record` The first excess {@link IterableChangeRecord_}.
- *
- * @internal
- */
- DefaultIterableDiffer.prototype._truncate = function (record) {
- // Anything after that needs to be removed;
- while (record !== null) {
- var nextRecord = record._next;
- this._addToRemovals(this._unlink(record));
- record = nextRecord;
- }
- if (this._unlinkedRecords !== null) {
- this._unlinkedRecords.clear();
- }
- if (this._additionsTail !== null) {
- this._additionsTail._nextAdded = null;
- }
- if (this._movesTail !== null) {
- this._movesTail._nextMoved = null;
- }
- if (this._itTail !== null) {
- this._itTail._next = null;
- }
- if (this._removalsTail !== null) {
- this._removalsTail._nextRemoved = null;
- }
- if (this._identityChangesTail !== null) {
- this._identityChangesTail._nextIdentityChange = null;
- }
- };
- /** @internal */
- DefaultIterableDiffer.prototype._reinsertAfter = function (record, prevRecord, index) {
- if (this._unlinkedRecords !== null) {
- this._unlinkedRecords.remove(record);
- }
- var prev = record._prevRemoved;
- var next = record._nextRemoved;
- if (prev === null) {
- this._removalsHead = next;
- }
- else {
- prev._nextRemoved = next;
- }
- if (next === null) {
- this._removalsTail = prev;
- }
- else {
- next._prevRemoved = prev;
- }
- this._insertAfter(record, prevRecord, index);
- this._addToMoves(record, index);
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._moveAfter = function (record, prevRecord, index) {
- this._unlink(record);
- this._insertAfter(record, prevRecord, index);
- this._addToMoves(record, index);
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._addAfter = function (record, prevRecord, index) {
- this._insertAfter(record, prevRecord, index);
- if (this._additionsTail === null) {
- // TODO(vicb):
- // assert(this._additionsHead === null);
- this._additionsTail = this._additionsHead = record;
- }
- else {
- // TODO(vicb):
- // assert(_additionsTail._nextAdded === null);
- // assert(record._nextAdded === null);
- this._additionsTail = this._additionsTail._nextAdded = record;
- }
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._insertAfter = function (record, prevRecord, index) {
- // TODO(vicb):
- // assert(record != prevRecord);
- // assert(record._next === null);
- // assert(record._prev === null);
- var next = prevRecord === null ? this._itHead : prevRecord._next;
- // TODO(vicb):
- // assert(next != record);
- // assert(prevRecord != record);
- record._next = next;
- record._prev = prevRecord;
- if (next === null) {
- this._itTail = record;
- }
- else {
- next._prev = record;
- }
- if (prevRecord === null) {
- this._itHead = record;
- }
- else {
- prevRecord._next = record;
- }
- if (this._linkedRecords === null) {
- this._linkedRecords = new _DuplicateMap();
- }
- this._linkedRecords.put(record);
- record.currentIndex = index;
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._remove = function (record) {
- return this._addToRemovals(this._unlink(record));
- };
- /** @internal */
- DefaultIterableDiffer.prototype._unlink = function (record) {
- if (this._linkedRecords !== null) {
- this._linkedRecords.remove(record);
- }
- var prev = record._prev;
- var next = record._next;
- // TODO(vicb):
- // assert((record._prev = null) === null);
- // assert((record._next = null) === null);
- if (prev === null) {
- this._itHead = next;
- }
- else {
- prev._next = next;
- }
- if (next === null) {
- this._itTail = prev;
- }
- else {
- next._prev = prev;
- }
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._addToMoves = function (record, toIndex) {
- // TODO(vicb):
- // assert(record._nextMoved === null);
- if (record.previousIndex === toIndex) {
- return record;
- }
- if (this._movesTail === null) {
- // TODO(vicb):
- // assert(_movesHead === null);
- this._movesTail = this._movesHead = record;
- }
- else {
- // TODO(vicb):
- // assert(_movesTail._nextMoved === null);
- this._movesTail = this._movesTail._nextMoved = record;
- }
- return record;
- };
- DefaultIterableDiffer.prototype._addToRemovals = function (record) {
- if (this._unlinkedRecords === null) {
- this._unlinkedRecords = new _DuplicateMap();
- }
- this._unlinkedRecords.put(record);
- record.currentIndex = null;
- record._nextRemoved = null;
- if (this._removalsTail === null) {
- // TODO(vicb):
- // assert(_removalsHead === null);
- this._removalsTail = this._removalsHead = record;
- record._prevRemoved = null;
- }
- else {
- // TODO(vicb):
- // assert(_removalsTail._nextRemoved === null);
- // assert(record._nextRemoved === null);
- record._prevRemoved = this._removalsTail;
- this._removalsTail = this._removalsTail._nextRemoved = record;
- }
- return record;
- };
- /** @internal */
- DefaultIterableDiffer.prototype._addIdentityChange = function (record, item) {
- record.item = item;
- if (this._identityChangesTail === null) {
- this._identityChangesTail = this._identityChangesHead = record;
- }
- else {
- this._identityChangesTail = this._identityChangesTail._nextIdentityChange = record;
- }
- return record;
- };
- return DefaultIterableDiffer;
- }());
- var IterableChangeRecord_ = /** @class */ (function () {
- function IterableChangeRecord_(item, trackById) {
- this.item = item;
- this.trackById = trackById;
- this.currentIndex = null;
- this.previousIndex = null;
- /** @internal */
- this._nextPrevious = null;
- /** @internal */
- this._prev = null;
- /** @internal */
- this._next = null;
- /** @internal */
- this._prevDup = null;
- /** @internal */
- this._nextDup = null;
- /** @internal */
- this._prevRemoved = null;
- /** @internal */
- this._nextRemoved = null;
- /** @internal */
- this._nextAdded = null;
- /** @internal */
- this._nextMoved = null;
- /** @internal */
- this._nextIdentityChange = null;
- }
- return IterableChangeRecord_;
- }());
- // A linked list of CollectionChangeRecords with the same IterableChangeRecord_.item
- var _DuplicateItemRecordList = /** @class */ (function () {
- function _DuplicateItemRecordList() {
- /** @internal */
- this._head = null;
- /** @internal */
- this._tail = null;
- }
- /**
- * Append the record to the list of duplicates.
- *
- * Note: by design all records in the list of duplicates hold the same value in record.item.
- */
- _DuplicateItemRecordList.prototype.add = function (record) {
- if (this._head === null) {
- this._head = this._tail = record;
- record._nextDup = null;
- record._prevDup = null;
- }
- else {
- // TODO(vicb):
- // assert(record.item == _head.item ||
- // record.item is num && record.item.isNaN && _head.item is num && _head.item.isNaN);
- this._tail._nextDup = record;
- record._prevDup = this._tail;
- record._nextDup = null;
- this._tail = record;
- }
- };
- // Returns a IterableChangeRecord_ having IterableChangeRecord_.trackById == trackById and
- // IterableChangeRecord_.currentIndex >= atOrAfterIndex
- _DuplicateItemRecordList.prototype.get = function (trackById, atOrAfterIndex) {
- var record;
- for (record = this._head; record !== null; record = record._nextDup) {
- if ((atOrAfterIndex === null || atOrAfterIndex <= record.currentIndex) &&
- looseIdentical(record.trackById, trackById)) {
- return record;
- }
- }
- return null;
- };
- /**
- * Remove one {@link IterableChangeRecord_} from the list of duplicates.
- *
- * Returns whether the list of duplicates is empty.
- */
- _DuplicateItemRecordList.prototype.remove = function (record) {
- // TODO(vicb):
- // assert(() {
- // // verify that the record being removed is in the list.
- // for (IterableChangeRecord_ cursor = _head; cursor != null; cursor = cursor._nextDup) {
- // if (identical(cursor, record)) return true;
- // }
- // return false;
- //});
- var prev = record._prevDup;
- var next = record._nextDup;
- if (prev === null) {
- this._head = next;
- }
- else {
- prev._nextDup = next;
- }
- if (next === null) {
- this._tail = prev;
- }
- else {
- next._prevDup = prev;
- }
- return this._head === null;
- };
- return _DuplicateItemRecordList;
- }());
- var _DuplicateMap = /** @class */ (function () {
- function _DuplicateMap() {
- this.map = new Map();
- }
- _DuplicateMap.prototype.put = function (record) {
- var key = record.trackById;
- var duplicates = this.map.get(key);
- if (!duplicates) {
- duplicates = new _DuplicateItemRecordList();
- this.map.set(key, duplicates);
- }
- duplicates.add(record);
- };
- /**
- * Retrieve the `value` using key. Because the IterableChangeRecord_ value may be one which we
- * have already iterated over, we use the `atOrAfterIndex` to pretend it is not there.
- *
- * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we
- * have any more `a`s needs to return the second `a`.
- */
- _DuplicateMap.prototype.get = function (trackById, atOrAfterIndex) {
- var key = trackById;
- var recordList = this.map.get(key);
- return recordList ? recordList.get(trackById, atOrAfterIndex) : null;
- };
- /**
- * Removes a {@link IterableChangeRecord_} from the list of duplicates.
- *
- * The list of duplicates also is removed from the map if it gets empty.
- */
- _DuplicateMap.prototype.remove = function (record) {
- var key = record.trackById;
- var recordList = this.map.get(key);
- // Remove the list of duplicates when it gets empty
- if (recordList.remove(record)) {
- this.map.delete(key);
- }
- return record;
- };
- Object.defineProperty(_DuplicateMap.prototype, "isEmpty", {
- get: function () { return this.map.size === 0; },
- enumerable: true,
- configurable: true
- });
- _DuplicateMap.prototype.clear = function () { this.map.clear(); };
- return _DuplicateMap;
- }());
- function getPreviousIndex(item, addRemoveOffset, moveOffsets) {
- var previousIndex = item.previousIndex;
- if (previousIndex === null)
- return previousIndex;
- var moveOffset = 0;
- if (moveOffsets && previousIndex < moveOffsets.length) {
- moveOffset = moveOffsets[previousIndex];
- }
- return previousIndex + addRemoveOffset + moveOffset;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var DefaultKeyValueDifferFactory = /** @class */ (function () {
- function DefaultKeyValueDifferFactory() {
- }
- DefaultKeyValueDifferFactory.prototype.supports = function (obj) { return obj instanceof Map || isJsObject(obj); };
- DefaultKeyValueDifferFactory.prototype.create = function () { return new DefaultKeyValueDiffer(); };
- return DefaultKeyValueDifferFactory;
- }());
- var DefaultKeyValueDiffer = /** @class */ (function () {
- function DefaultKeyValueDiffer() {
- this._records = new Map();
- this._mapHead = null;
- // _appendAfter is used in the check loop
- this._appendAfter = null;
- this._previousMapHead = null;
- this._changesHead = null;
- this._changesTail = null;
- this._additionsHead = null;
- this._additionsTail = null;
- this._removalsHead = null;
- this._removalsTail = null;
- }
- Object.defineProperty(DefaultKeyValueDiffer.prototype, "isDirty", {
- get: function () {
- return this._additionsHead !== null || this._changesHead !== null ||
- this._removalsHead !== null;
- },
- enumerable: true,
- configurable: true
- });
- DefaultKeyValueDiffer.prototype.forEachItem = function (fn) {
- var record;
- for (record = this._mapHead; record !== null; record = record._next) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.forEachPreviousItem = function (fn) {
- var record;
- for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.forEachChangedItem = function (fn) {
- var record;
- for (record = this._changesHead; record !== null; record = record._nextChanged) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.forEachAddedItem = function (fn) {
- var record;
- for (record = this._additionsHead; record !== null; record = record._nextAdded) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.forEachRemovedItem = function (fn) {
- var record;
- for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
- fn(record);
- }
- };
- DefaultKeyValueDiffer.prototype.diff = function (map) {
- if (!map) {
- map = new Map();
- }
- else if (!(map instanceof Map || isJsObject(map))) {
- throw new Error("Error trying to diff '" + stringify$1(map) + "'. Only maps and objects are allowed");
- }
- return this.check(map) ? this : null;
- };
- DefaultKeyValueDiffer.prototype.onDestroy = function () { };
- /**
- * Check the current state of the map vs the previous.
- * The algorithm is optimised for when the keys do no change.
- */
- DefaultKeyValueDiffer.prototype.check = function (map) {
- var _this = this;
- this._reset();
- var insertBefore = this._mapHead;
- this._appendAfter = null;
- this._forEach(map, function (value, key) {
- if (insertBefore && insertBefore.key === key) {
- _this._maybeAddToChanges(insertBefore, value);
- _this._appendAfter = insertBefore;
- insertBefore = insertBefore._next;
- }
- else {
- var record = _this._getOrCreateRecordForKey(key, value);
- insertBefore = _this._insertBeforeOrAppend(insertBefore, record);
- }
- });
- // Items remaining at the end of the list have been deleted
- if (insertBefore) {
- if (insertBefore._prev) {
- insertBefore._prev._next = null;
- }
- this._removalsHead = insertBefore;
- for (var record = insertBefore; record !== null; record = record._nextRemoved) {
- if (record === this._mapHead) {
- this._mapHead = null;
- }
- this._records.delete(record.key);
- record._nextRemoved = record._next;
- record.previousValue = record.currentValue;
- record.currentValue = null;
- record._prev = null;
- record._next = null;
- }
- }
- // Make sure tails have no next records from previous runs
- if (this._changesTail)
- this._changesTail._nextChanged = null;
- if (this._additionsTail)
- this._additionsTail._nextAdded = null;
- return this.isDirty;
- };
- /**
- * Inserts a record before `before` or append at the end of the list when `before` is null.
- *
- * Notes:
- * - This method appends at `this._appendAfter`,
- * - This method updates `this._appendAfter`,
- * - The return value is the new value for the insertion pointer.
- */
- DefaultKeyValueDiffer.prototype._insertBeforeOrAppend = function (before, record) {
- if (before) {
- var prev = before._prev;
- record._next = before;
- record._prev = prev;
- before._prev = record;
- if (prev) {
- prev._next = record;
- }
- if (before === this._mapHead) {
- this._mapHead = record;
- }
- this._appendAfter = before;
- return before;
- }
- if (this._appendAfter) {
- this._appendAfter._next = record;
- record._prev = this._appendAfter;
- }
- else {
- this._mapHead = record;
- }
- this._appendAfter = record;
- return null;
- };
- DefaultKeyValueDiffer.prototype._getOrCreateRecordForKey = function (key, value) {
- if (this._records.has(key)) {
- var record_1 = this._records.get(key);
- this._maybeAddToChanges(record_1, value);
- var prev = record_1._prev;
- var next = record_1._next;
- if (prev) {
- prev._next = next;
- }
- if (next) {
- next._prev = prev;
- }
- record_1._next = null;
- record_1._prev = null;
- return record_1;
- }
- var record = new KeyValueChangeRecord_(key);
- this._records.set(key, record);
- record.currentValue = value;
- this._addToAdditions(record);
- return record;
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._reset = function () {
- if (this.isDirty) {
- var record = void 0;
- // let `_previousMapHead` contain the state of the map before the changes
- this._previousMapHead = this._mapHead;
- for (record = this._previousMapHead; record !== null; record = record._next) {
- record._nextPrevious = record._next;
- }
- // Update `record.previousValue` with the value of the item before the changes
- // We need to update all changed items (that's those which have been added and changed)
- for (record = this._changesHead; record !== null; record = record._nextChanged) {
- record.previousValue = record.currentValue;
- }
- for (record = this._additionsHead; record != null; record = record._nextAdded) {
- record.previousValue = record.currentValue;
- }
- this._changesHead = this._changesTail = null;
- this._additionsHead = this._additionsTail = null;
- this._removalsHead = null;
- }
- };
- // Add the record or a given key to the list of changes only when the value has actually changed
- DefaultKeyValueDiffer.prototype._maybeAddToChanges = function (record, newValue) {
- if (!looseIdentical(newValue, record.currentValue)) {
- record.previousValue = record.currentValue;
- record.currentValue = newValue;
- this._addToChanges(record);
- }
- };
- DefaultKeyValueDiffer.prototype._addToAdditions = function (record) {
- if (this._additionsHead === null) {
- this._additionsHead = this._additionsTail = record;
- }
- else {
- this._additionsTail._nextAdded = record;
- this._additionsTail = record;
- }
- };
- DefaultKeyValueDiffer.prototype._addToChanges = function (record) {
- if (this._changesHead === null) {
- this._changesHead = this._changesTail = record;
- }
- else {
- this._changesTail._nextChanged = record;
- this._changesTail = record;
- }
- };
- /** @internal */
- DefaultKeyValueDiffer.prototype._forEach = function (obj, fn) {
- if (obj instanceof Map) {
- obj.forEach(fn);
- }
- else {
- Object.keys(obj).forEach(function (k) { return fn(obj[k], k); });
- }
- };
- return DefaultKeyValueDiffer;
- }());
- var KeyValueChangeRecord_ = /** @class */ (function () {
- function KeyValueChangeRecord_(key) {
- this.key = key;
- this.previousValue = null;
- this.currentValue = null;
- /** @internal */
- this._nextPrevious = null;
- /** @internal */
- this._next = null;
- /** @internal */
- this._prev = null;
- /** @internal */
- this._nextAdded = null;
- /** @internal */
- this._nextRemoved = null;
- /** @internal */
- this._nextChanged = null;
- }
- return KeyValueChangeRecord_;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.
- *
- * @publicApi
- */
- var IterableDiffers = /** @class */ (function () {
- function IterableDiffers(factories) {
- this.factories = factories;
- }
- IterableDiffers.create = function (factories, parent) {
- if (parent != null) {
- var copied = parent.factories.slice();
- factories = factories.concat(copied);
- }
- return new IterableDiffers(factories);
- };
- /**
- * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the
- * inherited {@link IterableDiffers} instance with the provided factories and return a new
- * {@link IterableDiffers} instance.
- *
- * @usageNotes
- * ### Example
- *
- * The following example shows how to extend an existing list of factories,
- * which will only be applied to the injector for this component and its children.
- * This step is all that's required to make a new {@link IterableDiffer} available.
- *
- * ```
- * @Component({
- * viewProviders: [
- * IterableDiffers.extend([new ImmutableListDiffer()])
- * ]
- * })
- * ```
- */
- IterableDiffers.extend = function (factories) {
- return {
- provide: IterableDiffers,
- useFactory: function (parent) {
- if (!parent) {
- // Typically would occur when calling IterableDiffers.extend inside of dependencies passed
- // to
- // bootstrap(), which would override default pipes instead of extending them.
- throw new Error('Cannot extend IterableDiffers without a parent injector');
- }
- return IterableDiffers.create(factories, parent);
- },
- // Dependency technically isn't optional, but we can provide a better error message this way.
- deps: [[IterableDiffers, new SkipSelf(), new Optional()]]
- };
- };
- IterableDiffers.prototype.find = function (iterable) {
- var factory = this.factories.find(function (f) { return f.supports(iterable); });
- if (factory != null) {
- return factory;
- }
- else {
- throw new Error("Cannot find a differ supporting object '" + iterable + "' of type '" + getTypeNameForDebugging(iterable) + "'");
- }
- };
- /** @nocollapse */
- IterableDiffers.ngInjectableDef = ɵɵdefineInjectable({
- token: IterableDiffers,
- providedIn: 'root',
- factory: function () { return new IterableDiffers([new DefaultIterableDifferFactory()]); }
- });
- return IterableDiffers;
- }());
- function getTypeNameForDebugging(type) {
- return type['name'] || typeof type;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.
- *
- * @publicApi
- */
- var KeyValueDiffers = /** @class */ (function () {
- function KeyValueDiffers(factories) {
- this.factories = factories;
- }
- KeyValueDiffers.create = function (factories, parent) {
- if (parent) {
- var copied = parent.factories.slice();
- factories = factories.concat(copied);
- }
- return new KeyValueDiffers(factories);
- };
- /**
- * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the
- * inherited {@link KeyValueDiffers} instance with the provided factories and return a new
- * {@link KeyValueDiffers} instance.
- *
- * @usageNotes
- * ### Example
- *
- * The following example shows how to extend an existing list of factories,
- * which will only be applied to the injector for this component and its children.
- * This step is all that's required to make a new {@link KeyValueDiffer} available.
- *
- * ```
- * @Component({
- * viewProviders: [
- * KeyValueDiffers.extend([new ImmutableMapDiffer()])
- * ]
- * })
- * ```
- */
- KeyValueDiffers.extend = function (factories) {
- return {
- provide: KeyValueDiffers,
- useFactory: function (parent) {
- if (!parent) {
- // Typically would occur when calling KeyValueDiffers.extend inside of dependencies passed
- // to bootstrap(), which would override default pipes instead of extending them.
- throw new Error('Cannot extend KeyValueDiffers without a parent injector');
- }
- return KeyValueDiffers.create(factories, parent);
- },
- // Dependency technically isn't optional, but we can provide a better error message this way.
- deps: [[KeyValueDiffers, new SkipSelf(), new Optional()]]
- };
- };
- KeyValueDiffers.prototype.find = function (kv) {
- var factory = this.factories.find(function (f) { return f.supports(kv); });
- if (factory) {
- return factory;
- }
- throw new Error("Cannot find a differ supporting object '" + kv + "'");
- };
- /** @nocollapse */
- KeyValueDiffers.ngInjectableDef = ɵɵdefineInjectable({
- token: KeyValueDiffers,
- providedIn: 'root',
- factory: function () { return new KeyValueDiffers([new DefaultKeyValueDifferFactory()]); }
- });
- return KeyValueDiffers;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Base class for Angular Views, provides change detection functionality.
- * A change-detection tree collects all views that are to be checked for changes.
- * Use the methods to add and remove views from the tree, initiate change-detection,
- * and explicitly mark views as _dirty_, meaning that they have changed and need to be rerendered.
- *
- * @usageNotes
- *
- * The following examples demonstrate how to modify default change-detection behavior
- * to perform explicit detection when needed.
- *
- * ### Use `markForCheck()` with `CheckOnce` strategy
- *
- * The following example sets the `OnPush` change-detection strategy for a component
- * (`CheckOnce`, rather than the default `CheckAlways`), then forces a second check
- * after an interval. See [live demo](http://plnkr.co/edit/GC512b?p=preview).
- *
- * <code-example path="core/ts/change_detect/change-detection.ts"
- * region="mark-for-check"></code-example>
- *
- * ### Detach change detector to limit how often check occurs
- *
- * The following example defines a component with a large list of read-only data
- * that is expected to change constantly, many times per second.
- * To improve performance, we want to check and update the list
- * less often than the changes actually occur. To do that, we detach
- * the component's change detector and perform an explicit local check every five seconds.
- *
- * <code-example path="core/ts/change_detect/change-detection.ts" region="detach"></code-example>
- *
- *
- * ### Reattaching a detached component
- *
- * The following example creates a component displaying live data.
- * The component detaches its change detector from the main change detector tree
- * when the `live` property is set to false, and reattaches it when the property
- * becomes true.
- *
- * <code-example path="core/ts/change_detect/change-detection.ts" region="reattach"></code-example>
- *
- * @publicApi
- */
- var ChangeDetectorRef = /** @class */ (function () {
- function ChangeDetectorRef() {
- }
- /**
- * @internal
- * @nocollapse
- */
- ChangeDetectorRef.__NG_ELEMENT_ID__ = function () { return SWITCH_CHANGE_DETECTOR_REF_FACTORY(); };
- return ChangeDetectorRef;
- }());
- var SWITCH_CHANGE_DETECTOR_REF_FACTORY__PRE_R3__ = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- };
- var SWITCH_CHANGE_DETECTOR_REF_FACTORY = SWITCH_CHANGE_DETECTOR_REF_FACTORY__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Structural diffing for `Object`s and `Map`s.
- */
- var keyValDiff = [new DefaultKeyValueDifferFactory()];
- /**
- * Structural diffing for `Iterable` types such as `Array`s.
- */
- var iterableDiff = [new DefaultIterableDifferFactory()];
- var defaultIterableDiffers = new IterableDiffers(iterableDiff);
- var defaultKeyValueDiffers = new KeyValueDiffers(keyValDiff);
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Represents an embedded template that can be used to instantiate embedded views.
- * To instantiate embedded views based on a template, use the `ViewContainerRef`
- * method `createEmbeddedView()`.
- *
- * Access a `TemplateRef` instance by placing a directive on an `<ng-template>`
- * element (or directive prefixed with `*`). The `TemplateRef` for the embedded view
- * is injected into the constructor of the directive,
- * using the `TemplateRef` token.
- *
- * You can also use a `Query` to find a `TemplateRef` associated with
- * a component or a directive.
- *
- * @see `ViewContainerRef`
- * @see [Navigate the Component Tree with DI](guide/dependency-injection-navtree)
- *
- * @publicApi
- */
- var TemplateRef = /** @class */ (function () {
- function TemplateRef() {
- }
- /**
- * @internal
- * @nocollapse
- */
- TemplateRef.__NG_ELEMENT_ID__ = function () { return SWITCH_TEMPLATE_REF_FACTORY(TemplateRef, ElementRef); };
- return TemplateRef;
- }());
- var SWITCH_TEMPLATE_REF_FACTORY__PRE_R3__ = noop;
- var SWITCH_TEMPLATE_REF_FACTORY = SWITCH_TEMPLATE_REF_FACTORY__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Represents a container where one or more views can be attached to a component.
- *
- * Can contain *host views* (created by instantiating a
- * component with the `createComponent()` method), and *embedded views*
- * (created by instantiating a `TemplateRef` with the `createEmbeddedView()` method).
- *
- * A view container instance can contain other view containers,
- * creating a [view hierarchy](guide/glossary#view-tree).
- *
- * @see `ComponentRef`
- * @see `EmbeddedViewRef`
- *
- * @publicApi
- */
- var ViewContainerRef = /** @class */ (function () {
- function ViewContainerRef() {
- }
- /**
- * @internal
- * @nocollapse
- */
- ViewContainerRef.__NG_ELEMENT_ID__ = function () { return SWITCH_VIEW_CONTAINER_REF_FACTORY(ViewContainerRef, ElementRef); };
- return ViewContainerRef;
- }());
- var SWITCH_VIEW_CONTAINER_REF_FACTORY__PRE_R3__ = noop;
- var SWITCH_VIEW_CONTAINER_REF_FACTORY = SWITCH_VIEW_CONTAINER_REF_FACTORY__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function expressionChangedAfterItHasBeenCheckedError(context, oldValue, currValue, isFirstCheck) {
- var msg = "ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '" + oldValue + "'. Current value: '" + currValue + "'.";
- if (isFirstCheck) {
- msg +=
- " It seems like the view has been created after its parent and its children have been dirty checked." +
- " Has it been created in a change detection hook ?";
- }
- return viewDebugError(msg, context);
- }
- function viewWrappedDebugError(err, context) {
- if (!(err instanceof Error)) {
- // errors that are not Error instances don't have a stack,
- // so it is ok to wrap them into a new Error object...
- err = new Error(err.toString());
- }
- _addDebugContext(err, context);
- return err;
- }
- function viewDebugError(msg, context) {
- var err = new Error(msg);
- _addDebugContext(err, context);
- return err;
- }
- function _addDebugContext(err, context) {
- err[ERROR_DEBUG_CONTEXT] = context;
- err[ERROR_LOGGER] = context.logError.bind(context);
- }
- function isViewDebugError(err) {
- return !!getDebugContext(err);
- }
- function viewDestroyedError(action) {
- return new Error("ViewDestroyedError: Attempt to use a destroyed view: " + action);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // Called before each cycle of a view's check to detect whether this is in the
- // initState for which we need to call ngOnInit, ngAfterContentInit or ngAfterViewInit
- // lifecycle methods. Returns true if this check cycle should call lifecycle
- // methods.
- function shiftInitState(view, priorInitState, newInitState) {
- // Only update the InitState if we are currently in the prior state.
- // For example, only move into CallingInit if we are in BeforeInit. Only
- // move into CallingContentInit if we are in CallingInit. Normally this will
- // always be true because of how checkCycle is called in checkAndUpdateView.
- // However, if checkAndUpdateView is called recursively or if an exception is
- // thrown while checkAndUpdateView is running, checkAndUpdateView starts over
- // from the beginning. This ensures the state is monotonically increasing,
- // terminating in the AfterInit state, which ensures the Init methods are called
- // at least once and only once.
- var state = view.state;
- var initState = state & 1792 /* InitState_Mask */;
- if (initState === priorInitState) {
- view.state = (state & ~1792 /* InitState_Mask */) | newInitState;
- view.initIndex = -1;
- return true;
- }
- return initState === newInitState;
- }
- // Returns true if the lifecycle init method should be called for the node with
- // the given init index.
- function shouldCallLifecycleInitHook(view, initState, index) {
- if ((view.state & 1792 /* InitState_Mask */) === initState && view.initIndex <= index) {
- view.initIndex = index + 1;
- return true;
- }
- return false;
- }
- /**
- * Accessor for view.nodes, enforcing that every usage site stays monomorphic.
- */
- function asTextData(view, index) {
- return view.nodes[index];
- }
- /**
- * Accessor for view.nodes, enforcing that every usage site stays monomorphic.
- */
- function asElementData(view, index) {
- return view.nodes[index];
- }
- /**
- * Accessor for view.nodes, enforcing that every usage site stays monomorphic.
- */
- function asProviderData(view, index) {
- return view.nodes[index];
- }
- /**
- * Accessor for view.nodes, enforcing that every usage site stays monomorphic.
- */
- function asPureExpressionData(view, index) {
- return view.nodes[index];
- }
- /**
- * Accessor for view.nodes, enforcing that every usage site stays monomorphic.
- */
- function asQueryList(view, index) {
- return view.nodes[index];
- }
- /**
- * This object is used to prevent cycles in the source files and to have a place where
- * debug mode can hook it. It is lazily filled when `isDevMode` is known.
- */
- var Services = {
- setCurrentNode: undefined,
- createRootView: undefined,
- createEmbeddedView: undefined,
- createComponentView: undefined,
- createNgModuleRef: undefined,
- overrideProvider: undefined,
- overrideComponentView: undefined,
- clearOverrides: undefined,
- checkAndUpdateView: undefined,
- checkNoChangesView: undefined,
- destroyView: undefined,
- resolveDep: undefined,
- createDebugContext: undefined,
- handleEvent: undefined,
- updateDirectives: undefined,
- updateRenderer: undefined,
- dirtyParentQueries: undefined,
- };
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var NOOP = function () { };
- var _tokenKeyCache = new Map();
- function tokenKey(token) {
- var key = _tokenKeyCache.get(token);
- if (!key) {
- key = stringify$1(token) + '_' + _tokenKeyCache.size;
- _tokenKeyCache.set(token, key);
- }
- return key;
- }
- function checkBinding(view, def, bindingIdx, value) {
- var oldValues = view.oldValues;
- if ((view.state & 2 /* FirstCheck */) ||
- !looseIdentical(oldValues[def.bindingIndex + bindingIdx], value)) {
- return true;
- }
- return false;
- }
- function checkAndUpdateBinding(view, def, bindingIdx, value) {
- if (checkBinding(view, def, bindingIdx, value)) {
- view.oldValues[def.bindingIndex + bindingIdx] = value;
- return true;
- }
- return false;
- }
- function checkBindingNoChanges(view, def, bindingIdx, value) {
- var oldValue = view.oldValues[def.bindingIndex + bindingIdx];
- if ((view.state & 1 /* BeforeFirstCheck */) || !devModeEqual(oldValue, value)) {
- var bindingName = def.bindings[bindingIdx].name;
- throw expressionChangedAfterItHasBeenCheckedError(Services.createDebugContext(view, def.nodeIndex), bindingName + ": " + oldValue, bindingName + ": " + value, (view.state & 1 /* BeforeFirstCheck */) !== 0);
- }
- }
- function markParentViewsForCheck(view) {
- var currView = view;
- while (currView) {
- if (currView.def.flags & 2 /* OnPush */) {
- currView.state |= 8 /* ChecksEnabled */;
- }
- currView = currView.viewContainerParent || currView.parent;
- }
- }
- function markParentViewsForCheckProjectedViews(view, endView) {
- var currView = view;
- while (currView && currView !== endView) {
- currView.state |= 64 /* CheckProjectedViews */;
- currView = currView.viewContainerParent || currView.parent;
- }
- }
- function dispatchEvent(view, nodeIndex, eventName, event) {
- try {
- var nodeDef = view.def.nodes[nodeIndex];
- var startView = nodeDef.flags & 33554432 /* ComponentView */ ?
- asElementData(view, nodeIndex).componentView :
- view;
- markParentViewsForCheck(startView);
- return Services.handleEvent(view, nodeIndex, eventName, event);
- }
- catch (e) {
- // Attention: Don't rethrow, as it would cancel Observable subscriptions!
- view.root.errorHandler.handleError(e);
- }
- }
- function declaredViewContainer(view) {
- if (view.parent) {
- var parentView = view.parent;
- return asElementData(parentView, view.parentNodeDef.nodeIndex);
- }
- return null;
- }
- /**
- * for component views, this is the host element.
- * for embedded views, this is the index of the parent node
- * that contains the view container.
- */
- function viewParentEl(view) {
- var parentView = view.parent;
- if (parentView) {
- return view.parentNodeDef.parent;
- }
- else {
- return null;
- }
- }
- function renderNode(view, def) {
- switch (def.flags & 201347067 /* Types */) {
- case 1 /* TypeElement */:
- return asElementData(view, def.nodeIndex).renderElement;
- case 2 /* TypeText */:
- return asTextData(view, def.nodeIndex).renderText;
- }
- }
- function elementEventFullName(target, name) {
- return target ? target + ":" + name : name;
- }
- function isComponentView(view) {
- return !!view.parent && !!(view.parentNodeDef.flags & 32768 /* Component */);
- }
- function isEmbeddedView(view) {
- return !!view.parent && !(view.parentNodeDef.flags & 32768 /* Component */);
- }
- function splitDepsDsl(deps, sourceName) {
- return deps.map(function (value) {
- var _a;
- var token;
- var flags;
- if (Array.isArray(value)) {
- _a = __read(value, 2), flags = _a[0], token = _a[1];
- }
- else {
- flags = 0 /* None */;
- token = value;
- }
- if (token && (typeof token === 'function' || typeof token === 'object') && sourceName) {
- Object.defineProperty(token, SOURCE, { value: sourceName, configurable: true });
- }
- return { flags: flags, token: token, tokenKey: tokenKey(token) };
- });
- }
- function getParentRenderElement(view, renderHost, def) {
- var renderParent = def.renderParent;
- if (renderParent) {
- if ((renderParent.flags & 1 /* TypeElement */) === 0 ||
- (renderParent.flags & 33554432 /* ComponentView */) === 0 ||
- (renderParent.element.componentRendererType &&
- renderParent.element.componentRendererType.encapsulation ===
- ViewEncapsulation$1.Native)) {
- // only children of non components, or children of components with native encapsulation should
- // be attached.
- return asElementData(view, def.renderParent.nodeIndex).renderElement;
- }
- }
- else {
- return renderHost;
- }
- }
- var DEFINITION_CACHE = new WeakMap();
- function resolveDefinition(factory) {
- var value = DEFINITION_CACHE.get(factory);
- if (!value) {
- value = factory(function () { return NOOP; });
- value.factory = factory;
- DEFINITION_CACHE.set(factory, value);
- }
- return value;
- }
- function rootRenderNodes(view) {
- var renderNodes = [];
- visitRootRenderNodes(view, 0 /* Collect */, undefined, undefined, renderNodes);
- return renderNodes;
- }
- function visitRootRenderNodes(view, action, parentNode, nextSibling, target) {
- // We need to re-compute the parent node in case the nodes have been moved around manually
- if (action === 3 /* RemoveChild */) {
- parentNode = view.renderer.parentNode(renderNode(view, view.def.lastRenderRootNode));
- }
- visitSiblingRenderNodes(view, action, 0, view.def.nodes.length - 1, parentNode, nextSibling, target);
- }
- function visitSiblingRenderNodes(view, action, startIndex, endIndex, parentNode, nextSibling, target) {
- for (var i = startIndex; i <= endIndex; i++) {
- var nodeDef = view.def.nodes[i];
- if (nodeDef.flags & (1 /* TypeElement */ | 2 /* TypeText */ | 8 /* TypeNgContent */)) {
- visitRenderNode(view, nodeDef, action, parentNode, nextSibling, target);
- }
- // jump to next sibling
- i += nodeDef.childCount;
- }
- }
- function visitProjectedRenderNodes(view, ngContentIndex, action, parentNode, nextSibling, target) {
- var compView = view;
- while (compView && !isComponentView(compView)) {
- compView = compView.parent;
- }
- var hostView = compView.parent;
- var hostElDef = viewParentEl(compView);
- var startIndex = hostElDef.nodeIndex + 1;
- var endIndex = hostElDef.nodeIndex + hostElDef.childCount;
- for (var i = startIndex; i <= endIndex; i++) {
- var nodeDef = hostView.def.nodes[i];
- if (nodeDef.ngContentIndex === ngContentIndex) {
- visitRenderNode(hostView, nodeDef, action, parentNode, nextSibling, target);
- }
- // jump to next sibling
- i += nodeDef.childCount;
- }
- if (!hostView.parent) {
- // a root view
- var projectedNodes = view.root.projectableNodes[ngContentIndex];
- if (projectedNodes) {
- for (var i = 0; i < projectedNodes.length; i++) {
- execRenderNodeAction(view, projectedNodes[i], action, parentNode, nextSibling, target);
- }
- }
- }
- }
- function visitRenderNode(view, nodeDef, action, parentNode, nextSibling, target) {
- if (nodeDef.flags & 8 /* TypeNgContent */) {
- visitProjectedRenderNodes(view, nodeDef.ngContent.index, action, parentNode, nextSibling, target);
- }
- else {
- var rn = renderNode(view, nodeDef);
- if (action === 3 /* RemoveChild */ && (nodeDef.flags & 33554432 /* ComponentView */) &&
- (nodeDef.bindingFlags & 48 /* CatSyntheticProperty */)) {
- // Note: we might need to do both actions.
- if (nodeDef.bindingFlags & (16 /* SyntheticProperty */)) {
- execRenderNodeAction(view, rn, action, parentNode, nextSibling, target);
- }
- if (nodeDef.bindingFlags & (32 /* SyntheticHostProperty */)) {
- var compView = asElementData(view, nodeDef.nodeIndex).componentView;
- execRenderNodeAction(compView, rn, action, parentNode, nextSibling, target);
- }
- }
- else {
- execRenderNodeAction(view, rn, action, parentNode, nextSibling, target);
- }
- if (nodeDef.flags & 16777216 /* EmbeddedViews */) {
- var embeddedViews = asElementData(view, nodeDef.nodeIndex).viewContainer._embeddedViews;
- for (var k = 0; k < embeddedViews.length; k++) {
- visitRootRenderNodes(embeddedViews[k], action, parentNode, nextSibling, target);
- }
- }
- if (nodeDef.flags & 1 /* TypeElement */ && !nodeDef.element.name) {
- visitSiblingRenderNodes(view, action, nodeDef.nodeIndex + 1, nodeDef.nodeIndex + nodeDef.childCount, parentNode, nextSibling, target);
- }
- }
- }
- function execRenderNodeAction(view, renderNode, action, parentNode, nextSibling, target) {
- var renderer = view.renderer;
- switch (action) {
- case 1 /* AppendChild */:
- renderer.appendChild(parentNode, renderNode);
- break;
- case 2 /* InsertBefore */:
- renderer.insertBefore(parentNode, renderNode, nextSibling);
- break;
- case 3 /* RemoveChild */:
- renderer.removeChild(parentNode, renderNode);
- break;
- case 0 /* Collect */:
- target.push(renderNode);
- break;
- }
- }
- var NS_PREFIX_RE = /^:([^:]+):(.+)$/;
- function splitNamespace(name) {
- if (name[0] === ':') {
- var match = name.match(NS_PREFIX_RE);
- return [match[1], match[2]];
- }
- return ['', name];
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var UNDEFINED_VALUE = new Object();
- var InjectorRefTokenKey = tokenKey(Injector);
- var INJECTORRefTokenKey = tokenKey(INJECTOR);
- var NgModuleRefTokenKey = tokenKey(NgModuleRef);
- function initNgModule(data) {
- var def = data._def;
- var providers = data._providers = new Array(def.providers.length);
- for (var i = 0; i < def.providers.length; i++) {
- var provDef = def.providers[i];
- if (!(provDef.flags & 4096 /* LazyProvider */)) {
- // Make sure the provider has not been already initialized outside this loop.
- if (providers[i] === undefined) {
- providers[i] = _createProviderInstance(data, provDef);
- }
- }
- }
- }
- function resolveNgModuleDep(data, depDef, notFoundValue) {
- if (notFoundValue === void 0) { notFoundValue = Injector.THROW_IF_NOT_FOUND; }
- var former = setCurrentInjector(data);
- try {
- if (depDef.flags & 8 /* Value */) {
- return depDef.token;
- }
- if (depDef.flags & 2 /* Optional */) {
- notFoundValue = null;
- }
- if (depDef.flags & 1 /* SkipSelf */) {
- return data._parent.get(depDef.token, notFoundValue);
- }
- var tokenKey_1 = depDef.tokenKey;
- switch (tokenKey_1) {
- case InjectorRefTokenKey:
- case INJECTORRefTokenKey:
- case NgModuleRefTokenKey:
- return data;
- }
- var providerDef = data._def.providersByKey[tokenKey_1];
- var injectableDef = void 0;
- if (providerDef) {
- var providerInstance = data._providers[providerDef.index];
- if (providerInstance === undefined) {
- providerInstance = data._providers[providerDef.index] =
- _createProviderInstance(data, providerDef);
- }
- return providerInstance === UNDEFINED_VALUE ? undefined : providerInstance;
- }
- else if ((injectableDef = getInjectableDef(depDef.token)) && targetsModule(data, injectableDef)) {
- var index = data._providers.length;
- data._def.providers[index] = data._def.providersByKey[depDef.tokenKey] = {
- flags: 1024 /* TypeFactoryProvider */ | 4096 /* LazyProvider */,
- value: injectableDef.factory,
- deps: [], index: index,
- token: depDef.token,
- };
- data._providers[index] = UNDEFINED_VALUE;
- return (data._providers[index] =
- _createProviderInstance(data, data._def.providersByKey[depDef.tokenKey]));
- }
- else if (depDef.flags & 4 /* Self */) {
- return notFoundValue;
- }
- return data._parent.get(depDef.token, notFoundValue);
- }
- finally {
- setCurrentInjector(former);
- }
- }
- function moduleTransitivelyPresent(ngModule, scope) {
- return ngModule._def.modules.indexOf(scope) > -1;
- }
- function targetsModule(ngModule, def) {
- return def.providedIn != null && (moduleTransitivelyPresent(ngModule, def.providedIn) ||
- def.providedIn === 'root' && ngModule._def.isRoot);
- }
- function _createProviderInstance(ngModule, providerDef) {
- var injectable;
- switch (providerDef.flags & 201347067 /* Types */) {
- case 512 /* TypeClassProvider */:
- injectable = _createClass(ngModule, providerDef.value, providerDef.deps);
- break;
- case 1024 /* TypeFactoryProvider */:
- injectable = _callFactory(ngModule, providerDef.value, providerDef.deps);
- break;
- case 2048 /* TypeUseExistingProvider */:
- injectable = resolveNgModuleDep(ngModule, providerDef.deps[0]);
- break;
- case 256 /* TypeValueProvider */:
- injectable = providerDef.value;
- break;
- }
- // The read of `ngOnDestroy` here is slightly expensive as it's megamorphic, so it should be
- // avoided if possible. The sequence of checks here determines whether ngOnDestroy needs to be
- // checked. It might not if the `injectable` isn't an object or if NodeFlags.OnDestroy is already
- // set (ngOnDestroy was detected statically).
- if (injectable !== UNDEFINED_VALUE && injectable !== null && typeof injectable === 'object' &&
- !(providerDef.flags & 131072 /* OnDestroy */) && typeof injectable.ngOnDestroy === 'function') {
- providerDef.flags |= 131072 /* OnDestroy */;
- }
- return injectable === undefined ? UNDEFINED_VALUE : injectable;
- }
- function _createClass(ngModule, ctor, deps) {
- var len = deps.length;
- switch (len) {
- case 0:
- return new ctor();
- case 1:
- return new ctor(resolveNgModuleDep(ngModule, deps[0]));
- case 2:
- return new ctor(resolveNgModuleDep(ngModule, deps[0]), resolveNgModuleDep(ngModule, deps[1]));
- case 3:
- return new ctor(resolveNgModuleDep(ngModule, deps[0]), resolveNgModuleDep(ngModule, deps[1]), resolveNgModuleDep(ngModule, deps[2]));
- default:
- var depValues = new Array(len);
- for (var i = 0; i < len; i++) {
- depValues[i] = resolveNgModuleDep(ngModule, deps[i]);
- }
- return new (ctor.bind.apply(ctor, __spread([void 0], depValues)))();
- }
- }
- function _callFactory(ngModule, factory, deps) {
- var len = deps.length;
- switch (len) {
- case 0:
- return factory();
- case 1:
- return factory(resolveNgModuleDep(ngModule, deps[0]));
- case 2:
- return factory(resolveNgModuleDep(ngModule, deps[0]), resolveNgModuleDep(ngModule, deps[1]));
- case 3:
- return factory(resolveNgModuleDep(ngModule, deps[0]), resolveNgModuleDep(ngModule, deps[1]), resolveNgModuleDep(ngModule, deps[2]));
- default:
- var depValues = Array(len);
- for (var i = 0; i < len; i++) {
- depValues[i] = resolveNgModuleDep(ngModule, deps[i]);
- }
- return factory.apply(void 0, __spread(depValues));
- }
- }
- function callNgModuleLifecycle(ngModule, lifecycles) {
- var def = ngModule._def;
- var destroyed = new Set();
- for (var i = 0; i < def.providers.length; i++) {
- var provDef = def.providers[i];
- if (provDef.flags & 131072 /* OnDestroy */) {
- var instance = ngModule._providers[i];
- if (instance && instance !== UNDEFINED_VALUE) {
- var onDestroy = instance.ngOnDestroy;
- if (typeof onDestroy === 'function' && !destroyed.has(instance)) {
- onDestroy.apply(instance);
- destroyed.add(instance);
- }
- }
- }
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function attachEmbeddedView(parentView, elementData, viewIndex, view) {
- var embeddedViews = elementData.viewContainer._embeddedViews;
- if (viewIndex === null || viewIndex === undefined) {
- viewIndex = embeddedViews.length;
- }
- view.viewContainerParent = parentView;
- addToArray(embeddedViews, viewIndex, view);
- attachProjectedView(elementData, view);
- Services.dirtyParentQueries(view);
- var prevView = viewIndex > 0 ? embeddedViews[viewIndex - 1] : null;
- renderAttachEmbeddedView(elementData, prevView, view);
- }
- function attachProjectedView(vcElementData, view) {
- var dvcElementData = declaredViewContainer(view);
- if (!dvcElementData || dvcElementData === vcElementData ||
- view.state & 16 /* IsProjectedView */) {
- return;
- }
- // Note: For performance reasons, we
- // - add a view to template._projectedViews only 1x throughout its lifetime,
- // and remove it not until the view is destroyed.
- // (hard, as when a parent view is attached/detached we would need to attach/detach all
- // nested projected views as well, even across component boundaries).
- // - don't track the insertion order of views in the projected views array
- // (hard, as when the views of the same template are inserted different view containers)
- view.state |= 16 /* IsProjectedView */;
- var projectedViews = dvcElementData.template._projectedViews;
- if (!projectedViews) {
- projectedViews = dvcElementData.template._projectedViews = [];
- }
- projectedViews.push(view);
- // Note: we are changing the NodeDef here as we cannot calculate
- // the fact whether a template is used for projection during compilation.
- markNodeAsProjectedTemplate(view.parent.def, view.parentNodeDef);
- }
- function markNodeAsProjectedTemplate(viewDef, nodeDef) {
- if (nodeDef.flags & 4 /* ProjectedTemplate */) {
- return;
- }
- viewDef.nodeFlags |= 4 /* ProjectedTemplate */;
- nodeDef.flags |= 4 /* ProjectedTemplate */;
- var parentNodeDef = nodeDef.parent;
- while (parentNodeDef) {
- parentNodeDef.childFlags |= 4 /* ProjectedTemplate */;
- parentNodeDef = parentNodeDef.parent;
- }
- }
- function detachEmbeddedView(elementData, viewIndex) {
- var embeddedViews = elementData.viewContainer._embeddedViews;
- if (viewIndex == null || viewIndex >= embeddedViews.length) {
- viewIndex = embeddedViews.length - 1;
- }
- if (viewIndex < 0) {
- return null;
- }
- var view = embeddedViews[viewIndex];
- view.viewContainerParent = null;
- removeFromArray(embeddedViews, viewIndex);
- // See attachProjectedView for why we don't update projectedViews here.
- Services.dirtyParentQueries(view);
- renderDetachView$1(view);
- return view;
- }
- function detachProjectedView(view) {
- if (!(view.state & 16 /* IsProjectedView */)) {
- return;
- }
- var dvcElementData = declaredViewContainer(view);
- if (dvcElementData) {
- var projectedViews = dvcElementData.template._projectedViews;
- if (projectedViews) {
- removeFromArray(projectedViews, projectedViews.indexOf(view));
- Services.dirtyParentQueries(view);
- }
- }
- }
- function moveEmbeddedView(elementData, oldViewIndex, newViewIndex) {
- var embeddedViews = elementData.viewContainer._embeddedViews;
- var view = embeddedViews[oldViewIndex];
- removeFromArray(embeddedViews, oldViewIndex);
- if (newViewIndex == null) {
- newViewIndex = embeddedViews.length;
- }
- addToArray(embeddedViews, newViewIndex, view);
- // Note: Don't need to change projectedViews as the order in there
- // as always invalid...
- Services.dirtyParentQueries(view);
- renderDetachView$1(view);
- var prevView = newViewIndex > 0 ? embeddedViews[newViewIndex - 1] : null;
- renderAttachEmbeddedView(elementData, prevView, view);
- return view;
- }
- function renderAttachEmbeddedView(elementData, prevView, view) {
- var prevRenderNode = prevView ? renderNode(prevView, prevView.def.lastRenderRootNode) :
- elementData.renderElement;
- var parentNode = view.renderer.parentNode(prevRenderNode);
- var nextSibling = view.renderer.nextSibling(prevRenderNode);
- // Note: We can't check if `nextSibling` is present, as on WebWorkers it will always be!
- // However, browsers automatically do `appendChild` when there is no `nextSibling`.
- visitRootRenderNodes(view, 2 /* InsertBefore */, parentNode, nextSibling, undefined);
- }
- function renderDetachView$1(view) {
- visitRootRenderNodes(view, 3 /* RemoveChild */, null, null, undefined);
- }
- function addToArray(arr, index, value) {
- // perf: array.push is faster than array.splice!
- if (index >= arr.length) {
- arr.push(value);
- }
- else {
- arr.splice(index, 0, value);
- }
- }
- function removeFromArray(arr, index) {
- // perf: array.pop is faster than array.splice!
- if (index >= arr.length - 1) {
- arr.pop();
- }
- else {
- arr.splice(index, 1);
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var EMPTY_CONTEXT = new Object();
- function getComponentViewDefinitionFactory(componentFactory) {
- return componentFactory.viewDefFactory;
- }
- var ComponentFactory_ = /** @class */ (function (_super) {
- __extends(ComponentFactory_, _super);
- function ComponentFactory_(selector, componentType, viewDefFactory, _inputs, _outputs, ngContentSelectors) {
- var _this =
- // Attention: this ctor is called as top level function.
- // Putting any logic in here will destroy closure tree shaking!
- _super.call(this) || this;
- _this.selector = selector;
- _this.componentType = componentType;
- _this._inputs = _inputs;
- _this._outputs = _outputs;
- _this.ngContentSelectors = ngContentSelectors;
- _this.viewDefFactory = viewDefFactory;
- return _this;
- }
- Object.defineProperty(ComponentFactory_.prototype, "inputs", {
- get: function () {
- var inputsArr = [];
- var inputs = this._inputs;
- for (var propName in inputs) {
- var templateName = inputs[propName];
- inputsArr.push({ propName: propName, templateName: templateName });
- }
- return inputsArr;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ComponentFactory_.prototype, "outputs", {
- get: function () {
- var outputsArr = [];
- for (var propName in this._outputs) {
- var templateName = this._outputs[propName];
- outputsArr.push({ propName: propName, templateName: templateName });
- }
- return outputsArr;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * Creates a new component.
- */
- ComponentFactory_.prototype.create = function (injector, projectableNodes, rootSelectorOrNode, ngModule) {
- if (!ngModule) {
- throw new Error('ngModule should be provided');
- }
- var viewDef = resolveDefinition(this.viewDefFactory);
- var componentNodeIndex = viewDef.nodes[0].element.componentProvider.nodeIndex;
- var view = Services.createRootView(injector, projectableNodes || [], rootSelectorOrNode, viewDef, ngModule, EMPTY_CONTEXT);
- var component = asProviderData(view, componentNodeIndex).instance;
- if (rootSelectorOrNode) {
- view.renderer.setAttribute(asElementData(view, 0).renderElement, 'ng-version', VERSION$2.full);
- }
- return new ComponentRef_(view, new ViewRef_(view), component);
- };
- return ComponentFactory_;
- }(ComponentFactory));
- var ComponentRef_ = /** @class */ (function (_super) {
- __extends(ComponentRef_, _super);
- function ComponentRef_(_view, _viewRef, _component) {
- var _this = _super.call(this) || this;
- _this._view = _view;
- _this._viewRef = _viewRef;
- _this._component = _component;
- _this._elDef = _this._view.def.nodes[0];
- _this.hostView = _viewRef;
- _this.changeDetectorRef = _viewRef;
- _this.instance = _component;
- return _this;
- }
- Object.defineProperty(ComponentRef_.prototype, "location", {
- get: function () {
- return new ElementRef(asElementData(this._view, this._elDef.nodeIndex).renderElement);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ComponentRef_.prototype, "injector", {
- get: function () { return new Injector_(this._view, this._elDef); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ComponentRef_.prototype, "componentType", {
- get: function () { return this._component.constructor; },
- enumerable: true,
- configurable: true
- });
- ComponentRef_.prototype.destroy = function () { this._viewRef.destroy(); };
- ComponentRef_.prototype.onDestroy = function (callback) { this._viewRef.onDestroy(callback); };
- return ComponentRef_;
- }(ComponentRef));
- function createViewContainerData(view, elDef, elData) {
- return new ViewContainerRef_(view, elDef, elData);
- }
- var ViewContainerRef_ = /** @class */ (function () {
- function ViewContainerRef_(_view, _elDef, _data) {
- this._view = _view;
- this._elDef = _elDef;
- this._data = _data;
- /**
- * @internal
- */
- this._embeddedViews = [];
- }
- Object.defineProperty(ViewContainerRef_.prototype, "element", {
- get: function () { return new ElementRef(this._data.renderElement); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ViewContainerRef_.prototype, "injector", {
- get: function () { return new Injector_(this._view, this._elDef); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ViewContainerRef_.prototype, "parentInjector", {
- /** @deprecated No replacement */
- get: function () {
- var view = this._view;
- var elDef = this._elDef.parent;
- while (!elDef && view) {
- elDef = viewParentEl(view);
- view = view.parent;
- }
- return view ? new Injector_(view, elDef) : new Injector_(this._view, null);
- },
- enumerable: true,
- configurable: true
- });
- ViewContainerRef_.prototype.clear = function () {
- var len = this._embeddedViews.length;
- for (var i = len - 1; i >= 0; i--) {
- var view = detachEmbeddedView(this._data, i);
- Services.destroyView(view);
- }
- };
- ViewContainerRef_.prototype.get = function (index) {
- var view = this._embeddedViews[index];
- if (view) {
- var ref = new ViewRef_(view);
- ref.attachToViewContainerRef(this);
- return ref;
- }
- return null;
- };
- Object.defineProperty(ViewContainerRef_.prototype, "length", {
- get: function () { return this._embeddedViews.length; },
- enumerable: true,
- configurable: true
- });
- ViewContainerRef_.prototype.createEmbeddedView = function (templateRef, context, index) {
- var viewRef = templateRef.createEmbeddedView(context || {});
- this.insert(viewRef, index);
- return viewRef;
- };
- ViewContainerRef_.prototype.createComponent = function (componentFactory, index, injector, projectableNodes, ngModuleRef) {
- var contextInjector = injector || this.parentInjector;
- if (!ngModuleRef && !(componentFactory instanceof ComponentFactoryBoundToModule)) {
- ngModuleRef = contextInjector.get(NgModuleRef);
- }
- var componentRef = componentFactory.create(contextInjector, projectableNodes, undefined, ngModuleRef);
- this.insert(componentRef.hostView, index);
- return componentRef;
- };
- ViewContainerRef_.prototype.insert = function (viewRef, index) {
- if (viewRef.destroyed) {
- throw new Error('Cannot insert a destroyed View in a ViewContainer!');
- }
- var viewRef_ = viewRef;
- var viewData = viewRef_._view;
- attachEmbeddedView(this._view, this._data, index, viewData);
- viewRef_.attachToViewContainerRef(this);
- return viewRef;
- };
- ViewContainerRef_.prototype.move = function (viewRef, currentIndex) {
- if (viewRef.destroyed) {
- throw new Error('Cannot move a destroyed View in a ViewContainer!');
- }
- var previousIndex = this._embeddedViews.indexOf(viewRef._view);
- moveEmbeddedView(this._data, previousIndex, currentIndex);
- return viewRef;
- };
- ViewContainerRef_.prototype.indexOf = function (viewRef) {
- return this._embeddedViews.indexOf(viewRef._view);
- };
- ViewContainerRef_.prototype.remove = function (index) {
- var viewData = detachEmbeddedView(this._data, index);
- if (viewData) {
- Services.destroyView(viewData);
- }
- };
- ViewContainerRef_.prototype.detach = function (index) {
- var view = detachEmbeddedView(this._data, index);
- return view ? new ViewRef_(view) : null;
- };
- return ViewContainerRef_;
- }());
- function createChangeDetectorRef(view) {
- return new ViewRef_(view);
- }
- var ViewRef_ = /** @class */ (function () {
- function ViewRef_(_view) {
- this._view = _view;
- this._viewContainerRef = null;
- this._appRef = null;
- }
- Object.defineProperty(ViewRef_.prototype, "rootNodes", {
- get: function () { return rootRenderNodes(this._view); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ViewRef_.prototype, "context", {
- get: function () { return this._view.context; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ViewRef_.prototype, "destroyed", {
- get: function () { return (this._view.state & 128 /* Destroyed */) !== 0; },
- enumerable: true,
- configurable: true
- });
- ViewRef_.prototype.markForCheck = function () { markParentViewsForCheck(this._view); };
- ViewRef_.prototype.detach = function () { this._view.state &= ~4 /* Attached */; };
- ViewRef_.prototype.detectChanges = function () {
- var fs = this._view.root.rendererFactory;
- if (fs.begin) {
- fs.begin();
- }
- try {
- Services.checkAndUpdateView(this._view);
- }
- finally {
- if (fs.end) {
- fs.end();
- }
- }
- };
- ViewRef_.prototype.checkNoChanges = function () { Services.checkNoChangesView(this._view); };
- ViewRef_.prototype.reattach = function () { this._view.state |= 4 /* Attached */; };
- ViewRef_.prototype.onDestroy = function (callback) {
- if (!this._view.disposables) {
- this._view.disposables = [];
- }
- this._view.disposables.push(callback);
- };
- ViewRef_.prototype.destroy = function () {
- if (this._appRef) {
- this._appRef.detachView(this);
- }
- else if (this._viewContainerRef) {
- this._viewContainerRef.detach(this._viewContainerRef.indexOf(this));
- }
- Services.destroyView(this._view);
- };
- ViewRef_.prototype.detachFromAppRef = function () {
- this._appRef = null;
- renderDetachView$1(this._view);
- Services.dirtyParentQueries(this._view);
- };
- ViewRef_.prototype.attachToAppRef = function (appRef) {
- if (this._viewContainerRef) {
- throw new Error('This view is already attached to a ViewContainer!');
- }
- this._appRef = appRef;
- };
- ViewRef_.prototype.attachToViewContainerRef = function (vcRef) {
- if (this._appRef) {
- throw new Error('This view is already attached directly to the ApplicationRef!');
- }
- this._viewContainerRef = vcRef;
- };
- return ViewRef_;
- }());
- function createTemplateData(view, def) {
- return new TemplateRef_(view, def);
- }
- var TemplateRef_ = /** @class */ (function (_super) {
- __extends(TemplateRef_, _super);
- function TemplateRef_(_parentView, _def) {
- var _this = _super.call(this) || this;
- _this._parentView = _parentView;
- _this._def = _def;
- return _this;
- }
- TemplateRef_.prototype.createEmbeddedView = function (context) {
- return new ViewRef_(Services.createEmbeddedView(this._parentView, this._def, this._def.element.template, context));
- };
- Object.defineProperty(TemplateRef_.prototype, "elementRef", {
- get: function () {
- return new ElementRef(asElementData(this._parentView, this._def.nodeIndex).renderElement);
- },
- enumerable: true,
- configurable: true
- });
- return TemplateRef_;
- }(TemplateRef));
- function createInjector$1(view, elDef) {
- return new Injector_(view, elDef);
- }
- var Injector_ = /** @class */ (function () {
- function Injector_(view, elDef) {
- this.view = view;
- this.elDef = elDef;
- }
- Injector_.prototype.get = function (token, notFoundValue) {
- if (notFoundValue === void 0) { notFoundValue = Injector.THROW_IF_NOT_FOUND; }
- var allowPrivateServices = this.elDef ? (this.elDef.flags & 33554432 /* ComponentView */) !== 0 : false;
- return Services.resolveDep(this.view, this.elDef, allowPrivateServices, { flags: 0 /* None */, token: token, tokenKey: tokenKey(token) }, notFoundValue);
- };
- return Injector_;
- }());
- function createRendererV1(view) {
- return new RendererAdapter(view.renderer);
- }
- var RendererAdapter = /** @class */ (function () {
- function RendererAdapter(delegate) {
- this.delegate = delegate;
- }
- RendererAdapter.prototype.selectRootElement = function (selectorOrNode) {
- return this.delegate.selectRootElement(selectorOrNode);
- };
- RendererAdapter.prototype.createElement = function (parent, namespaceAndName) {
- var _a = __read(splitNamespace(namespaceAndName), 2), ns = _a[0], name = _a[1];
- var el = this.delegate.createElement(name, ns);
- if (parent) {
- this.delegate.appendChild(parent, el);
- }
- return el;
- };
- RendererAdapter.prototype.createViewRoot = function (hostElement) { return hostElement; };
- RendererAdapter.prototype.createTemplateAnchor = function (parentElement) {
- var comment = this.delegate.createComment('');
- if (parentElement) {
- this.delegate.appendChild(parentElement, comment);
- }
- return comment;
- };
- RendererAdapter.prototype.createText = function (parentElement, value) {
- var node = this.delegate.createText(value);
- if (parentElement) {
- this.delegate.appendChild(parentElement, node);
- }
- return node;
- };
- RendererAdapter.prototype.projectNodes = function (parentElement, nodes) {
- for (var i = 0; i < nodes.length; i++) {
- this.delegate.appendChild(parentElement, nodes[i]);
- }
- };
- RendererAdapter.prototype.attachViewAfter = function (node, viewRootNodes) {
- var parentElement = this.delegate.parentNode(node);
- var nextSibling = this.delegate.nextSibling(node);
- for (var i = 0; i < viewRootNodes.length; i++) {
- this.delegate.insertBefore(parentElement, viewRootNodes[i], nextSibling);
- }
- };
- RendererAdapter.prototype.detachView = function (viewRootNodes) {
- for (var i = 0; i < viewRootNodes.length; i++) {
- var node = viewRootNodes[i];
- var parentElement = this.delegate.parentNode(node);
- this.delegate.removeChild(parentElement, node);
- }
- };
- RendererAdapter.prototype.destroyView = function (hostElement, viewAllNodes) {
- for (var i = 0; i < viewAllNodes.length; i++) {
- this.delegate.destroyNode(viewAllNodes[i]);
- }
- };
- RendererAdapter.prototype.listen = function (renderElement, name, callback) {
- return this.delegate.listen(renderElement, name, callback);
- };
- RendererAdapter.prototype.listenGlobal = function (target, name, callback) {
- return this.delegate.listen(target, name, callback);
- };
- RendererAdapter.prototype.setElementProperty = function (renderElement, propertyName, propertyValue) {
- this.delegate.setProperty(renderElement, propertyName, propertyValue);
- };
- RendererAdapter.prototype.setElementAttribute = function (renderElement, namespaceAndName, attributeValue) {
- var _a = __read(splitNamespace(namespaceAndName), 2), ns = _a[0], name = _a[1];
- if (attributeValue != null) {
- this.delegate.setAttribute(renderElement, name, attributeValue, ns);
- }
- else {
- this.delegate.removeAttribute(renderElement, name, ns);
- }
- };
- RendererAdapter.prototype.setBindingDebugInfo = function (renderElement, propertyName, propertyValue) { };
- RendererAdapter.prototype.setElementClass = function (renderElement, className, isAdd) {
- if (isAdd) {
- this.delegate.addClass(renderElement, className);
- }
- else {
- this.delegate.removeClass(renderElement, className);
- }
- };
- RendererAdapter.prototype.setElementStyle = function (renderElement, styleName, styleValue) {
- if (styleValue != null) {
- this.delegate.setStyle(renderElement, styleName, styleValue);
- }
- else {
- this.delegate.removeStyle(renderElement, styleName);
- }
- };
- RendererAdapter.prototype.invokeElementMethod = function (renderElement, methodName, args) {
- renderElement[methodName].apply(renderElement, args);
- };
- RendererAdapter.prototype.setText = function (renderNode, text) { this.delegate.setValue(renderNode, text); };
- RendererAdapter.prototype.animate = function () { throw new Error('Renderer.animate is no longer supported!'); };
- return RendererAdapter;
- }());
- function createNgModuleRef(moduleType, parent, bootstrapComponents, def) {
- return new NgModuleRef_(moduleType, parent, bootstrapComponents, def);
- }
- var NgModuleRef_ = /** @class */ (function () {
- function NgModuleRef_(_moduleType, _parent, _bootstrapComponents, _def) {
- this._moduleType = _moduleType;
- this._parent = _parent;
- this._bootstrapComponents = _bootstrapComponents;
- this._def = _def;
- this._destroyListeners = [];
- this._destroyed = false;
- this.injector = this;
- initNgModule(this);
- }
- NgModuleRef_.prototype.get = function (token, notFoundValue, injectFlags) {
- if (notFoundValue === void 0) { notFoundValue = Injector.THROW_IF_NOT_FOUND; }
- if (injectFlags === void 0) { injectFlags = InjectFlags.Default; }
- var flags = 0 /* None */;
- if (injectFlags & InjectFlags.SkipSelf) {
- flags |= 1 /* SkipSelf */;
- }
- else if (injectFlags & InjectFlags.Self) {
- flags |= 4 /* Self */;
- }
- return resolveNgModuleDep(this, { token: token, tokenKey: tokenKey(token), flags: flags }, notFoundValue);
- };
- Object.defineProperty(NgModuleRef_.prototype, "instance", {
- get: function () { return this.get(this._moduleType); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(NgModuleRef_.prototype, "componentFactoryResolver", {
- get: function () { return this.get(ComponentFactoryResolver); },
- enumerable: true,
- configurable: true
- });
- NgModuleRef_.prototype.destroy = function () {
- if (this._destroyed) {
- throw new Error("The ng module " + stringify$1(this.instance.constructor) + " has already been destroyed.");
- }
- this._destroyed = true;
- callNgModuleLifecycle(this, 131072 /* OnDestroy */);
- this._destroyListeners.forEach(function (listener) { return listener(); });
- };
- NgModuleRef_.prototype.onDestroy = function (callback) { this._destroyListeners.push(callback); };
- return NgModuleRef_;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var RendererV1TokenKey = tokenKey(Renderer);
- var Renderer2TokenKey = tokenKey(Renderer2);
- var ElementRefTokenKey = tokenKey(ElementRef);
- var ViewContainerRefTokenKey = tokenKey(ViewContainerRef);
- var TemplateRefTokenKey = tokenKey(TemplateRef);
- var ChangeDetectorRefTokenKey = tokenKey(ChangeDetectorRef);
- var InjectorRefTokenKey$1 = tokenKey(Injector);
- var INJECTORRefTokenKey$1 = tokenKey(INJECTOR);
- function createProviderInstance(view, def) {
- return _createProviderInstance$1(view, def);
- }
- function createPipeInstance(view, def) {
- // deps are looked up from component.
- var compView = view;
- while (compView.parent && !isComponentView(compView)) {
- compView = compView.parent;
- }
- // pipes can see the private services of the component
- var allowPrivateServices = true;
- // pipes are always eager and classes!
- return createClass(compView.parent, viewParentEl(compView), allowPrivateServices, def.provider.value, def.provider.deps);
- }
- function createDirectiveInstance(view, def) {
- // components can see other private services, other directives can't.
- var allowPrivateServices = (def.flags & 32768 /* Component */) > 0;
- // directives are always eager and classes!
- var instance = createClass(view, def.parent, allowPrivateServices, def.provider.value, def.provider.deps);
- if (def.outputs.length) {
- for (var i = 0; i < def.outputs.length; i++) {
- var output = def.outputs[i];
- var outputObservable = instance[output.propName];
- if (isObservable(outputObservable)) {
- var subscription = outputObservable.subscribe(eventHandlerClosure(view, def.parent.nodeIndex, output.eventName));
- view.disposables[def.outputIndex + i] = subscription.unsubscribe.bind(subscription);
- }
- else {
- throw new Error("@Output " + output.propName + " not initialized in '" + instance.constructor.name + "'.");
- }
- }
- }
- return instance;
- }
- function eventHandlerClosure(view, index, eventName) {
- return function (event) { return dispatchEvent(view, index, eventName, event); };
- }
- function checkAndUpdateDirectiveInline(view, def, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- var providerData = asProviderData(view, def.nodeIndex);
- var directive = providerData.instance;
- var changed = false;
- var changes = undefined;
- var bindLen = def.bindings.length;
- if (bindLen > 0 && checkBinding(view, def, 0, v0)) {
- changed = true;
- changes = updateProp(view, providerData, def, 0, v0, changes);
- }
- if (bindLen > 1 && checkBinding(view, def, 1, v1)) {
- changed = true;
- changes = updateProp(view, providerData, def, 1, v1, changes);
- }
- if (bindLen > 2 && checkBinding(view, def, 2, v2)) {
- changed = true;
- changes = updateProp(view, providerData, def, 2, v2, changes);
- }
- if (bindLen > 3 && checkBinding(view, def, 3, v3)) {
- changed = true;
- changes = updateProp(view, providerData, def, 3, v3, changes);
- }
- if (bindLen > 4 && checkBinding(view, def, 4, v4)) {
- changed = true;
- changes = updateProp(view, providerData, def, 4, v4, changes);
- }
- if (bindLen > 5 && checkBinding(view, def, 5, v5)) {
- changed = true;
- changes = updateProp(view, providerData, def, 5, v5, changes);
- }
- if (bindLen > 6 && checkBinding(view, def, 6, v6)) {
- changed = true;
- changes = updateProp(view, providerData, def, 6, v6, changes);
- }
- if (bindLen > 7 && checkBinding(view, def, 7, v7)) {
- changed = true;
- changes = updateProp(view, providerData, def, 7, v7, changes);
- }
- if (bindLen > 8 && checkBinding(view, def, 8, v8)) {
- changed = true;
- changes = updateProp(view, providerData, def, 8, v8, changes);
- }
- if (bindLen > 9 && checkBinding(view, def, 9, v9)) {
- changed = true;
- changes = updateProp(view, providerData, def, 9, v9, changes);
- }
- if (changes) {
- directive.ngOnChanges(changes);
- }
- if ((def.flags & 65536 /* OnInit */) &&
- shouldCallLifecycleInitHook(view, 256 /* InitState_CallingOnInit */, def.nodeIndex)) {
- directive.ngOnInit();
- }
- if (def.flags & 262144 /* DoCheck */) {
- directive.ngDoCheck();
- }
- return changed;
- }
- function checkAndUpdateDirectiveDynamic(view, def, values) {
- var providerData = asProviderData(view, def.nodeIndex);
- var directive = providerData.instance;
- var changed = false;
- var changes = undefined;
- for (var i = 0; i < values.length; i++) {
- if (checkBinding(view, def, i, values[i])) {
- changed = true;
- changes = updateProp(view, providerData, def, i, values[i], changes);
- }
- }
- if (changes) {
- directive.ngOnChanges(changes);
- }
- if ((def.flags & 65536 /* OnInit */) &&
- shouldCallLifecycleInitHook(view, 256 /* InitState_CallingOnInit */, def.nodeIndex)) {
- directive.ngOnInit();
- }
- if (def.flags & 262144 /* DoCheck */) {
- directive.ngDoCheck();
- }
- return changed;
- }
- function _createProviderInstance$1(view, def) {
- // private services can see other private services
- var allowPrivateServices = (def.flags & 8192 /* PrivateProvider */) > 0;
- var providerDef = def.provider;
- switch (def.flags & 201347067 /* Types */) {
- case 512 /* TypeClassProvider */:
- return createClass(view, def.parent, allowPrivateServices, providerDef.value, providerDef.deps);
- case 1024 /* TypeFactoryProvider */:
- return callFactory(view, def.parent, allowPrivateServices, providerDef.value, providerDef.deps);
- case 2048 /* TypeUseExistingProvider */:
- return resolveDep(view, def.parent, allowPrivateServices, providerDef.deps[0]);
- case 256 /* TypeValueProvider */:
- return providerDef.value;
- }
- }
- function createClass(view, elDef, allowPrivateServices, ctor, deps) {
- var len = deps.length;
- switch (len) {
- case 0:
- return new ctor();
- case 1:
- return new ctor(resolveDep(view, elDef, allowPrivateServices, deps[0]));
- case 2:
- return new ctor(resolveDep(view, elDef, allowPrivateServices, deps[0]), resolveDep(view, elDef, allowPrivateServices, deps[1]));
- case 3:
- return new ctor(resolveDep(view, elDef, allowPrivateServices, deps[0]), resolveDep(view, elDef, allowPrivateServices, deps[1]), resolveDep(view, elDef, allowPrivateServices, deps[2]));
- default:
- var depValues = new Array(len);
- for (var i = 0; i < len; i++) {
- depValues[i] = resolveDep(view, elDef, allowPrivateServices, deps[i]);
- }
- return new (ctor.bind.apply(ctor, __spread([void 0], depValues)))();
- }
- }
- function callFactory(view, elDef, allowPrivateServices, factory, deps) {
- var len = deps.length;
- switch (len) {
- case 0:
- return factory();
- case 1:
- return factory(resolveDep(view, elDef, allowPrivateServices, deps[0]));
- case 2:
- return factory(resolveDep(view, elDef, allowPrivateServices, deps[0]), resolveDep(view, elDef, allowPrivateServices, deps[1]));
- case 3:
- return factory(resolveDep(view, elDef, allowPrivateServices, deps[0]), resolveDep(view, elDef, allowPrivateServices, deps[1]), resolveDep(view, elDef, allowPrivateServices, deps[2]));
- default:
- var depValues = Array(len);
- for (var i = 0; i < len; i++) {
- depValues[i] = resolveDep(view, elDef, allowPrivateServices, deps[i]);
- }
- return factory.apply(void 0, __spread(depValues));
- }
- }
- // This default value is when checking the hierarchy for a token.
- //
- // It means both:
- // - the token is not provided by the current injector,
- // - only the element injectors should be checked (ie do not check module injectors
- //
- // mod1
- // /
- // el1 mod2
- // \ /
- // el2
- //
- // When requesting el2.injector.get(token), we should check in the following order and return the
- // first found value:
- // - el2.injector.get(token, default)
- // - el1.injector.get(token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR) -> do not check the module
- // - mod2.injector.get(token, default)
- var NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR = {};
- function resolveDep(view, elDef, allowPrivateServices, depDef, notFoundValue) {
- if (notFoundValue === void 0) { notFoundValue = Injector.THROW_IF_NOT_FOUND; }
- if (depDef.flags & 8 /* Value */) {
- return depDef.token;
- }
- var startView = view;
- if (depDef.flags & 2 /* Optional */) {
- notFoundValue = null;
- }
- var tokenKey = depDef.tokenKey;
- if (tokenKey === ChangeDetectorRefTokenKey) {
- // directives on the same element as a component should be able to control the change detector
- // of that component as well.
- allowPrivateServices = !!(elDef && elDef.element.componentView);
- }
- if (elDef && (depDef.flags & 1 /* SkipSelf */)) {
- allowPrivateServices = false;
- elDef = elDef.parent;
- }
- var searchView = view;
- while (searchView) {
- if (elDef) {
- switch (tokenKey) {
- case RendererV1TokenKey: {
- var compView = findCompView(searchView, elDef, allowPrivateServices);
- return createRendererV1(compView);
- }
- case Renderer2TokenKey: {
- var compView = findCompView(searchView, elDef, allowPrivateServices);
- return compView.renderer;
- }
- case ElementRefTokenKey:
- return new ElementRef(asElementData(searchView, elDef.nodeIndex).renderElement);
- case ViewContainerRefTokenKey:
- return asElementData(searchView, elDef.nodeIndex).viewContainer;
- case TemplateRefTokenKey: {
- if (elDef.element.template) {
- return asElementData(searchView, elDef.nodeIndex).template;
- }
- break;
- }
- case ChangeDetectorRefTokenKey: {
- var cdView = findCompView(searchView, elDef, allowPrivateServices);
- return createChangeDetectorRef(cdView);
- }
- case InjectorRefTokenKey$1:
- case INJECTORRefTokenKey$1:
- return createInjector$1(searchView, elDef);
- default:
- var providerDef_1 = (allowPrivateServices ? elDef.element.allProviders :
- elDef.element.publicProviders)[tokenKey];
- if (providerDef_1) {
- var providerData = asProviderData(searchView, providerDef_1.nodeIndex);
- if (!providerData) {
- providerData = { instance: _createProviderInstance$1(searchView, providerDef_1) };
- searchView.nodes[providerDef_1.nodeIndex] = providerData;
- }
- return providerData.instance;
- }
- }
- }
- allowPrivateServices = isComponentView(searchView);
- elDef = viewParentEl(searchView);
- searchView = searchView.parent;
- if (depDef.flags & 4 /* Self */) {
- searchView = null;
- }
- }
- var value = startView.root.injector.get(depDef.token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR);
- if (value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR ||
- notFoundValue === NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR) {
- // Return the value from the root element injector when
- // - it provides it
- // (value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR)
- // - the module injector should not be checked
- // (notFoundValue === NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR)
- return value;
- }
- return startView.root.ngModule.injector.get(depDef.token, notFoundValue);
- }
- function findCompView(view, elDef, allowPrivateServices) {
- var compView;
- if (allowPrivateServices) {
- compView = asElementData(view, elDef.nodeIndex).componentView;
- }
- else {
- compView = view;
- while (compView.parent && !isComponentView(compView)) {
- compView = compView.parent;
- }
- }
- return compView;
- }
- function updateProp(view, providerData, def, bindingIdx, value, changes) {
- if (def.flags & 32768 /* Component */) {
- var compView = asElementData(view, def.parent.nodeIndex).componentView;
- if (compView.def.flags & 2 /* OnPush */) {
- compView.state |= 8 /* ChecksEnabled */;
- }
- }
- var binding = def.bindings[bindingIdx];
- var propName = binding.name;
- // Note: This is still safe with Closure Compiler as
- // the user passed in the property name as an object has to `providerDef`,
- // so Closure Compiler will have renamed the property correctly already.
- providerData.instance[propName] = value;
- if (def.flags & 524288 /* OnChanges */) {
- changes = changes || {};
- var oldValue = WrappedValue.unwrap(view.oldValues[def.bindingIndex + bindingIdx]);
- var binding_1 = def.bindings[bindingIdx];
- changes[binding_1.nonMinifiedName] =
- new SimpleChange(oldValue, value, (view.state & 2 /* FirstCheck */) !== 0);
- }
- view.oldValues[def.bindingIndex + bindingIdx] = value;
- return changes;
- }
- // This function calls the ngAfterContentCheck, ngAfterContentInit,
- // ngAfterViewCheck, and ngAfterViewInit lifecycle hooks (depending on the node
- // flags in lifecycle). Unlike ngDoCheck, ngOnChanges and ngOnInit, which are
- // called during a pre-order traversal of the view tree (that is calling the
- // parent hooks before the child hooks) these events are sent in using a
- // post-order traversal of the tree (children before parents). This changes the
- // meaning of initIndex in the view state. For ngOnInit, initIndex tracks the
- // expected nodeIndex which a ngOnInit should be called. When sending
- // ngAfterContentInit and ngAfterViewInit it is the expected count of
- // ngAfterContentInit or ngAfterViewInit methods that have been called. This
- // ensure that despite being called recursively or after picking up after an
- // exception, the ngAfterContentInit or ngAfterViewInit will be called on the
- // correct nodes. Consider for example, the following (where E is an element
- // and D is a directive)
- // Tree: pre-order index post-order index
- // E1 0 6
- // E2 1 1
- // D3 2 0
- // E4 3 5
- // E5 4 4
- // E6 5 2
- // E7 6 3
- // As can be seen, the post-order index has an unclear relationship to the
- // pre-order index (postOrderIndex === preOrderIndex - parentCount +
- // childCount). Since number of calls to ngAfterContentInit and ngAfterViewInit
- // are stable (will be the same for the same view regardless of exceptions or
- // recursion) we just need to count them which will roughly correspond to the
- // post-order index (it skips elements and directives that do not have
- // lifecycle hooks).
- //
- // For example, if an exception is raised in the E6.onAfterViewInit() the
- // initIndex is left at 3 (by shouldCallLifecycleInitHook() which set it to
- // initIndex + 1). When checkAndUpdateView() is called again D3, E2 and E6 will
- // not have their ngAfterViewInit() called but, starting with E7, the rest of
- // the view will begin getting ngAfterViewInit() called until a check and
- // pass is complete.
- //
- // This algorthim also handles recursion. Consider if E4's ngAfterViewInit()
- // indirectly calls E1's ChangeDetectorRef.detectChanges(). The expected
- // initIndex is set to 6, the recusive checkAndUpdateView() starts walk again.
- // D3, E2, E6, E7, E5 and E4 are skipped, ngAfterViewInit() is called on E1.
- // When the recursion returns the initIndex will be 7 so E1 is skipped as it
- // has already been called in the recursively called checkAnUpdateView().
- function callLifecycleHooksChildrenFirst(view, lifecycles) {
- if (!(view.def.nodeFlags & lifecycles)) {
- return;
- }
- var nodes = view.def.nodes;
- var initIndex = 0;
- for (var i = 0; i < nodes.length; i++) {
- var nodeDef = nodes[i];
- var parent_1 = nodeDef.parent;
- if (!parent_1 && nodeDef.flags & lifecycles) {
- // matching root node (e.g. a pipe)
- callProviderLifecycles(view, i, nodeDef.flags & lifecycles, initIndex++);
- }
- if ((nodeDef.childFlags & lifecycles) === 0) {
- // no child matches one of the lifecycles
- i += nodeDef.childCount;
- }
- while (parent_1 && (parent_1.flags & 1 /* TypeElement */) &&
- i === parent_1.nodeIndex + parent_1.childCount) {
- // last child of an element
- if (parent_1.directChildFlags & lifecycles) {
- initIndex = callElementProvidersLifecycles(view, parent_1, lifecycles, initIndex);
- }
- parent_1 = parent_1.parent;
- }
- }
- }
- function callElementProvidersLifecycles(view, elDef, lifecycles, initIndex) {
- for (var i = elDef.nodeIndex + 1; i <= elDef.nodeIndex + elDef.childCount; i++) {
- var nodeDef = view.def.nodes[i];
- if (nodeDef.flags & lifecycles) {
- callProviderLifecycles(view, i, nodeDef.flags & lifecycles, initIndex++);
- }
- // only visit direct children
- i += nodeDef.childCount;
- }
- return initIndex;
- }
- function callProviderLifecycles(view, index, lifecycles, initIndex) {
- var providerData = asProviderData(view, index);
- if (!providerData) {
- return;
- }
- var provider = providerData.instance;
- if (!provider) {
- return;
- }
- Services.setCurrentNode(view, index);
- if (lifecycles & 1048576 /* AfterContentInit */ &&
- shouldCallLifecycleInitHook(view, 512 /* InitState_CallingAfterContentInit */, initIndex)) {
- provider.ngAfterContentInit();
- }
- if (lifecycles & 2097152 /* AfterContentChecked */) {
- provider.ngAfterContentChecked();
- }
- if (lifecycles & 4194304 /* AfterViewInit */ &&
- shouldCallLifecycleInitHook(view, 768 /* InitState_CallingAfterViewInit */, initIndex)) {
- provider.ngAfterViewInit();
- }
- if (lifecycles & 8388608 /* AfterViewChecked */) {
- provider.ngAfterViewChecked();
- }
- if (lifecycles & 131072 /* OnDestroy */) {
- provider.ngOnDestroy();
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ComponentFactoryResolver$1 = /** @class */ (function (_super) {
- __extends(ComponentFactoryResolver, _super);
- /**
- * @param ngModule The NgModuleRef to which all resolved factories are bound.
- */
- function ComponentFactoryResolver(ngModule) {
- var _this = _super.call(this) || this;
- _this.ngModule = ngModule;
- return _this;
- }
- ComponentFactoryResolver.prototype.resolveComponentFactory = function (component) {
- ngDevMode && assertComponentType(component);
- var componentDef = getComponentDef(component);
- return new ComponentFactory$1(componentDef, this.ngModule);
- };
- return ComponentFactoryResolver;
- }(ComponentFactoryResolver));
- function toRefArray(map) {
- var array = [];
- for (var nonMinified in map) {
- if (map.hasOwnProperty(nonMinified)) {
- var minified = map[nonMinified];
- array.push({ propName: minified, templateName: nonMinified });
- }
- }
- return array;
- }
- /**
- * Default {@link RootContext} for all components rendered with {@link renderComponent}.
- */
- var ROOT_CONTEXT = new InjectionToken('ROOT_CONTEXT_TOKEN', { providedIn: 'root', factory: function () { return createRootContext(ɵɵinject(SCHEDULER)); } });
- /**
- * A change detection scheduler token for {@link RootContext}. This token is the default value used
- * for the default `RootContext` found in the {@link ROOT_CONTEXT} token.
- */
- var SCHEDULER = new InjectionToken('SCHEDULER_TOKEN', {
- providedIn: 'root',
- factory: function () { return defaultScheduler; },
- });
- function createChainedInjector(rootViewInjector, moduleInjector) {
- return {
- get: function (token, notFoundValue, flags) {
- var value = rootViewInjector.get(token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, flags);
- if (value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR ||
- notFoundValue === NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR) {
- // Return the value from the root element injector when
- // - it provides it
- // (value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR)
- // - the module injector should not be checked
- // (notFoundValue === NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR)
- return value;
- }
- return moduleInjector.get(token, notFoundValue, flags);
- }
- };
- }
- /**
- * Render3 implementation of {@link viewEngine_ComponentFactory}.
- */
- var ComponentFactory$1 = /** @class */ (function (_super) {
- __extends(ComponentFactory, _super);
- /**
- * @param componentDef The component definition.
- * @param ngModule The NgModuleRef to which the factory is bound.
- */
- function ComponentFactory(componentDef, ngModule) {
- var _this = _super.call(this) || this;
- _this.componentDef = componentDef;
- _this.ngModule = ngModule;
- _this.componentType = componentDef.type;
- _this.selector = componentDef.selectors[0][0];
- _this.ngContentSelectors =
- componentDef.ngContentSelectors ? componentDef.ngContentSelectors : [];
- _this.isBoundToModule = !!ngModule;
- return _this;
- }
- Object.defineProperty(ComponentFactory.prototype, "inputs", {
- get: function () {
- return toRefArray(this.componentDef.inputs);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ComponentFactory.prototype, "outputs", {
- get: function () {
- return toRefArray(this.componentDef.outputs);
- },
- enumerable: true,
- configurable: true
- });
- ComponentFactory.prototype.create = function (injector, projectableNodes, rootSelectorOrNode, ngModule) {
- var isInternalRootView = rootSelectorOrNode === undefined;
- ngModule = ngModule || this.ngModule;
- var rootViewInjector = ngModule ? createChainedInjector(injector, ngModule.injector) : injector;
- var rendererFactory = rootViewInjector.get(RendererFactory2, domRendererFactory3);
- var sanitizer = rootViewInjector.get(Sanitizer, null);
- var hostRNode = isInternalRootView ?
- elementCreate(this.selector, rendererFactory.createRenderer(null, this.componentDef)) :
- locateHostElement(rendererFactory, rootSelectorOrNode);
- var rootFlags = this.componentDef.onPush ? 64 /* Dirty */ | 512 /* IsRoot */ :
- 16 /* CheckAlways */ | 512 /* IsRoot */;
- // Check whether this Component needs to be isolated from other components, i.e. whether it
- // should be placed into its own (empty) root context or existing root context should be used.
- // Note: this is internal-only convention and might change in the future, so it should not be
- // relied upon externally.
- var isIsolated = typeof rootSelectorOrNode === 'string' &&
- /^#root-ng-internal-isolated-\d+/.test(rootSelectorOrNode);
- var rootContext = (isInternalRootView || isIsolated) ?
- createRootContext() :
- rootViewInjector.get(ROOT_CONTEXT);
- var renderer = rendererFactory.createRenderer(hostRNode, this.componentDef);
- if (rootSelectorOrNode && hostRNode) {
- ngDevMode && ngDevMode.rendererSetAttribute++;
- isProceduralRenderer(renderer) ?
- renderer.setAttribute(hostRNode, 'ng-version', VERSION$2.full) :
- hostRNode.setAttribute('ng-version', VERSION$2.full);
- }
- // Create the root view. Uses empty TView and ContentTemplate.
- var rootLView = createLView(null, createTView(-1, null, 1, 0, null, null, null, null), rootContext, rootFlags, null, null, rendererFactory, renderer, sanitizer, rootViewInjector);
- // rootView is the parent when bootstrapping
- var oldLView = enterView(rootLView, null);
- var component;
- var tElementNode;
- // Will become true if the `try` block executes with no errors.
- var safeToRunHooks = false;
- try {
- var componentView = createRootComponentView(hostRNode, this.componentDef, rootLView, rendererFactory, renderer);
- tElementNode = getTNode(0, rootLView);
- if (projectableNodes) {
- // projectable nodes can be passed as array of arrays or an array of iterables (ngUpgrade
- // case). Here we do normalize passed data structure to be an array of arrays to avoid
- // complex checks down the line.
- tElementNode.projection =
- projectableNodes.map(function (nodesforSlot) { return Array.from(nodesforSlot); });
- }
- // TODO: should LifecycleHooksFeature and other host features be generated by the compiler and
- // executed here?
- // Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref
- component = createRootComponent(componentView, this.componentDef, rootLView, rootContext, [LifecycleHooksFeature]);
- addToViewTree(rootLView, componentView);
- refreshDescendantViews(rootLView);
- safeToRunHooks = true;
- }
- finally {
- leaveView(oldLView, safeToRunHooks);
- }
- var componentRef = new ComponentRef$1(this.componentType, component, createElementRef(ElementRef, tElementNode, rootLView), rootLView, tElementNode);
- if (isInternalRootView) {
- // The host element of the internal root view is attached to the component's host view node
- componentRef.hostView._tViewNode.child = tElementNode;
- }
- return componentRef;
- };
- return ComponentFactory;
- }(ComponentFactory));
- var componentFactoryResolver = new ComponentFactoryResolver$1();
- /**
- * Represents an instance of a Component created via a {@link ComponentFactory}.
- *
- * `ComponentRef` provides access to the Component Instance as well other objects related to this
- * Component Instance and allows you to destroy the Component Instance via the {@link #destroy}
- * method.
- *
- */
- var ComponentRef$1 = /** @class */ (function (_super) {
- __extends(ComponentRef, _super);
- function ComponentRef(componentType, instance, location, _rootLView, _tNode) {
- var _this = _super.call(this) || this;
- _this.location = location;
- _this._rootLView = _rootLView;
- _this._tNode = _tNode;
- _this.destroyCbs = [];
- _this.instance = instance;
- _this.hostView = _this.changeDetectorRef = new RootViewRef(_rootLView);
- _this.hostView._tViewNode = assignTViewNodeToLView(_rootLView[TVIEW], null, -1, _rootLView);
- _this.componentType = componentType;
- return _this;
- }
- Object.defineProperty(ComponentRef.prototype, "injector", {
- get: function () { return new NodeInjector(this._tNode, this._rootLView); },
- enumerable: true,
- configurable: true
- });
- ComponentRef.prototype.destroy = function () {
- if (this.destroyCbs) {
- this.destroyCbs.forEach(function (fn) { return fn(); });
- this.destroyCbs = null;
- !this.hostView.destroyed && this.hostView.destroy();
- }
- };
- ComponentRef.prototype.onDestroy = function (callback) {
- if (this.destroyCbs) {
- this.destroyCbs.push(callback);
- }
- };
- return ComponentRef;
- }(ComponentRef));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * NOTE: changes to the `ngI18nClosureMode` name must be synced with `compiler-cli/src/tooling.ts`.
- */
- if (typeof ngI18nClosureMode === 'undefined') {
- // These property accesses can be ignored because ngI18nClosureMode will be set to false
- // when optimizing code and the whole if statement will be dropped.
- // Make sure to refer to ngI18nClosureMode as ['ngI18nClosureMode'] for closure.
- // NOTE: we need to have it in IIFE so that the tree-shaker is happy.
- (function () {
- // tslint:disable-next-line:no-toplevel-property-access
- _global$1['ngI18nClosureMode'] =
- // TODO(FW-1250): validate that this actually, you know, works.
- // tslint:disable-next-line:no-toplevel-property-access
- typeof goog !== 'undefined' && typeof goog.getMsg === 'function';
- })();
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Index of each type of locale data from the locale data array
- */
- var LocaleDataIndex;
- (function (LocaleDataIndex) {
- LocaleDataIndex[LocaleDataIndex["LocaleId"] = 0] = "LocaleId";
- LocaleDataIndex[LocaleDataIndex["DayPeriodsFormat"] = 1] = "DayPeriodsFormat";
- LocaleDataIndex[LocaleDataIndex["DayPeriodsStandalone"] = 2] = "DayPeriodsStandalone";
- LocaleDataIndex[LocaleDataIndex["DaysFormat"] = 3] = "DaysFormat";
- LocaleDataIndex[LocaleDataIndex["DaysStandalone"] = 4] = "DaysStandalone";
- LocaleDataIndex[LocaleDataIndex["MonthsFormat"] = 5] = "MonthsFormat";
- LocaleDataIndex[LocaleDataIndex["MonthsStandalone"] = 6] = "MonthsStandalone";
- LocaleDataIndex[LocaleDataIndex["Eras"] = 7] = "Eras";
- LocaleDataIndex[LocaleDataIndex["FirstDayOfWeek"] = 8] = "FirstDayOfWeek";
- LocaleDataIndex[LocaleDataIndex["WeekendRange"] = 9] = "WeekendRange";
- LocaleDataIndex[LocaleDataIndex["DateFormat"] = 10] = "DateFormat";
- LocaleDataIndex[LocaleDataIndex["TimeFormat"] = 11] = "TimeFormat";
- LocaleDataIndex[LocaleDataIndex["DateTimeFormat"] = 12] = "DateTimeFormat";
- LocaleDataIndex[LocaleDataIndex["NumberSymbols"] = 13] = "NumberSymbols";
- LocaleDataIndex[LocaleDataIndex["NumberFormats"] = 14] = "NumberFormats";
- LocaleDataIndex[LocaleDataIndex["CurrencySymbol"] = 15] = "CurrencySymbol";
- LocaleDataIndex[LocaleDataIndex["CurrencyName"] = 16] = "CurrencyName";
- LocaleDataIndex[LocaleDataIndex["Currencies"] = 17] = "Currencies";
- LocaleDataIndex[LocaleDataIndex["PluralCase"] = 18] = "PluralCase";
- LocaleDataIndex[LocaleDataIndex["ExtraData"] = 19] = "ExtraData";
- })(LocaleDataIndex || (LocaleDataIndex = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Flattens an array.
- */
- function flatten$2(list, dst) {
- if (dst === undefined)
- dst = list;
- for (var i = 0; i < list.length; i++) {
- var item = list[i];
- if (Array.isArray(item)) {
- // we need to inline it.
- if (dst === list) {
- // Our assumption that the list was already flat was wrong and
- // we need to clone flat since we need to write to it.
- dst = list.slice(0, i);
- }
- flatten$2(item, dst);
- }
- else if (dst !== list) {
- dst.push(item);
- }
- }
- return dst;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * The locale id that the application is currently using (for translations and ICU expressions).
- * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
- * but is now defined as a global value.
- */
- var DEFAULT_LOCALE_ID = 'en-US';
- var LOCALE_ID = DEFAULT_LOCALE_ID;
- /**
- * Sets the locale id that will be used for translations and ICU expressions.
- * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine
- * but is now defined as a global value.
- *
- * @param localeId
- */
- function setLocaleId(localeId) {
- LOCALE_ID = localeId.toLowerCase().replace(/_/g, '-');
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Map of module-id to the corresponding NgModule.
- * - In pre Ivy we track NgModuleFactory,
- * - In post Ivy we track the NgModuleType
- */
- var modules = new Map();
- function assertSameOrNotExisting(id, type, incoming) {
- if (type && type !== incoming) {
- throw new Error("Duplicate module registered for " + id + " - " + stringify$1(type) + " vs " + stringify$1(type.name));
- }
- }
- function registerNgModuleType(ngModuleType) {
- if (ngModuleType.ngModuleDef.id !== null) {
- var id = ngModuleType.ngModuleDef.id;
- var existing = modules.get(id);
- assertSameOrNotExisting(id, existing, ngModuleType);
- modules.set(id, ngModuleType);
- }
- var imports = ngModuleType.ngModuleDef.imports;
- if (imports instanceof Function) {
- imports = imports();
- }
- if (imports) {
- imports.forEach(function (i) { return registerNgModuleType(i); });
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var COMPONENT_FACTORY_RESOLVER = {
- provide: ComponentFactoryResolver,
- useClass: ComponentFactoryResolver$1,
- deps: [NgModuleRef],
- };
- var NgModuleRef$1 = /** @class */ (function (_super) {
- __extends(NgModuleRef$1, _super);
- function NgModuleRef$1(ngModuleType, _parent) {
- var _this = _super.call(this) || this;
- _this._parent = _parent;
- // tslint:disable-next-line:require-internal-with-underscore
- _this._bootstrapComponents = [];
- _this.injector = _this;
- _this.destroyCbs = [];
- var ngModuleDef = getNgModuleDef(ngModuleType);
- ngDevMode && assertDefined(ngModuleDef, "NgModule '" + stringify$1(ngModuleType) + "' is not a subtype of 'NgModuleType'.");
- var ngLocaleIdDef = getNgLocaleIdDef(ngModuleType);
- if (ngLocaleIdDef) {
- setLocaleId(ngLocaleIdDef);
- }
- _this._bootstrapComponents = maybeUnwrapFn(ngModuleDef.bootstrap);
- var additionalProviders = [
- {
- provide: NgModuleRef,
- useValue: _this,
- },
- COMPONENT_FACTORY_RESOLVER
- ];
- _this._r3Injector = createInjector(ngModuleType, _parent, additionalProviders, stringify$1(ngModuleType));
- _this.instance = _this.get(ngModuleType);
- return _this;
- }
- NgModuleRef$1.prototype.get = function (token, notFoundValue, injectFlags) {
- if (notFoundValue === void 0) { notFoundValue = Injector.THROW_IF_NOT_FOUND; }
- if (injectFlags === void 0) { injectFlags = InjectFlags.Default; }
- if (token === Injector || token === NgModuleRef || token === INJECTOR) {
- return this;
- }
- return this._r3Injector.get(token, notFoundValue, injectFlags);
- };
- Object.defineProperty(NgModuleRef$1.prototype, "componentFactoryResolver", {
- get: function () {
- return this.get(ComponentFactoryResolver);
- },
- enumerable: true,
- configurable: true
- });
- NgModuleRef$1.prototype.destroy = function () {
- ngDevMode && assertDefined(this.destroyCbs, 'NgModule already destroyed');
- var injector = this._r3Injector;
- !injector.destroyed && injector.destroy();
- this.destroyCbs.forEach(function (fn) { return fn(); });
- this.destroyCbs = null;
- };
- NgModuleRef$1.prototype.onDestroy = function (callback) {
- ngDevMode && assertDefined(this.destroyCbs, 'NgModule already destroyed');
- this.destroyCbs.push(callback);
- };
- return NgModuleRef$1;
- }(NgModuleRef));
- var NgModuleFactory$1 = /** @class */ (function (_super) {
- __extends(NgModuleFactory, _super);
- function NgModuleFactory(moduleType) {
- var _this = _super.call(this) || this;
- _this.moduleType = moduleType;
- var ngModuleDef = getNgModuleDef(moduleType);
- if (ngModuleDef !== null) {
- // Register the NgModule with Angular's module registry. The location (and hence timing) of
- // this call is critical to ensure this works correctly (modules get registered when expected)
- // without bloating bundles (modules are registered when otherwise not referenced).
- //
- // In View Engine, registration occurs in the .ngfactory.js file as a side effect. This has
- // several practical consequences:
- //
- // - If an .ngfactory file is not imported from, the module won't be registered (and can be
- // tree shaken).
- // - If an .ngfactory file is imported from, the module will be registered even if an instance
- // is not actually created (via `create` below).
- // - Since an .ngfactory file in View Engine references the .ngfactory files of the NgModule's
- // imports,
- //
- // In Ivy, things are a bit different. .ngfactory files still exist for compatibility, but are
- // not a required API to use - there are other ways to obtain an NgModuleFactory for a given
- // NgModule. Thus, relying on a side effect in the .ngfactory file is not sufficient. Instead,
- // the side effect of registration is added here, in the constructor of NgModuleFactory,
- // ensuring no matter how a factory is created, the module is registered correctly.
- //
- // An alternative would be to include the registration side effect inline following the actual
- // NgModule definition. This also has the correct timing, but breaks tree-shaking - modules
- // will be registered and retained even if they're otherwise never referenced.
- registerNgModuleType(moduleType);
- }
- return _this;
- }
- NgModuleFactory.prototype.create = function (parentInjector) {
- return new NgModuleRef$1(this.moduleType, parentInjector);
- };
- return NgModuleFactory;
- }(NgModuleFactory));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function isFunction(x) {
- return typeof x === 'function';
- }
- let _enable_super_gross_mode_that_will_cause_bad_things = false;
- const config = {
- Promise: undefined,
- set useDeprecatedSynchronousErrorHandling(value) {
- if (value) {
- const error = new Error();
- console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
- }
- else if (_enable_super_gross_mode_that_will_cause_bad_things) {
- console.log('RxJS: Back to a better error behavior. Thank you. <3');
- }
- _enable_super_gross_mode_that_will_cause_bad_things = value;
- },
- get useDeprecatedSynchronousErrorHandling() {
- return _enable_super_gross_mode_that_will_cause_bad_things;
- },
- };
- function hostReportError(err) {
- setTimeout(() => { throw err; });
- }
- const empty$1 = {
- closed: true,
- next(value) { },
- error(err) {
- if (config.useDeprecatedSynchronousErrorHandling) {
- throw err;
- }
- else {
- hostReportError(err);
- }
- },
- complete() { }
- };
- const isArray = Array.isArray || ((x) => x && typeof x.length === 'number');
- function isObject(x) {
- return x !== null && typeof x === 'object';
- }
- function UnsubscriptionErrorImpl(errors) {
- Error.call(this);
- this.message = errors ?
- `${errors.length} errors occurred during unsubscription:
- ${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\n ')}` : '';
- this.name = 'UnsubscriptionError';
- this.errors = errors;
- return this;
- }
- UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
- const UnsubscriptionError = UnsubscriptionErrorImpl;
- class Subscription {
- constructor(unsubscribe) {
- this.closed = false;
- this._parent = null;
- this._parents = null;
- this._subscriptions = null;
- if (unsubscribe) {
- this._unsubscribe = unsubscribe;
- }
- }
- unsubscribe() {
- let hasErrors = false;
- let errors;
- if (this.closed) {
- return;
- }
- let { _parent, _parents, _unsubscribe, _subscriptions } = this;
- this.closed = true;
- this._parent = null;
- this._parents = null;
- this._subscriptions = null;
- let index = -1;
- let len = _parents ? _parents.length : 0;
- while (_parent) {
- _parent.remove(this);
- _parent = ++index < len && _parents[index] || null;
- }
- if (isFunction(_unsubscribe)) {
- try {
- _unsubscribe.call(this);
- }
- catch (e) {
- hasErrors = true;
- errors = e instanceof UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
- }
- }
- if (isArray(_subscriptions)) {
- index = -1;
- len = _subscriptions.length;
- while (++index < len) {
- const sub = _subscriptions[index];
- if (isObject(sub)) {
- try {
- sub.unsubscribe();
- }
- catch (e) {
- hasErrors = true;
- errors = errors || [];
- if (e instanceof UnsubscriptionError) {
- errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
- }
- else {
- errors.push(e);
- }
- }
- }
- }
- }
- if (hasErrors) {
- throw new UnsubscriptionError(errors);
- }
- }
- add(teardown) {
- let subscription = teardown;
- switch (typeof teardown) {
- case 'function':
- subscription = new Subscription(teardown);
- case 'object':
- if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
- return subscription;
- }
- else if (this.closed) {
- subscription.unsubscribe();
- return subscription;
- }
- else if (!(subscription instanceof Subscription)) {
- const tmp = subscription;
- subscription = new Subscription();
- subscription._subscriptions = [tmp];
- }
- break;
- default: {
- if (!teardown) {
- return Subscription.EMPTY;
- }
- throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
- }
- }
- if (subscription._addParent(this)) {
- const subscriptions = this._subscriptions;
- if (subscriptions) {
- subscriptions.push(subscription);
- }
- else {
- this._subscriptions = [subscription];
- }
- }
- return subscription;
- }
- remove(subscription) {
- const subscriptions = this._subscriptions;
- if (subscriptions) {
- const subscriptionIndex = subscriptions.indexOf(subscription);
- if (subscriptionIndex !== -1) {
- subscriptions.splice(subscriptionIndex, 1);
- }
- }
- }
- _addParent(parent) {
- let { _parent, _parents } = this;
- if (_parent === parent) {
- return false;
- }
- else if (!_parent) {
- this._parent = parent;
- return true;
- }
- else if (!_parents) {
- this._parents = [parent];
- return true;
- }
- else if (_parents.indexOf(parent) === -1) {
- _parents.push(parent);
- return true;
- }
- return false;
- }
- }
- Subscription.EMPTY = (function (empty) {
- empty.closed = true;
- return empty;
- }(new Subscription()));
- function flattenUnsubscriptionErrors(errors) {
- return errors.reduce((errs, err) => errs.concat((err instanceof UnsubscriptionError) ? err.errors : err), []);
- }
- const rxSubscriber = typeof Symbol === 'function'
- ? Symbol('rxSubscriber')
- : '@@rxSubscriber_' + Math.random();
- class Subscriber extends Subscription {
- constructor(destinationOrNext, error, complete) {
- super();
- this.syncErrorValue = null;
- this.syncErrorThrown = false;
- this.syncErrorThrowable = false;
- this.isStopped = false;
- switch (arguments.length) {
- case 0:
- this.destination = empty$1;
- break;
- case 1:
- if (!destinationOrNext) {
- this.destination = empty$1;
- break;
- }
- if (typeof destinationOrNext === 'object') {
- if (destinationOrNext instanceof Subscriber) {
- this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
- this.destination = destinationOrNext;
- destinationOrNext.add(this);
- }
- else {
- this.syncErrorThrowable = true;
- this.destination = new SafeSubscriber(this, destinationOrNext);
- }
- break;
- }
- default:
- this.syncErrorThrowable = true;
- this.destination = new SafeSubscriber(this, destinationOrNext, error, complete);
- break;
- }
- }
- [rxSubscriber]() { return this; }
- static create(next, error, complete) {
- const subscriber = new Subscriber(next, error, complete);
- subscriber.syncErrorThrowable = false;
- return subscriber;
- }
- next(value) {
- if (!this.isStopped) {
- this._next(value);
- }
- }
- error(err) {
- if (!this.isStopped) {
- this.isStopped = true;
- this._error(err);
- }
- }
- complete() {
- if (!this.isStopped) {
- this.isStopped = true;
- this._complete();
- }
- }
- unsubscribe() {
- if (this.closed) {
- return;
- }
- this.isStopped = true;
- super.unsubscribe();
- }
- _next(value) {
- this.destination.next(value);
- }
- _error(err) {
- this.destination.error(err);
- this.unsubscribe();
- }
- _complete() {
- this.destination.complete();
- this.unsubscribe();
- }
- _unsubscribeAndRecycle() {
- const { _parent, _parents } = this;
- this._parent = null;
- this._parents = null;
- this.unsubscribe();
- this.closed = false;
- this.isStopped = false;
- this._parent = _parent;
- this._parents = _parents;
- return this;
- }
- }
- class SafeSubscriber extends Subscriber {
- constructor(_parentSubscriber, observerOrNext, error, complete) {
- super();
- this._parentSubscriber = _parentSubscriber;
- let next;
- let context = this;
- if (isFunction(observerOrNext)) {
- next = observerOrNext;
- }
- else if (observerOrNext) {
- next = observerOrNext.next;
- error = observerOrNext.error;
- complete = observerOrNext.complete;
- if (observerOrNext !== empty$1) {
- context = Object.create(observerOrNext);
- if (isFunction(context.unsubscribe)) {
- this.add(context.unsubscribe.bind(context));
- }
- context.unsubscribe = this.unsubscribe.bind(this);
- }
- }
- this._context = context;
- this._next = next;
- this._error = error;
- this._complete = complete;
- }
- next(value) {
- if (!this.isStopped && this._next) {
- const { _parentSubscriber } = this;
- if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
- this.__tryOrUnsub(this._next, value);
- }
- else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
- this.unsubscribe();
- }
- }
- }
- error(err) {
- if (!this.isStopped) {
- const { _parentSubscriber } = this;
- const { useDeprecatedSynchronousErrorHandling } = config;
- if (this._error) {
- if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
- this.__tryOrUnsub(this._error, err);
- this.unsubscribe();
- }
- else {
- this.__tryOrSetError(_parentSubscriber, this._error, err);
- this.unsubscribe();
- }
- }
- else if (!_parentSubscriber.syncErrorThrowable) {
- this.unsubscribe();
- if (useDeprecatedSynchronousErrorHandling) {
- throw err;
- }
- hostReportError(err);
- }
- else {
- if (useDeprecatedSynchronousErrorHandling) {
- _parentSubscriber.syncErrorValue = err;
- _parentSubscriber.syncErrorThrown = true;
- }
- else {
- hostReportError(err);
- }
- this.unsubscribe();
- }
- }
- }
- complete() {
- if (!this.isStopped) {
- const { _parentSubscriber } = this;
- if (this._complete) {
- const wrappedComplete = () => this._complete.call(this._context);
- if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
- this.__tryOrUnsub(wrappedComplete);
- this.unsubscribe();
- }
- else {
- this.__tryOrSetError(_parentSubscriber, wrappedComplete);
- this.unsubscribe();
- }
- }
- else {
- this.unsubscribe();
- }
- }
- }
- __tryOrUnsub(fn, value) {
- try {
- fn.call(this._context, value);
- }
- catch (err) {
- this.unsubscribe();
- if (config.useDeprecatedSynchronousErrorHandling) {
- throw err;
- }
- else {
- hostReportError(err);
- }
- }
- }
- __tryOrSetError(parent, fn, value) {
- if (!config.useDeprecatedSynchronousErrorHandling) {
- throw new Error('bad call');
- }
- try {
- fn.call(this._context, value);
- }
- catch (err) {
- if (config.useDeprecatedSynchronousErrorHandling) {
- parent.syncErrorValue = err;
- parent.syncErrorThrown = true;
- return true;
- }
- else {
- hostReportError(err);
- return true;
- }
- }
- return false;
- }
- _unsubscribe() {
- const { _parentSubscriber } = this;
- this._context = null;
- this._parentSubscriber = null;
- _parentSubscriber.unsubscribe();
- }
- }
- function canReportError(observer) {
- while (observer) {
- const { closed, destination, isStopped } = observer;
- if (closed || isStopped) {
- return false;
- }
- else if (destination && destination instanceof Subscriber) {
- observer = destination;
- }
- else {
- observer = null;
- }
- }
- return true;
- }
- function toSubscriber(nextOrObserver, error, complete) {
- if (nextOrObserver) {
- if (nextOrObserver instanceof Subscriber) {
- return nextOrObserver;
- }
- if (nextOrObserver[rxSubscriber]) {
- return nextOrObserver[rxSubscriber]();
- }
- }
- if (!nextOrObserver && !error && !complete) {
- return new Subscriber(empty$1);
- }
- return new Subscriber(nextOrObserver, error, complete);
- }
- const observable = typeof Symbol === 'function' && Symbol.observable || '@@observable';
- function noop$1() { }
- function pipeFromArray(fns) {
- if (!fns) {
- return noop$1;
- }
- if (fns.length === 1) {
- return fns[0];
- }
- return function piped(input) {
- return fns.reduce((prev, fn) => fn(prev), input);
- };
- }
- class Observable {
- constructor(subscribe) {
- this._isScalar = false;
- if (subscribe) {
- this._subscribe = subscribe;
- }
- }
- lift(operator) {
- const observable = new Observable();
- observable.source = this;
- observable.operator = operator;
- return observable;
- }
- subscribe(observerOrNext, error, complete) {
- const { operator } = this;
- const sink = toSubscriber(observerOrNext, error, complete);
- if (operator) {
- sink.add(operator.call(sink, this.source));
- }
- else {
- sink.add(this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
- this._subscribe(sink) :
- this._trySubscribe(sink));
- }
- if (config.useDeprecatedSynchronousErrorHandling) {
- if (sink.syncErrorThrowable) {
- sink.syncErrorThrowable = false;
- if (sink.syncErrorThrown) {
- throw sink.syncErrorValue;
- }
- }
- }
- return sink;
- }
- _trySubscribe(sink) {
- try {
- return this._subscribe(sink);
- }
- catch (err) {
- if (config.useDeprecatedSynchronousErrorHandling) {
- sink.syncErrorThrown = true;
- sink.syncErrorValue = err;
- }
- if (canReportError(sink)) {
- sink.error(err);
- }
- else {
- console.warn(err);
- }
- }
- }
- forEach(next, promiseCtor) {
- promiseCtor = getPromiseCtor(promiseCtor);
- return new promiseCtor((resolve, reject) => {
- let subscription;
- subscription = this.subscribe((value) => {
- try {
- next(value);
- }
- catch (err) {
- reject(err);
- if (subscription) {
- subscription.unsubscribe();
- }
- }
- }, reject, resolve);
- });
- }
- _subscribe(subscriber) {
- const { source } = this;
- return source && source.subscribe(subscriber);
- }
- [observable]() {
- return this;
- }
- pipe(...operations) {
- if (operations.length === 0) {
- return this;
- }
- return pipeFromArray(operations)(this);
- }
- toPromise(promiseCtor) {
- promiseCtor = getPromiseCtor(promiseCtor);
- return new promiseCtor((resolve, reject) => {
- let value;
- this.subscribe((x) => value = x, (err) => reject(err), () => resolve(value));
- });
- }
- }
- Observable.create = (subscribe) => {
- return new Observable(subscribe);
- };
- function getPromiseCtor(promiseCtor) {
- if (!promiseCtor) {
- promiseCtor = Promise;
- }
- if (!promiseCtor) {
- throw new Error('no Promise impl found');
- }
- return promiseCtor;
- }
- function ObjectUnsubscribedErrorImpl() {
- Error.call(this);
- this.message = 'object unsubscribed';
- this.name = 'ObjectUnsubscribedError';
- return this;
- }
- ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
- const ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
- class SubjectSubscription extends Subscription {
- constructor(subject, subscriber) {
- super();
- this.subject = subject;
- this.subscriber = subscriber;
- this.closed = false;
- }
- unsubscribe() {
- if (this.closed) {
- return;
- }
- this.closed = true;
- const subject = this.subject;
- const observers = subject.observers;
- this.subject = null;
- if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
- return;
- }
- const subscriberIndex = observers.indexOf(this.subscriber);
- if (subscriberIndex !== -1) {
- observers.splice(subscriberIndex, 1);
- }
- }
- }
- class SubjectSubscriber extends Subscriber {
- constructor(destination) {
- super(destination);
- this.destination = destination;
- }
- }
- class Subject extends Observable {
- constructor() {
- super();
- this.observers = [];
- this.closed = false;
- this.isStopped = false;
- this.hasError = false;
- this.thrownError = null;
- }
- [rxSubscriber]() {
- return new SubjectSubscriber(this);
- }
- lift(operator) {
- const subject = new AnonymousSubject(this, this);
- subject.operator = operator;
- return subject;
- }
- next(value) {
- if (this.closed) {
- throw new ObjectUnsubscribedError();
- }
- if (!this.isStopped) {
- const { observers } = this;
- const len = observers.length;
- const copy = observers.slice();
- for (let i = 0; i < len; i++) {
- copy[i].next(value);
- }
- }
- }
- error(err) {
- if (this.closed) {
- throw new ObjectUnsubscribedError();
- }
- this.hasError = true;
- this.thrownError = err;
- this.isStopped = true;
- const { observers } = this;
- const len = observers.length;
- const copy = observers.slice();
- for (let i = 0; i < len; i++) {
- copy[i].error(err);
- }
- this.observers.length = 0;
- }
- complete() {
- if (this.closed) {
- throw new ObjectUnsubscribedError();
- }
- this.isStopped = true;
- const { observers } = this;
- const len = observers.length;
- const copy = observers.slice();
- for (let i = 0; i < len; i++) {
- copy[i].complete();
- }
- this.observers.length = 0;
- }
- unsubscribe() {
- this.isStopped = true;
- this.closed = true;
- this.observers = null;
- }
- _trySubscribe(subscriber) {
- if (this.closed) {
- throw new ObjectUnsubscribedError();
- }
- else {
- return super._trySubscribe(subscriber);
- }
- }
- _subscribe(subscriber) {
- if (this.closed) {
- throw new ObjectUnsubscribedError();
- }
- else if (this.hasError) {
- subscriber.error(this.thrownError);
- return Subscription.EMPTY;
- }
- else if (this.isStopped) {
- subscriber.complete();
- return Subscription.EMPTY;
- }
- else {
- this.observers.push(subscriber);
- return new SubjectSubscription(this, subscriber);
- }
- }
- asObservable() {
- const observable = new Observable();
- observable.source = this;
- return observable;
- }
- }
- Subject.create = (destination, source) => {
- return new AnonymousSubject(destination, source);
- };
- class AnonymousSubject extends Subject {
- constructor(destination, source) {
- super();
- this.destination = destination;
- this.source = source;
- }
- next(value) {
- const { destination } = this;
- if (destination && destination.next) {
- destination.next(value);
- }
- }
- error(err) {
- const { destination } = this;
- if (destination && destination.error) {
- this.destination.error(err);
- }
- }
- complete() {
- const { destination } = this;
- if (destination && destination.complete) {
- this.destination.complete();
- }
- }
- _subscribe(subscriber) {
- const { source } = this;
- if (source) {
- return this.source.subscribe(subscriber);
- }
- else {
- return Subscription.EMPTY;
- }
- }
- }
- function refCount() {
- return function refCountOperatorFunction(source) {
- return source.lift(new RefCountOperator(source));
- };
- }
- class RefCountOperator {
- constructor(connectable) {
- this.connectable = connectable;
- }
- call(subscriber, source) {
- const { connectable } = this;
- connectable._refCount++;
- const refCounter = new RefCountSubscriber(subscriber, connectable);
- const subscription = source.subscribe(refCounter);
- if (!refCounter.closed) {
- refCounter.connection = connectable.connect();
- }
- return subscription;
- }
- }
- class RefCountSubscriber extends Subscriber {
- constructor(destination, connectable) {
- super(destination);
- this.connectable = connectable;
- }
- _unsubscribe() {
- const { connectable } = this;
- if (!connectable) {
- this.connection = null;
- return;
- }
- this.connectable = null;
- const refCount = connectable._refCount;
- if (refCount <= 0) {
- this.connection = null;
- return;
- }
- connectable._refCount = refCount - 1;
- if (refCount > 1) {
- this.connection = null;
- return;
- }
- const { connection } = this;
- const sharedConnection = connectable._connection;
- this.connection = null;
- if (sharedConnection && (!connection || sharedConnection === connection)) {
- sharedConnection.unsubscribe();
- }
- }
- }
- class ConnectableObservable extends Observable {
- constructor(source, subjectFactory) {
- super();
- this.source = source;
- this.subjectFactory = subjectFactory;
- this._refCount = 0;
- this._isComplete = false;
- }
- _subscribe(subscriber) {
- return this.getSubject().subscribe(subscriber);
- }
- getSubject() {
- const subject = this._subject;
- if (!subject || subject.isStopped) {
- this._subject = this.subjectFactory();
- }
- return this._subject;
- }
- connect() {
- let connection = this._connection;
- if (!connection) {
- this._isComplete = false;
- connection = this._connection = new Subscription();
- connection.add(this.source
- .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
- if (connection.closed) {
- this._connection = null;
- connection = Subscription.EMPTY;
- }
- else {
- this._connection = connection;
- }
- }
- return connection;
- }
- refCount() {
- return refCount()(this);
- }
- }
- const connectableProto = ConnectableObservable.prototype;
- const connectableObservableDescriptor = {
- operator: { value: null },
- _refCount: { value: 0, writable: true },
- _subject: { value: null, writable: true },
- _connection: { value: null, writable: true },
- _subscribe: { value: connectableProto._subscribe },
- _isComplete: { value: connectableProto._isComplete, writable: true },
- getSubject: { value: connectableProto.getSubject },
- connect: { value: connectableProto.connect },
- refCount: { value: connectableProto.refCount }
- };
- class ConnectableSubscriber extends SubjectSubscriber {
- constructor(destination, connectable) {
- super(destination);
- this.connectable = connectable;
- }
- _error(err) {
- this._unsubscribe();
- super._error(err);
- }
- _complete() {
- this.connectable._isComplete = true;
- this._unsubscribe();
- super._complete();
- }
- _unsubscribe() {
- const connectable = this.connectable;
- if (connectable) {
- this.connectable = null;
- const connection = connectable._connection;
- connectable._refCount = 0;
- connectable._subject = null;
- connectable._connection = null;
- if (connection) {
- connection.unsubscribe();
- }
- }
- }
- }
- class Action extends Subscription {
- constructor(scheduler, work) {
- super();
- }
- schedule(state, delay = 0) {
- return this;
- }
- }
- class AsyncAction extends Action {
- constructor(scheduler, work) {
- super(scheduler, work);
- this.scheduler = scheduler;
- this.work = work;
- this.pending = false;
- }
- schedule(state, delay = 0) {
- if (this.closed) {
- return this;
- }
- this.state = state;
- const id = this.id;
- const scheduler = this.scheduler;
- if (id != null) {
- this.id = this.recycleAsyncId(scheduler, id, delay);
- }
- this.pending = true;
- this.delay = delay;
- this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
- return this;
- }
- requestAsyncId(scheduler, id, delay = 0) {
- return setInterval(scheduler.flush.bind(scheduler, this), delay);
- }
- recycleAsyncId(scheduler, id, delay = 0) {
- if (delay !== null && this.delay === delay && this.pending === false) {
- return id;
- }
- clearInterval(id);
- return undefined;
- }
- execute(state, delay) {
- if (this.closed) {
- return new Error('executing a cancelled action');
- }
- this.pending = false;
- const error = this._execute(state, delay);
- if (error) {
- return error;
- }
- else if (this.pending === false && this.id != null) {
- this.id = this.recycleAsyncId(this.scheduler, this.id, null);
- }
- }
- _execute(state, delay) {
- let errored = false;
- let errorValue = undefined;
- try {
- this.work(state);
- }
- catch (e) {
- errored = true;
- errorValue = !!e && e || new Error(e);
- }
- if (errored) {
- this.unsubscribe();
- return errorValue;
- }
- }
- _unsubscribe() {
- const id = this.id;
- const scheduler = this.scheduler;
- const actions = scheduler.actions;
- const index = actions.indexOf(this);
- this.work = null;
- this.state = null;
- this.pending = false;
- this.scheduler = null;
- if (index !== -1) {
- actions.splice(index, 1);
- }
- if (id != null) {
- this.id = this.recycleAsyncId(scheduler, id, null);
- }
- this.delay = null;
- }
- }
- class QueueAction extends AsyncAction {
- constructor(scheduler, work) {
- super(scheduler, work);
- this.scheduler = scheduler;
- this.work = work;
- }
- schedule(state, delay = 0) {
- if (delay > 0) {
- return super.schedule(state, delay);
- }
- this.delay = delay;
- this.state = state;
- this.scheduler.flush(this);
- return this;
- }
- execute(state, delay) {
- return (delay > 0 || this.closed) ?
- super.execute(state, delay) :
- this._execute(state, delay);
- }
- requestAsyncId(scheduler, id, delay = 0) {
- if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
- return super.requestAsyncId(scheduler, id, delay);
- }
- return scheduler.flush(this);
- }
- }
- class Scheduler {
- constructor(SchedulerAction, now = Scheduler.now) {
- this.SchedulerAction = SchedulerAction;
- this.now = now;
- }
- schedule(work, delay = 0, state) {
- return new this.SchedulerAction(this, work).schedule(state, delay);
- }
- }
- Scheduler.now = () => Date.now();
- class AsyncScheduler extends Scheduler {
- constructor(SchedulerAction, now = Scheduler.now) {
- super(SchedulerAction, () => {
- if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
- return AsyncScheduler.delegate.now();
- }
- else {
- return now();
- }
- });
- this.actions = [];
- this.active = false;
- this.scheduled = undefined;
- }
- schedule(work, delay = 0, state) {
- if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
- return AsyncScheduler.delegate.schedule(work, delay, state);
- }
- else {
- return super.schedule(work, delay, state);
- }
- }
- flush(action) {
- const { actions } = this;
- if (this.active) {
- actions.push(action);
- return;
- }
- let error;
- this.active = true;
- do {
- if (error = action.execute(action.state, action.delay)) {
- break;
- }
- } while (action = actions.shift());
- this.active = false;
- if (error) {
- while (action = actions.shift()) {
- action.unsubscribe();
- }
- throw error;
- }
- }
- }
- class QueueScheduler extends AsyncScheduler {
- }
- const queue = new QueueScheduler(QueueAction);
- function isScheduler(value) {
- return value && typeof value.schedule === 'function';
- }
- const subscribeToArray = (array) => (subscriber) => {
- for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {
- subscriber.next(array[i]);
- }
- if (!subscriber.closed) {
- subscriber.complete();
- }
- };
- function fromArray(input, scheduler) {
- if (!scheduler) {
- return new Observable(subscribeToArray(input));
- }
- else {
- return new Observable(subscriber => {
- const sub = new Subscription();
- let i = 0;
- sub.add(scheduler.schedule(function () {
- if (i === input.length) {
- subscriber.complete();
- return;
- }
- subscriber.next(input[i++]);
- if (!subscriber.closed) {
- sub.add(this.schedule());
- }
- }));
- return sub;
- });
- }
- }
- var NotificationKind;
- (function (NotificationKind) {
- NotificationKind["NEXT"] = "N";
- NotificationKind["ERROR"] = "E";
- NotificationKind["COMPLETE"] = "C";
- })(NotificationKind || (NotificationKind = {}));
- let nextHandle = 1;
- const tasksByHandle = {};
- function runIfPresent(handle) {
- const cb = tasksByHandle[handle];
- if (cb) {
- cb();
- }
- }
- const Immediate = {
- setImmediate(cb) {
- const handle = nextHandle++;
- tasksByHandle[handle] = cb;
- Promise.resolve().then(() => runIfPresent(handle));
- return handle;
- },
- clearImmediate(handle) {
- delete tasksByHandle[handle];
- },
- };
- class AsapAction extends AsyncAction {
- constructor(scheduler, work) {
- super(scheduler, work);
- this.scheduler = scheduler;
- this.work = work;
- }
- requestAsyncId(scheduler, id, delay = 0) {
- if (delay !== null && delay > 0) {
- return super.requestAsyncId(scheduler, id, delay);
- }
- scheduler.actions.push(this);
- return scheduler.scheduled || (scheduler.scheduled = Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
- }
- recycleAsyncId(scheduler, id, delay = 0) {
- if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
- return super.recycleAsyncId(scheduler, id, delay);
- }
- if (scheduler.actions.length === 0) {
- Immediate.clearImmediate(id);
- scheduler.scheduled = undefined;
- }
- return undefined;
- }
- }
- class AsapScheduler extends AsyncScheduler {
- flush(action) {
- this.active = true;
- this.scheduled = undefined;
- const { actions } = this;
- let error;
- let index = -1;
- let count = actions.length;
- action = action || actions.shift();
- do {
- if (error = action.execute(action.state, action.delay)) {
- break;
- }
- } while (++index < count && (action = actions.shift()));
- this.active = false;
- if (error) {
- while (++index < count && (action = actions.shift())) {
- action.unsubscribe();
- }
- throw error;
- }
- }
- }
- const asap = new AsapScheduler(AsapAction);
- const async = new AsyncScheduler(AsyncAction);
- class AnimationFrameAction extends AsyncAction {
- constructor(scheduler, work) {
- super(scheduler, work);
- this.scheduler = scheduler;
- this.work = work;
- }
- requestAsyncId(scheduler, id, delay = 0) {
- if (delay !== null && delay > 0) {
- return super.requestAsyncId(scheduler, id, delay);
- }
- scheduler.actions.push(this);
- return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(() => scheduler.flush(null)));
- }
- recycleAsyncId(scheduler, id, delay = 0) {
- if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
- return super.recycleAsyncId(scheduler, id, delay);
- }
- if (scheduler.actions.length === 0) {
- cancelAnimationFrame(id);
- scheduler.scheduled = undefined;
- }
- return undefined;
- }
- }
- class AnimationFrameScheduler extends AsyncScheduler {
- flush(action) {
- this.active = true;
- this.scheduled = undefined;
- const { actions } = this;
- let error;
- let index = -1;
- let count = actions.length;
- action = action || actions.shift();
- do {
- if (error = action.execute(action.state, action.delay)) {
- break;
- }
- } while (++index < count && (action = actions.shift()));
- this.active = false;
- if (error) {
- while (++index < count && (action = actions.shift())) {
- action.unsubscribe();
- }
- throw error;
- }
- }
- }
- const animationFrame = new AnimationFrameScheduler(AnimationFrameAction);
- function identity(x) {
- return x;
- }
- function map(project, thisArg) {
- return function mapOperation(source) {
- if (typeof project !== 'function') {
- throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
- }
- return source.lift(new MapOperator(project, thisArg));
- };
- }
- class MapOperator {
- constructor(project, thisArg) {
- this.project = project;
- this.thisArg = thisArg;
- }
- call(subscriber, source) {
- return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
- }
- }
- class MapSubscriber extends Subscriber {
- constructor(destination, project, thisArg) {
- super(destination);
- this.project = project;
- this.count = 0;
- this.thisArg = thisArg || this;
- }
- _next(value) {
- let result;
- try {
- result = this.project.call(this.thisArg, value, this.count++);
- }
- catch (err) {
- this.destination.error(err);
- return;
- }
- this.destination.next(result);
- }
- }
- class OuterSubscriber extends Subscriber {
- notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
- this.destination.next(innerValue);
- }
- notifyError(error, innerSub) {
- this.destination.error(error);
- }
- notifyComplete(innerSub) {
- this.destination.complete();
- }
- }
- class InnerSubscriber extends Subscriber {
- constructor(parent, outerValue, outerIndex) {
- super();
- this.parent = parent;
- this.outerValue = outerValue;
- this.outerIndex = outerIndex;
- this.index = 0;
- }
- _next(value) {
- this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
- }
- _error(error) {
- this.parent.notifyError(error, this);
- this.unsubscribe();
- }
- _complete() {
- this.parent.notifyComplete(this);
- this.unsubscribe();
- }
- }
- const subscribeToPromise = (promise) => (subscriber) => {
- promise.then((value) => {
- if (!subscriber.closed) {
- subscriber.next(value);
- subscriber.complete();
- }
- }, (err) => subscriber.error(err))
- .then(null, hostReportError);
- return subscriber;
- };
- function getSymbolIterator$1() {
- if (typeof Symbol !== 'function' || !Symbol.iterator) {
- return '@@iterator';
- }
- return Symbol.iterator;
- }
- const iterator = getSymbolIterator$1();
- const subscribeToIterable = (iterable) => (subscriber) => {
- const iterator$1 = iterable[iterator]();
- do {
- const item = iterator$1.next();
- if (item.done) {
- subscriber.complete();
- break;
- }
- subscriber.next(item.value);
- if (subscriber.closed) {
- break;
- }
- } while (true);
- if (typeof iterator$1.return === 'function') {
- subscriber.add(() => {
- if (iterator$1.return) {
- iterator$1.return();
- }
- });
- }
- return subscriber;
- };
- const subscribeToObservable = (obj) => (subscriber) => {
- const obs = obj[observable]();
- if (typeof obs.subscribe !== 'function') {
- throw new TypeError('Provided object does not correctly implement Symbol.observable');
- }
- else {
- return obs.subscribe(subscriber);
- }
- };
- const isArrayLike = ((x) => x && typeof x.length === 'number' && typeof x !== 'function');
- function isPromise$2(value) {
- return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
- }
- const subscribeTo = (result) => {
- if (result instanceof Observable) {
- return (subscriber) => {
- if (result._isScalar) {
- subscriber.next(result.value);
- subscriber.complete();
- return undefined;
- }
- else {
- return result.subscribe(subscriber);
- }
- };
- }
- else if (!!result && typeof result[observable] === 'function') {
- return subscribeToObservable(result);
- }
- else if (isArrayLike(result)) {
- return subscribeToArray(result);
- }
- else if (isPromise$2(result)) {
- return subscribeToPromise(result);
- }
- else if (!!result && typeof result[iterator] === 'function') {
- return subscribeToIterable(result);
- }
- else {
- const value = isObject(result) ? 'an invalid object' : `'${result}'`;
- const msg = `You provided ${value} where a stream was expected.`
- + ' You can provide an Observable, Promise, Array, or Iterable.';
- throw new TypeError(msg);
- }
- };
- function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination = new InnerSubscriber(outerSubscriber, outerValue, outerIndex)) {
- if (destination.closed) {
- return;
- }
- return subscribeTo(result)(destination);
- }
- function isInteropObservable(input) {
- return input && typeof input[observable] === 'function';
- }
- function isIterable(input) {
- return input && typeof input[iterator] === 'function';
- }
- function fromPromise(input, scheduler) {
- if (!scheduler) {
- return new Observable(subscribeToPromise(input));
- }
- else {
- return new Observable(subscriber => {
- const sub = new Subscription();
- sub.add(scheduler.schedule(() => input.then(value => {
- sub.add(scheduler.schedule(() => {
- subscriber.next(value);
- sub.add(scheduler.schedule(() => subscriber.complete()));
- }));
- }, err => {
- sub.add(scheduler.schedule(() => subscriber.error(err)));
- })));
- return sub;
- });
- }
- }
- function fromIterable(input, scheduler) {
- if (!input) {
- throw new Error('Iterable cannot be null');
- }
- if (!scheduler) {
- return new Observable(subscribeToIterable(input));
- }
- else {
- return new Observable(subscriber => {
- const sub = new Subscription();
- let iterator$1;
- sub.add(() => {
- if (iterator$1 && typeof iterator$1.return === 'function') {
- iterator$1.return();
- }
- });
- sub.add(scheduler.schedule(() => {
- iterator$1 = input[iterator]();
- sub.add(scheduler.schedule(function () {
- if (subscriber.closed) {
- return;
- }
- let value;
- let done;
- try {
- const result = iterator$1.next();
- value = result.value;
- done = result.done;
- }
- catch (err) {
- subscriber.error(err);
- return;
- }
- if (done) {
- subscriber.complete();
- }
- else {
- subscriber.next(value);
- this.schedule();
- }
- }));
- }));
- return sub;
- });
- }
- }
- function fromObservable(input, scheduler) {
- if (!scheduler) {
- return new Observable(subscribeToObservable(input));
- }
- else {
- return new Observable(subscriber => {
- const sub = new Subscription();
- sub.add(scheduler.schedule(() => {
- const observable$1 = input[observable]();
- sub.add(observable$1.subscribe({
- next(value) { sub.add(scheduler.schedule(() => subscriber.next(value))); },
- error(err) { sub.add(scheduler.schedule(() => subscriber.error(err))); },
- complete() { sub.add(scheduler.schedule(() => subscriber.complete())); },
- }));
- }));
- return sub;
- });
- }
- }
- function from(input, scheduler) {
- if (!scheduler) {
- if (input instanceof Observable) {
- return input;
- }
- return new Observable(subscribeTo(input));
- }
- if (input != null) {
- if (isInteropObservable(input)) {
- return fromObservable(input, scheduler);
- }
- else if (isPromise$2(input)) {
- return fromPromise(input, scheduler);
- }
- else if (isArrayLike(input)) {
- return fromArray(input, scheduler);
- }
- else if (isIterable(input) || typeof input === 'string') {
- return fromIterable(input, scheduler);
- }
- }
- throw new TypeError((input !== null && typeof input || input) + ' is not observable');
- }
- function mergeMap(project, resultSelector, concurrent = Number.POSITIVE_INFINITY) {
- if (typeof resultSelector === 'function') {
- return (source) => source.pipe(mergeMap((a, i) => from(project(a, i)).pipe(map((b, ii) => resultSelector(a, b, i, ii))), concurrent));
- }
- else if (typeof resultSelector === 'number') {
- concurrent = resultSelector;
- }
- return (source) => source.lift(new MergeMapOperator(project, concurrent));
- }
- class MergeMapOperator {
- constructor(project, concurrent = Number.POSITIVE_INFINITY) {
- this.project = project;
- this.concurrent = concurrent;
- }
- call(observer, source) {
- return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
- }
- }
- class MergeMapSubscriber extends OuterSubscriber {
- constructor(destination, project, concurrent = Number.POSITIVE_INFINITY) {
- super(destination);
- this.project = project;
- this.concurrent = concurrent;
- this.hasCompleted = false;
- this.buffer = [];
- this.active = 0;
- this.index = 0;
- }
- _next(value) {
- if (this.active < this.concurrent) {
- this._tryNext(value);
- }
- else {
- this.buffer.push(value);
- }
- }
- _tryNext(value) {
- let result;
- const index = this.index++;
- try {
- result = this.project(value, index);
- }
- catch (err) {
- this.destination.error(err);
- return;
- }
- this.active++;
- this._innerSub(result, value, index);
- }
- _innerSub(ish, value, index) {
- const innerSubscriber = new InnerSubscriber(this, undefined, undefined);
- const destination = this.destination;
- destination.add(innerSubscriber);
- subscribeToResult(this, ish, value, index, innerSubscriber);
- }
- _complete() {
- this.hasCompleted = true;
- if (this.active === 0 && this.buffer.length === 0) {
- this.destination.complete();
- }
- this.unsubscribe();
- }
- notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
- this.destination.next(innerValue);
- }
- notifyComplete(innerSub) {
- const buffer = this.buffer;
- this.remove(innerSub);
- this.active--;
- if (buffer.length > 0) {
- this._next(buffer.shift());
- }
- else if (this.active === 0 && this.hasCompleted) {
- this.destination.complete();
- }
- }
- }
- function mergeAll(concurrent = Number.POSITIVE_INFINITY) {
- return mergeMap(identity, concurrent);
- }
- function merge$1(...observables) {
- let concurrent = Number.POSITIVE_INFINITY;
- let scheduler = null;
- let last = observables[observables.length - 1];
- if (isScheduler(last)) {
- scheduler = observables.pop();
- if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
- concurrent = observables.pop();
- }
- }
- else if (typeof last === 'number') {
- concurrent = observables.pop();
- }
- if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {
- return observables[0];
- }
- return mergeAll(concurrent)(fromArray(observables, scheduler));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Use in directives and components to emit custom events synchronously
- * or asynchronously, and register handlers for those events by subscribing
- * to an instance.
- *
- * @usageNotes
- *
- * In the following example, a component defines two output properties
- * that create event emitters. When the title is clicked, the emitter
- * emits an open or close event to toggle the current visibility state.
- *
- * ```html
- * @Component({
- * selector: 'zippy',
- * template: `
- * <div class="zippy">
- * <div (click)="toggle()">Toggle</div>
- * <div [hidden]="!visible">
- * <ng-content></ng-content>
- * </div>
- * </div>`})
- * export class Zippy {
- * visible: boolean = true;
- * @Output() open: EventEmitter<any> = new EventEmitter();
- * @Output() close: EventEmitter<any> = new EventEmitter();
- *
- * toggle() {
- * this.visible = !this.visible;
- * if (this.visible) {
- * this.open.emit(null);
- * } else {
- * this.close.emit(null);
- * }
- * }
- * }
- * ```
- *
- * Access the event object with the `$event` argument passed to the output event
- * handler:
- *
- * ```html
- * <zippy (open)="onOpen($event)" (close)="onClose($event)"></zippy>
- * ```
- *
- * @publicApi
- */
- var EventEmitter = /** @class */ (function (_super) {
- __extends(EventEmitter, _super);
- /**
- * Creates an instance of this class that can
- * deliver events synchronously or asynchronously.
- *
- * @param isAsync When true, deliver events asynchronously.
- *
- */
- function EventEmitter(isAsync) {
- if (isAsync === void 0) { isAsync = false; }
- var _this = _super.call(this) || this;
- _this.__isAsync = isAsync;
- return _this;
- }
- /**
- * Emits an event containing a given value.
- * @param value The value to emit.
- */
- EventEmitter.prototype.emit = function (value) { _super.prototype.next.call(this, value); };
- /**
- * Registers handlers for events emitted by this instance.
- * @param generatorOrNext When supplied, a custom handler for emitted events.
- * @param error When supplied, a custom handler for an error notification
- * from this emitter.
- * @param complete When supplied, a custom handler for a completion
- * notification from this emitter.
- */
- EventEmitter.prototype.subscribe = function (generatorOrNext, error, complete) {
- var schedulerFn;
- var errorFn = function (err) { return null; };
- var completeFn = function () { return null; };
- if (generatorOrNext && typeof generatorOrNext === 'object') {
- schedulerFn = this.__isAsync ? function (value) {
- setTimeout(function () { return generatorOrNext.next(value); });
- } : function (value) { generatorOrNext.next(value); };
- if (generatorOrNext.error) {
- errorFn = this.__isAsync ? function (err) { setTimeout(function () { return generatorOrNext.error(err); }); } :
- function (err) { generatorOrNext.error(err); };
- }
- if (generatorOrNext.complete) {
- completeFn = this.__isAsync ? function () { setTimeout(function () { return generatorOrNext.complete(); }); } :
- function () { generatorOrNext.complete(); };
- }
- }
- else {
- schedulerFn = this.__isAsync ? function (value) { setTimeout(function () { return generatorOrNext(value); }); } :
- function (value) { generatorOrNext(value); };
- if (error) {
- errorFn =
- this.__isAsync ? function (err) { setTimeout(function () { return error(err); }); } : function (err) { error(err); };
- }
- if (complete) {
- completeFn =
- this.__isAsync ? function () { setTimeout(function () { return complete(); }); } : function () { complete(); };
- }
- }
- var sink = _super.prototype.subscribe.call(this, schedulerFn, errorFn, completeFn);
- if (generatorOrNext instanceof Subscription) {
- generatorOrNext.add(sink);
- }
- return sink;
- };
- return EventEmitter;
- }(Subject));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function symbolIterator() {
- return this._results[getSymbolIterator()]();
- }
- /**
- * An unmodifiable list of items that Angular keeps up to date when the state
- * of the application changes.
- *
- * The type of object that {@link ViewChildren}, {@link ContentChildren}, and {@link QueryList}
- * provide.
- *
- * Implements an iterable interface, therefore it can be used in both ES6
- * javascript `for (var i of items)` loops as well as in Angular templates with
- * `*ngFor="let i of myList"`.
- *
- * Changes can be observed by subscribing to the changes `Observable`.
- *
- * NOTE: In the future this class will implement an `Observable` interface.
- *
- * @usageNotes
- * ### Example
- * ```typescript
- * @Component({...})
- * class Container {
- * @ViewChildren(Item) items:QueryList<Item>;
- * }
- * ```
- *
- * @publicApi
- */
- var QueryList = /** @class */ (function () {
- function QueryList() {
- this.dirty = true;
- this._results = [];
- this.changes = new EventEmitter();
- this.length = 0;
- // This function should be declared on the prototype, but doing so there will cause the class
- // declaration to have side-effects and become not tree-shakable. For this reason we do it in
- // the constructor.
- // [getSymbolIterator()](): Iterator<T> { ... }
- var symbol = getSymbolIterator();
- var proto = QueryList.prototype;
- if (!proto[symbol])
- proto[symbol] = symbolIterator;
- }
- /**
- * See
- * [Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
- */
- QueryList.prototype.map = function (fn) { return this._results.map(fn); };
- /**
- * See
- * [Array.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
- */
- QueryList.prototype.filter = function (fn) {
- return this._results.filter(fn);
- };
- /**
- * See
- * [Array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
- */
- QueryList.prototype.find = function (fn) {
- return this._results.find(fn);
- };
- /**
- * See
- * [Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
- */
- QueryList.prototype.reduce = function (fn, init) {
- return this._results.reduce(fn, init);
- };
- /**
- * See
- * [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
- */
- QueryList.prototype.forEach = function (fn) { this._results.forEach(fn); };
- /**
- * See
- * [Array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
- */
- QueryList.prototype.some = function (fn) {
- return this._results.some(fn);
- };
- /**
- * Returns a copy of the internal results list as an Array.
- */
- QueryList.prototype.toArray = function () { return this._results.slice(); };
- QueryList.prototype.toString = function () { return this._results.toString(); };
- /**
- * Updates the stored data of the query list, and resets the `dirty` flag to `false`, so that
- * on change detection, it will not notify of changes to the queries, unless a new change
- * occurs.
- *
- * @param resultsTree The results tree to store
- */
- QueryList.prototype.reset = function (resultsTree) {
- this._results = flatten$2(resultsTree);
- this.dirty = false;
- this.length = this._results.length;
- this.last = this._results[this.length - 1];
- this.first = this._results[0];
- };
- /**
- * Triggers a change event by emitting on the `changes` {@link EventEmitter}.
- */
- QueryList.prototype.notifyOnChanges = function () { this.changes.emit(this); };
- /** internal */
- QueryList.prototype.setDirty = function () { this.dirty = true; };
- /** internal */
- QueryList.prototype.destroy = function () {
- this.changes.complete();
- this.changes.unsubscribe();
- };
- return QueryList;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ɵ0$9 = function (dir) {
- if (dir === void 0) { dir = {}; }
- return dir;
- }, ɵ1$2 = function (type, meta) { return SWITCH_COMPILE_DIRECTIVE(type, meta); };
- /**
- * Type of the Directive metadata.
- *
- * @publicApi
- */
- var Directive = makeDecorator('Directive', ɵ0$9, undefined, undefined, ɵ1$2);
- var ɵ2$1 = function (c) {
- if (c === void 0) { c = {}; }
- return (__assign({ changeDetection: ChangeDetectionStrategy$1.Default }, c));
- }, ɵ3$1 = function (type, meta) { return SWITCH_COMPILE_COMPONENT(type, meta); };
- /**
- * Component decorator and metadata.
- *
- * @Annotation
- * @publicApi
- */
- var Component = makeDecorator('Component', ɵ2$1, Directive, undefined, ɵ3$1);
- var ɵ4 = function (p) { return (__assign({ pure: true }, p)); }, ɵ5 = function (type, meta) { return SWITCH_COMPILE_PIPE(type, meta); };
- /**
- * @Annotation
- * @publicApi
- */
- var Pipe = makeDecorator('Pipe', ɵ4, undefined, undefined, ɵ5);
- var ɵ6 = function (bindingPropertyName) { return ({ bindingPropertyName: bindingPropertyName }); };
- /**
- * @Annotation
- * @publicApi
- */
- var Input = makePropDecorator('Input', ɵ6);
- var ɵ7 = function (bindingPropertyName) { return ({ bindingPropertyName: bindingPropertyName }); };
- /**
- * @Annotation
- * @publicApi
- */
- var Output = makePropDecorator('Output', ɵ7);
- var ɵ8 = function (hostPropertyName) { return ({ hostPropertyName: hostPropertyName }); };
- /**
- * @Annotation
- * @publicApi
- */
- var HostBinding = makePropDecorator('HostBinding', ɵ8);
- var ɵ9 = function (eventName, args) { return ({ eventName: eventName, args: args }); };
- /**
- * Decorator that binds a DOM event to a host listener and supplies configuration metadata.
- * Angular invokes the supplied handler method when the host element emits the specified event,
- * and updates the bound element with the result.
- *
- * If the handler method returns false, applies `preventDefault` on the bound element.
- *
- * @usageNotes
- *
- * The following example declares a directive
- * that attaches a click listener to a button and counts clicks.
- *
- * ```ts
- * @Directive({selector: 'button[counting]'})
- * class CountClicks {
- * numberOfClicks = 0;
- *
- * @HostListener('click', ['$event.target'])
- * onClick(btn) {
- * console.log('button', btn, 'number of clicks:', this.numberOfClicks++);
- * }
- * }
- *
- * @Component({
- * selector: 'app',
- * template: '<button counting>Increment</button>',
- * })
- * class App {}
- * ```
- *
- * @Annotation
- * @publicApi
- */
- var HostListener = makePropDecorator('HostListener', ɵ9);
- var SWITCH_COMPILE_COMPONENT__PRE_R3__ = noop;
- var SWITCH_COMPILE_DIRECTIVE__PRE_R3__ = noop;
- var SWITCH_COMPILE_PIPE__PRE_R3__ = noop;
- var SWITCH_COMPILE_COMPONENT = SWITCH_COMPILE_COMPONENT__PRE_R3__;
- var SWITCH_COMPILE_DIRECTIVE = SWITCH_COMPILE_DIRECTIVE__PRE_R3__;
- var SWITCH_COMPILE_PIPE = SWITCH_COMPILE_PIPE__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ɵ0$a = function (ngModule) { return ngModule; }, ɵ1$3 =
- /**
- * Decorator that marks the following class as an NgModule, and supplies
- * configuration metadata for it.
- *
- * * The `declarations` and `entryComponents` options configure the compiler
- * with information about what belongs to the NgModule.
- * * The `providers` options configures the NgModule's injector to provide
- * dependencies the NgModule members.
- * * The `imports` and `exports` options bring in members from other modules, and make
- * this module's members available to others.
- */
- function (type, meta) { return SWITCH_COMPILE_NGMODULE(type, meta); };
- /**
- * @Annotation
- * @publicApi
- */
- var NgModule = makeDecorator('NgModule', ɵ0$a, undefined, undefined, ɵ1$3);
- function preR3NgModuleCompile(moduleType, metadata) {
- var imports = (metadata && metadata.imports) || [];
- if (metadata && metadata.exports) {
- imports = __spread(imports, [metadata.exports]);
- }
- moduleType.ngInjectorDef = ɵɵdefineInjector({
- factory: convertInjectableProviderToFactory(moduleType, { useClass: moduleType }),
- providers: metadata && metadata.providers,
- imports: imports,
- });
- }
- var SWITCH_COMPILE_NGMODULE__PRE_R3__ = preR3NgModuleCompile;
- var SWITCH_COMPILE_NGMODULE = SWITCH_COMPILE_NGMODULE__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function multicast(subjectOrSubjectFactory, selector) {
- return function multicastOperatorFunction(source) {
- let subjectFactory;
- if (typeof subjectOrSubjectFactory === 'function') {
- subjectFactory = subjectOrSubjectFactory;
- }
- else {
- subjectFactory = function subjectFactory() {
- return subjectOrSubjectFactory;
- };
- }
- if (typeof selector === 'function') {
- return source.lift(new MulticastOperator(subjectFactory, selector));
- }
- const connectable = Object.create(source, connectableObservableDescriptor);
- connectable.source = source;
- connectable.subjectFactory = subjectFactory;
- return connectable;
- };
- }
- class MulticastOperator {
- constructor(subjectFactory, selector) {
- this.subjectFactory = subjectFactory;
- this.selector = selector;
- }
- call(subscriber, source) {
- const { selector } = this;
- const subject = this.subjectFactory();
- const subscription = selector(subject).subscribe(subscriber);
- subscription.add(source.subscribe(subject));
- return subscription;
- }
- }
- function shareSubjectFactory() {
- return new Subject();
- }
- function share() {
- return (source) => refCount()(multicast(shareSubjectFactory)(source));
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A function that will be executed when an application is initialized.
- *
- * @publicApi
- */
- var APP_INITIALIZER = new InjectionToken('Application Initializer');
- /**
- * A class that reflects the state of running {@link APP_INITIALIZER}s.
- *
- * @publicApi
- */
- var ApplicationInitStatus = /** @class */ (function () {
- function ApplicationInitStatus(appInits) {
- var _this = this;
- this.appInits = appInits;
- this.initialized = false;
- this.done = false;
- this.donePromise = new Promise(function (res, rej) {
- _this.resolve = res;
- _this.reject = rej;
- });
- }
- /** @internal */
- ApplicationInitStatus.prototype.runInitializers = function () {
- var _this = this;
- if (this.initialized) {
- return;
- }
- var asyncInitPromises = [];
- var complete = function () {
- _this.done = true;
- _this.resolve();
- };
- if (this.appInits) {
- for (var i = 0; i < this.appInits.length; i++) {
- var initResult = this.appInits[i]();
- if (isPromise$1(initResult)) {
- asyncInitPromises.push(initResult);
- }
- }
- }
- Promise.all(asyncInitPromises).then(function () { complete(); }).catch(function (e) { _this.reject(e); });
- if (asyncInitPromises.length === 0) {
- complete();
- }
- this.initialized = true;
- };
- ApplicationInitStatus = __decorate([
- Injectable(),
- __param(0, Inject(APP_INITIALIZER)), __param(0, Optional()),
- __metadata("design:paramtypes", [Array])
- ], ApplicationInitStatus);
- return ApplicationInitStatus;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * A DI Token representing a unique string id assigned to the application by Angular and used
- * primarily for prefixing application attributes and CSS styles when
- * {@link ViewEncapsulation#Emulated ViewEncapsulation.Emulated} is being used.
- *
- * If you need to avoid randomly generated value to be used as an application id, you can provide
- * a custom value via a DI provider <!-- TODO: provider --> configuring the root {@link Injector}
- * using this token.
- * @publicApi
- */
- var APP_ID = new InjectionToken('AppId');
- function _appIdRandomProviderFactory() {
- return "" + _randomChar() + _randomChar() + _randomChar();
- }
- /**
- * Providers that will generate a random APP_ID_TOKEN.
- * @publicApi
- */
- var APP_ID_RANDOM_PROVIDER = {
- provide: APP_ID,
- useFactory: _appIdRandomProviderFactory,
- deps: [],
- };
- function _randomChar() {
- return String.fromCharCode(97 + Math.floor(Math.random() * 25));
- }
- /**
- * A function that will be executed when a platform is initialized.
- * @publicApi
- */
- var PLATFORM_INITIALIZER = new InjectionToken('Platform Initializer');
- /**
- * A token that indicates an opaque platform id.
- * @publicApi
- */
- var PLATFORM_ID = new InjectionToken('Platform ID');
- /**
- * All callbacks provided via this token will be called for every component that is bootstrapped.
- * Signature of the callback:
- *
- * `(componentRef: ComponentRef) => void`.
- *
- * @publicApi
- */
- var APP_BOOTSTRAP_LISTENER = new InjectionToken('appBootstrapListener');
- /**
- * A token which indicates the root directory of the application
- * @publicApi
- */
- var PACKAGE_ROOT_URL = new InjectionToken('Application Packages Root URL');
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var Console = /** @class */ (function () {
- function Console() {
- }
- Console.prototype.log = function (message) {
- // tslint:disable-next-line:no-console
- console.log(message);
- };
- // Note: for reporting errors use `DOM.logError()` as it is platform specific
- Console.prototype.warn = function (message) {
- // tslint:disable-next-line:no-console
- console.warn(message);
- };
- Console = __decorate([
- Injectable()
- ], Console);
- return Console;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Provide this token to set the locale of your application.
- * It is used for i18n extraction, by i18n pipes (DatePipe, I18nPluralPipe, CurrencyPipe,
- * DecimalPipe and PercentPipe) and by ICU expressions.
- *
- * See the [i18n guide](guide/i18n#setting-up-locale) for more information.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * import { LOCALE_ID } from '@angular/core';
- * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
- * import { AppModule } from './app/app.module';
- *
- * platformBrowserDynamic().bootstrapModule(AppModule, {
- * providers: [{provide: LOCALE_ID, useValue: 'en-US' }]
- * });
- * ```
- *
- * @publicApi
- */
- var LOCALE_ID$1 = new InjectionToken('LocaleId');
- /**
- * Use this token at bootstrap to provide the content of your translation file (`xtb`,
- * `xlf` or `xlf2`) when you want to translate your application in another language.
- *
- * See the [i18n guide](guide/i18n#merge) for more information.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * import { TRANSLATIONS } from '@angular/core';
- * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
- * import { AppModule } from './app/app.module';
- *
- * // content of your translation file
- * const translations = '....';
- *
- * platformBrowserDynamic().bootstrapModule(AppModule, {
- * providers: [{provide: TRANSLATIONS, useValue: translations }]
- * });
- * ```
- *
- * @publicApi
- */
- var TRANSLATIONS = new InjectionToken('Translations');
- /**
- * Provide this token at bootstrap to set the format of your {@link TRANSLATIONS}: `xtb`,
- * `xlf` or `xlf2`.
- *
- * See the [i18n guide](guide/i18n#merge) for more information.
- *
- * @usageNotes
- * ### Example
- *
- * ```typescript
- * import { TRANSLATIONS_FORMAT } from '@angular/core';
- * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
- * import { AppModule } from './app/app.module';
- *
- * platformBrowserDynamic().bootstrapModule(AppModule, {
- * providers: [{provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }]
- * });
- * ```
- *
- * @publicApi
- */
- var TRANSLATIONS_FORMAT = new InjectionToken('TranslationsFormat');
- /**
- * Use this enum at bootstrap as an option of `bootstrapModule` to define the strategy
- * that the compiler should use in case of missing translations:
- * - Error: throw if you have missing translations.
- * - Warning (default): show a warning in the console and/or shell.
- * - Ignore: do nothing.
- *
- * See the [i18n guide](guide/i18n#missing-translation) for more information.
- *
- * @usageNotes
- * ### Example
- * ```typescript
- * import { MissingTranslationStrategy } from '@angular/core';
- * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
- * import { AppModule } from './app/app.module';
- *
- * platformBrowserDynamic().bootstrapModule(AppModule, {
- * missingTranslation: MissingTranslationStrategy.Error
- * });
- * ```
- *
- * @publicApi
- */
- var MissingTranslationStrategy$1;
- (function (MissingTranslationStrategy) {
- MissingTranslationStrategy[MissingTranslationStrategy["Error"] = 0] = "Error";
- MissingTranslationStrategy[MissingTranslationStrategy["Warning"] = 1] = "Warning";
- MissingTranslationStrategy[MissingTranslationStrategy["Ignore"] = 2] = "Ignore";
- })(MissingTranslationStrategy$1 || (MissingTranslationStrategy$1 = {}));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function _throwError() {
- throw new Error("Runtime compiler is not loaded");
- }
- var Compiler_compileModuleSync__PRE_R3__ = _throwError;
- var Compiler_compileModuleSync = Compiler_compileModuleSync__PRE_R3__;
- var Compiler_compileModuleAsync__PRE_R3__ = _throwError;
- var Compiler_compileModuleAsync = Compiler_compileModuleAsync__PRE_R3__;
- var Compiler_compileModuleAndAllComponentsSync__PRE_R3__ = _throwError;
- var Compiler_compileModuleAndAllComponentsSync = Compiler_compileModuleAndAllComponentsSync__PRE_R3__;
- var Compiler_compileModuleAndAllComponentsAsync__PRE_R3__ = _throwError;
- var Compiler_compileModuleAndAllComponentsAsync = Compiler_compileModuleAndAllComponentsAsync__PRE_R3__;
- /**
- * Low-level service for running the angular compiler during runtime
- * to create {@link ComponentFactory}s, which
- * can later be used to create and render a Component instance.
- *
- * Each `@NgModule` provides an own `Compiler` to its injector,
- * that will use the directives/pipes of the ng module for compilation
- * of components.
- *
- * @publicApi
- */
- var Compiler = /** @class */ (function () {
- function Compiler() {
- /**
- * Compiles the given NgModule and all of its components. All templates of the components listed
- * in `entryComponents` have to be inlined.
- */
- this.compileModuleSync = Compiler_compileModuleSync;
- /**
- * Compiles the given NgModule and all of its components
- */
- this.compileModuleAsync = Compiler_compileModuleAsync;
- /**
- * Same as {@link #compileModuleSync} but also creates ComponentFactories for all components.
- */
- this.compileModuleAndAllComponentsSync = Compiler_compileModuleAndAllComponentsSync;
- /**
- * Same as {@link #compileModuleAsync} but also creates ComponentFactories for all components.
- */
- this.compileModuleAndAllComponentsAsync = Compiler_compileModuleAndAllComponentsAsync;
- }
- /**
- * Clears all caches.
- */
- Compiler.prototype.clearCache = function () { };
- /**
- * Clears the cache for the given component/ngModule.
- */
- Compiler.prototype.clearCacheFor = function (type) { };
- /**
- * Returns the id for a given NgModule, if one is defined and known to the compiler.
- */
- Compiler.prototype.getModuleId = function (moduleType) { return undefined; };
- Compiler = __decorate([
- Injectable()
- ], Compiler);
- return Compiler;
- }());
- /**
- * Token to provide CompilerOptions in the platform injector.
- *
- * @publicApi
- */
- var COMPILER_OPTIONS = new InjectionToken('compilerOptions');
- /**
- * A factory for creating a Compiler
- *
- * @publicApi
- */
- var CompilerFactory = /** @class */ (function () {
- function CompilerFactory() {
- }
- return CompilerFactory;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var trace;
- var events;
- function detectWTF() {
- var wtf = _global$1 /** TODO #9100 */['wtf'];
- if (wtf) {
- trace = wtf['trace'];
- if (trace) {
- events = trace['events'];
- return true;
- }
- }
- return false;
- }
- function createScope(signature, flags) {
- if (flags === void 0) { flags = null; }
- return events.createScope(signature, flags);
- }
- function leave(scope, returnValue) {
- trace.leaveScope(scope, returnValue);
- return returnValue;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * True if WTF is enabled.
- */
- var wtfEnabled = detectWTF();
- function noopScope(arg0, arg1) {
- return null;
- }
- /**
- * Create trace scope.
- *
- * Scopes must be strictly nested and are analogous to stack frames, but
- * do not have to follow the stack frames. Instead it is recommended that they follow logical
- * nesting. You may want to use
- * [Event
- * Signatures](http://google.github.io/tracing-framework/instrumenting-code.html#custom-events)
- * as they are defined in WTF.
- *
- * Used to mark scope entry. The return value is used to leave the scope.
- *
- * var myScope = wtfCreateScope('MyClass#myMethod(ascii someVal)');
- *
- * someMethod() {
- * var s = myScope('Foo'); // 'Foo' gets stored in tracing UI
- * // DO SOME WORK HERE
- * return wtfLeave(s, 123); // Return value 123
- * }
- *
- * Note, adding try-finally block around the work to ensure that `wtfLeave` gets called can
- * negatively impact the performance of your application. For this reason we recommend that
- * you don't add them to ensure that `wtfLeave` gets called. In production `wtfLeave` is a noop and
- * so try-finally block has no value. When debugging perf issues, skipping `wtfLeave`, do to
- * exception, will produce incorrect trace, but presence of exception signifies logic error which
- * needs to be fixed before the app should be profiled. Add try-finally only when you expect that
- * an exception is expected during normal execution while profiling.
- *
- * @publicApi
- * @deprecated the Web Tracing Framework is no longer supported in Angular
- */
- var wtfCreateScope = wtfEnabled ? createScope : function (signature, flags) { return noopScope; };
- /**
- * Used to mark end of Scope.
- *
- * - `scope` to end.
- * - `returnValue` (optional) to be passed to the WTF.
- *
- * Returns the `returnValue for easy chaining.
- * @publicApi
- * @deprecated the Web Tracing Framework is no longer supported in Angular
- */
- var wtfLeave = wtfEnabled ? leave : function (s, r) { return r; };
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var promise = (function () { return Promise.resolve(0); })();
- function scheduleMicroTask(fn) {
- if (typeof Zone === 'undefined') {
- // use promise to schedule microTask instead of use Zone
- promise.then(function () { fn && fn.apply(null, null); });
- }
- else {
- Zone.current.scheduleMicroTask('scheduleMicrotask', fn);
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * An injectable service for executing work inside or outside of the Angular zone.
- *
- * The most common use of this service is to optimize performance when starting a work consisting of
- * one or more asynchronous tasks that don't require UI updates or error handling to be handled by
- * Angular. Such tasks can be kicked off via {@link #runOutsideAngular} and if needed, these tasks
- * can reenter the Angular zone via {@link #run}.
- *
- * <!-- TODO: add/fix links to:
- * - docs explaining zones and the use of zones in Angular and change-detection
- * - link to runOutsideAngular/run (throughout this file!)
- * -->
- *
- * @usageNotes
- * ### Example
- *
- * ```
- * import {Component, NgZone} from '@angular/core';
- * import {NgIf} from '@angular/common';
- *
- * @Component({
- * selector: 'ng-zone-demo',
- * template: `
- * <h2>Demo: NgZone</h2>
- *
- * <p>Progress: {{progress}}%</p>
- * <p *ngIf="progress >= 100">Done processing {{label}} of Angular zone!</p>
- *
- * <button (click)="processWithinAngularZone()">Process within Angular zone</button>
- * <button (click)="processOutsideOfAngularZone()">Process outside of Angular zone</button>
- * `,
- * })
- * export class NgZoneDemo {
- * progress: number = 0;
- * label: string;
- *
- * constructor(private _ngZone: NgZone) {}
- *
- * // Loop inside the Angular zone
- * // so the UI DOES refresh after each setTimeout cycle
- * processWithinAngularZone() {
- * this.label = 'inside';
- * this.progress = 0;
- * this._increaseProgress(() => console.log('Inside Done!'));
- * }
- *
- * // Loop outside of the Angular zone
- * // so the UI DOES NOT refresh after each setTimeout cycle
- * processOutsideOfAngularZone() {
- * this.label = 'outside';
- * this.progress = 0;
- * this._ngZone.runOutsideAngular(() => {
- * this._increaseProgress(() => {
- * // reenter the Angular zone and display done
- * this._ngZone.run(() => { console.log('Outside Done!'); });
- * });
- * });
- * }
- *
- * _increaseProgress(doneCallback: () => void) {
- * this.progress += 1;
- * console.log(`Current progress: ${this.progress}%`);
- *
- * if (this.progress < 100) {
- * window.setTimeout(() => this._increaseProgress(doneCallback), 10);
- * } else {
- * doneCallback();
- * }
- * }
- * }
- * ```
- *
- * @publicApi
- */
- var NgZone = /** @class */ (function () {
- function NgZone(_a) {
- var _b = _a.enableLongStackTrace, enableLongStackTrace = _b === void 0 ? false : _b;
- this.hasPendingMicrotasks = false;
- this.hasPendingMacrotasks = false;
- /**
- * Whether there are no outstanding microtasks or macrotasks.
- */
- this.isStable = true;
- /**
- * Notifies when code enters Angular Zone. This gets fired first on VM Turn.
- */
- this.onUnstable = new EventEmitter(false);
- /**
- * Notifies when there is no more microtasks enqueued in the current VM Turn.
- * This is a hint for Angular to do change detection, which may enqueue more microtasks.
- * For this reason this event can fire multiple times per VM Turn.
- */
- this.onMicrotaskEmpty = new EventEmitter(false);
- /**
- * Notifies when the last `onMicrotaskEmpty` has run and there are no more microtasks, which
- * implies we are about to relinquish VM turn.
- * This event gets called just once.
- */
- this.onStable = new EventEmitter(false);
- /**
- * Notifies that an error has been delivered.
- */
- this.onError = new EventEmitter(false);
- if (typeof Zone == 'undefined') {
- throw new Error("In this configuration Angular requires Zone.js");
- }
- Zone.assertZonePatched();
- var self = this;
- self._nesting = 0;
- self._outer = self._inner = Zone.current;
- if (Zone['wtfZoneSpec']) {
- self._inner = self._inner.fork(Zone['wtfZoneSpec']);
- }
- if (Zone['TaskTrackingZoneSpec']) {
- self._inner = self._inner.fork(new Zone['TaskTrackingZoneSpec']);
- }
- if (enableLongStackTrace && Zone['longStackTraceZoneSpec']) {
- self._inner = self._inner.fork(Zone['longStackTraceZoneSpec']);
- }
- forkInnerZoneWithAngularBehavior(self);
- }
- NgZone.isInAngularZone = function () { return Zone.current.get('isAngularZone') === true; };
- NgZone.assertInAngularZone = function () {
- if (!NgZone.isInAngularZone()) {
- throw new Error('Expected to be in Angular Zone, but it is not!');
- }
- };
- NgZone.assertNotInAngularZone = function () {
- if (NgZone.isInAngularZone()) {
- throw new Error('Expected to not be in Angular Zone, but it is!');
- }
- };
- /**
- * Executes the `fn` function synchronously within the Angular zone and returns value returned by
- * the function.
- *
- * Running functions via `run` allows you to reenter Angular zone from a task that was executed
- * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
- *
- * Any future tasks or microtasks scheduled from within this function will continue executing from
- * within the Angular zone.
- *
- * If a synchronous error happens it will be rethrown and not reported via `onError`.
- */
- NgZone.prototype.run = function (fn, applyThis, applyArgs) {
- return this._inner.run(fn, applyThis, applyArgs);
- };
- /**
- * Executes the `fn` function synchronously within the Angular zone as a task and returns value
- * returned by the function.
- *
- * Running functions via `run` allows you to reenter Angular zone from a task that was executed
- * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
- *
- * Any future tasks or microtasks scheduled from within this function will continue executing from
- * within the Angular zone.
- *
- * If a synchronous error happens it will be rethrown and not reported via `onError`.
- */
- NgZone.prototype.runTask = function (fn, applyThis, applyArgs, name) {
- var zone = this._inner;
- var task = zone.scheduleEventTask('NgZoneEvent: ' + name, fn, EMPTY_PAYLOAD, noop$2, noop$2);
- try {
- return zone.runTask(task, applyThis, applyArgs);
- }
- finally {
- zone.cancelTask(task);
- }
- };
- /**
- * Same as `run`, except that synchronous errors are caught and forwarded via `onError` and not
- * rethrown.
- */
- NgZone.prototype.runGuarded = function (fn, applyThis, applyArgs) {
- return this._inner.runGuarded(fn, applyThis, applyArgs);
- };
- /**
- * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by
- * the function.
- *
- * Running functions via {@link #runOutsideAngular} allows you to escape Angular's zone and do
- * work that
- * doesn't trigger Angular change-detection or is subject to Angular's error handling.
- *
- * Any future tasks or microtasks scheduled from within this function will continue executing from
- * outside of the Angular zone.
- *
- * Use {@link #run} to reenter the Angular zone and do work that updates the application model.
- */
- NgZone.prototype.runOutsideAngular = function (fn) {
- return this._outer.run(fn);
- };
- return NgZone;
- }());
- function noop$2() { }
- var EMPTY_PAYLOAD = {};
- function checkStable(zone) {
- if (zone._nesting == 0 && !zone.hasPendingMicrotasks && !zone.isStable) {
- try {
- zone._nesting++;
- zone.onMicrotaskEmpty.emit(null);
- }
- finally {
- zone._nesting--;
- if (!zone.hasPendingMicrotasks) {
- try {
- zone.runOutsideAngular(function () { return zone.onStable.emit(null); });
- }
- finally {
- zone.isStable = true;
- }
- }
- }
- }
- }
- function forkInnerZoneWithAngularBehavior(zone) {
- zone._inner = zone._inner.fork({
- name: 'angular',
- properties: { 'isAngularZone': true },
- onInvokeTask: function (delegate, current, target, task, applyThis, applyArgs) {
- try {
- onEnter(zone);
- return delegate.invokeTask(target, task, applyThis, applyArgs);
- }
- finally {
- onLeave(zone);
- }
- },
- onInvoke: function (delegate, current, target, callback, applyThis, applyArgs, source) {
- try {
- onEnter(zone);
- return delegate.invoke(target, callback, applyThis, applyArgs, source);
- }
- finally {
- onLeave(zone);
- }
- },
- onHasTask: function (delegate, current, target, hasTaskState) {
- delegate.hasTask(target, hasTaskState);
- if (current === target) {
- // We are only interested in hasTask events which originate from our zone
- // (A child hasTask event is not interesting to us)
- if (hasTaskState.change == 'microTask') {
- zone.hasPendingMicrotasks = hasTaskState.microTask;
- checkStable(zone);
- }
- else if (hasTaskState.change == 'macroTask') {
- zone.hasPendingMacrotasks = hasTaskState.macroTask;
- }
- }
- },
- onHandleError: function (delegate, current, target, error) {
- delegate.handleError(target, error);
- zone.runOutsideAngular(function () { return zone.onError.emit(error); });
- return false;
- }
- });
- }
- function onEnter(zone) {
- zone._nesting++;
- if (zone.isStable) {
- zone.isStable = false;
- zone.onUnstable.emit(null);
- }
- }
- function onLeave(zone) {
- zone._nesting--;
- checkStable(zone);
- }
- /**
- * Provides a noop implementation of `NgZone` which does nothing. This zone requires explicit calls
- * to framework to perform rendering.
- */
- var NoopNgZone = /** @class */ (function () {
- function NoopNgZone() {
- this.hasPendingMicrotasks = false;
- this.hasPendingMacrotasks = false;
- this.isStable = true;
- this.onUnstable = new EventEmitter();
- this.onMicrotaskEmpty = new EventEmitter();
- this.onStable = new EventEmitter();
- this.onError = new EventEmitter();
- }
- NoopNgZone.prototype.run = function (fn) { return fn(); };
- NoopNgZone.prototype.runGuarded = function (fn) { return fn(); };
- NoopNgZone.prototype.runOutsideAngular = function (fn) { return fn(); };
- NoopNgZone.prototype.runTask = function (fn) { return fn(); };
- return NoopNgZone;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * The Testability service provides testing hooks that can be accessed from
- * the browser and by services such as Protractor. Each bootstrapped Angular
- * application on the page will have an instance of Testability.
- * @publicApi
- */
- var Testability = /** @class */ (function () {
- function Testability(_ngZone) {
- var _this = this;
- this._ngZone = _ngZone;
- this._pendingCount = 0;
- this._isZoneStable = true;
- /**
- * Whether any work was done since the last 'whenStable' callback. This is
- * useful to detect if this could have potentially destabilized another
- * component while it is stabilizing.
- * @internal
- */
- this._didWork = false;
- this._callbacks = [];
- this.taskTrackingZone = null;
- this._watchAngularEvents();
- _ngZone.run(function () {
- _this.taskTrackingZone =
- typeof Zone == 'undefined' ? null : Zone.current.get('TaskTrackingZone');
- });
- }
- Testability.prototype._watchAngularEvents = function () {
- var _this = this;
- this._ngZone.onUnstable.subscribe({
- next: function () {
- _this._didWork = true;
- _this._isZoneStable = false;
- }
- });
- this._ngZone.runOutsideAngular(function () {
- _this._ngZone.onStable.subscribe({
- next: function () {
- NgZone.assertNotInAngularZone();
- scheduleMicroTask(function () {
- _this._isZoneStable = true;
- _this._runCallbacksIfReady();
- });
- }
- });
- });
- };
- /**
- * Increases the number of pending request
- * @deprecated pending requests are now tracked with zones.
- */
- Testability.prototype.increasePendingRequestCount = function () {
- this._pendingCount += 1;
- this._didWork = true;
- return this._pendingCount;
- };
- /**
- * Decreases the number of pending request
- * @deprecated pending requests are now tracked with zones
- */
- Testability.prototype.decreasePendingRequestCount = function () {
- this._pendingCount -= 1;
- if (this._pendingCount < 0) {
- throw new Error('pending async requests below zero');
- }
- this._runCallbacksIfReady();
- return this._pendingCount;
- };
- /**
- * Whether an associated application is stable
- */
- Testability.prototype.isStable = function () {
- return this._isZoneStable && this._pendingCount === 0 && !this._ngZone.hasPendingMacrotasks;
- };
- Testability.prototype._runCallbacksIfReady = function () {
- var _this = this;
- if (this.isStable()) {
- // Schedules the call backs in a new frame so that it is always async.
- scheduleMicroTask(function () {
- while (_this._callbacks.length !== 0) {
- var cb = _this._callbacks.pop();
- clearTimeout(cb.timeoutId);
- cb.doneCb(_this._didWork);
- }
- _this._didWork = false;
- });
- }
- else {
- // Still not stable, send updates.
- var pending_1 = this.getPendingTasks();
- this._callbacks = this._callbacks.filter(function (cb) {
- if (cb.updateCb && cb.updateCb(pending_1)) {
- clearTimeout(cb.timeoutId);
- return false;
- }
- return true;
- });
- this._didWork = true;
- }
- };
- Testability.prototype.getPendingTasks = function () {
- if (!this.taskTrackingZone) {
- return [];
- }
- // Copy the tasks data so that we don't leak tasks.
- return this.taskTrackingZone.macroTasks.map(function (t) {
- return {
- source: t.source,
- // From TaskTrackingZone:
- // https://github.com/angular/zone.js/blob/master/lib/zone-spec/task-tracking.ts#L40
- creationLocation: t.creationLocation,
- data: t.data
- };
- });
- };
- Testability.prototype.addCallback = function (cb, timeout, updateCb) {
- var _this = this;
- var timeoutId = -1;
- if (timeout && timeout > 0) {
- timeoutId = setTimeout(function () {
- _this._callbacks = _this._callbacks.filter(function (cb) { return cb.timeoutId !== timeoutId; });
- cb(_this._didWork, _this.getPendingTasks());
- }, timeout);
- }
- this._callbacks.push({ doneCb: cb, timeoutId: timeoutId, updateCb: updateCb });
- };
- /**
- * Wait for the application to be stable with a timeout. If the timeout is reached before that
- * happens, the callback receives a list of the macro tasks that were pending, otherwise null.
- *
- * @param doneCb The callback to invoke when Angular is stable or the timeout expires
- * whichever comes first.
- * @param timeout Optional. The maximum time to wait for Angular to become stable. If not
- * specified, whenStable() will wait forever.
- * @param updateCb Optional. If specified, this callback will be invoked whenever the set of
- * pending macrotasks changes. If this callback returns true doneCb will not be invoked
- * and no further updates will be issued.
- */
- Testability.prototype.whenStable = function (doneCb, timeout, updateCb) {
- if (updateCb && !this.taskTrackingZone) {
- throw new Error('Task tracking zone is required when passing an update callback to ' +
- 'whenStable(). Is "zone.js/dist/task-tracking.js" loaded?');
- }
- // These arguments are 'Function' above to keep the public API simple.
- this.addCallback(doneCb, timeout, updateCb);
- this._runCallbacksIfReady();
- };
- /**
- * Get the number of pending requests
- * @deprecated pending requests are now tracked with zones
- */
- Testability.prototype.getPendingRequestCount = function () { return this._pendingCount; };
- /**
- * Find providers by name
- * @param using The root element to search from
- * @param provider The name of binding variable
- * @param exactMatch Whether using exactMatch
- */
- Testability.prototype.findProviders = function (using, provider, exactMatch) {
- // TODO(juliemr): implement.
- return [];
- };
- Testability = __decorate([
- Injectable(),
- __metadata("design:paramtypes", [NgZone])
- ], Testability);
- return Testability;
- }());
- /**
- * A global registry of {@link Testability} instances for specific elements.
- * @publicApi
- */
- var TestabilityRegistry = /** @class */ (function () {
- function TestabilityRegistry() {
- /** @internal */
- this._applications = new Map();
- _testabilityGetter.addToWindow(this);
- }
- /**
- * Registers an application with a testability hook so that it can be tracked
- * @param token token of application, root element
- * @param testability Testability hook
- */
- TestabilityRegistry.prototype.registerApplication = function (token, testability) {
- this._applications.set(token, testability);
- };
- /**
- * Unregisters an application.
- * @param token token of application, root element
- */
- TestabilityRegistry.prototype.unregisterApplication = function (token) { this._applications.delete(token); };
- /**
- * Unregisters all applications
- */
- TestabilityRegistry.prototype.unregisterAllApplications = function () { this._applications.clear(); };
- /**
- * Get a testability hook associated with the application
- * @param elem root element
- */
- TestabilityRegistry.prototype.getTestability = function (elem) { return this._applications.get(elem) || null; };
- /**
- * Get all registered testabilities
- */
- TestabilityRegistry.prototype.getAllTestabilities = function () { return Array.from(this._applications.values()); };
- /**
- * Get all registered applications(root elements)
- */
- TestabilityRegistry.prototype.getAllRootElements = function () { return Array.from(this._applications.keys()); };
- /**
- * Find testability of a node in the Tree
- * @param elem node
- * @param findInAncestors whether finding testability in ancestors if testability was not found in
- * current node
- */
- TestabilityRegistry.prototype.findTestabilityInTree = function (elem, findInAncestors) {
- if (findInAncestors === void 0) { findInAncestors = true; }
- return _testabilityGetter.findTestabilityInTree(this, elem, findInAncestors);
- };
- TestabilityRegistry = __decorate([
- Injectable(),
- __metadata("design:paramtypes", [])
- ], TestabilityRegistry);
- return TestabilityRegistry;
- }());
- var _NoopGetTestability = /** @class */ (function () {
- function _NoopGetTestability() {
- }
- _NoopGetTestability.prototype.addToWindow = function (registry) { };
- _NoopGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {
- return null;
- };
- return _NoopGetTestability;
- }());
- var _testabilityGetter = new _NoopGetTestability();
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _platform;
- var compileNgModuleFactory = compileNgModuleFactory__PRE_R3__;
- function compileNgModuleFactory__PRE_R3__(injector, options, moduleType) {
- var compilerFactory = injector.get(CompilerFactory);
- var compiler = compilerFactory.createCompiler([options]);
- return compiler.compileModuleAsync(moduleType);
- }
- var isBoundToModule = isBoundToModule__PRE_R3__;
- function isBoundToModule__PRE_R3__(cf) {
- return cf instanceof ComponentFactoryBoundToModule;
- }
- var ALLOW_MULTIPLE_PLATFORMS = new InjectionToken('AllowMultipleToken');
- /**
- * Creates a platform.
- * Platforms have to be eagerly created via this function.
- *
- * @publicApi
- */
- function createPlatform(injector) {
- if (_platform && !_platform.destroyed &&
- !_platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
- throw new Error('There can be only one platform. Destroy the previous one to create a new one.');
- }
- _platform = injector.get(PlatformRef);
- var inits = injector.get(PLATFORM_INITIALIZER, null);
- if (inits)
- inits.forEach(function (init) { return init(); });
- return _platform;
- }
- /**
- * Creates a factory for a platform
- *
- * @publicApi
- */
- function createPlatformFactory(parentPlatformFactory, name, providers) {
- if (providers === void 0) { providers = []; }
- var desc = "Platform: " + name;
- var marker = new InjectionToken(desc);
- return function (extraProviders) {
- if (extraProviders === void 0) { extraProviders = []; }
- var platform = getPlatform();
- if (!platform || platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
- if (parentPlatformFactory) {
- parentPlatformFactory(providers.concat(extraProviders).concat({ provide: marker, useValue: true }));
- }
- else {
- var injectedProviders = providers.concat(extraProviders).concat({ provide: marker, useValue: true });
- createPlatform(Injector.create({ providers: injectedProviders, name: desc }));
- }
- }
- return assertPlatform(marker);
- };
- }
- /**
- * Checks that there currently is a platform which contains the given token as a provider.
- *
- * @publicApi
- */
- function assertPlatform(requiredToken) {
- var platform = getPlatform();
- if (!platform) {
- throw new Error('No platform exists!');
- }
- if (!platform.injector.get(requiredToken, null)) {
- throw new Error('A platform with a different configuration has been created. Please destroy it first.');
- }
- return platform;
- }
- /**
- * Returns the current platform.
- *
- * @publicApi
- */
- function getPlatform() {
- return _platform && !_platform.destroyed ? _platform : null;
- }
- /**
- * The Angular platform is the entry point for Angular on a web page. Each page
- * has exactly one platform, and services (such as reflection) which are common
- * to every Angular application running on the page are bound in its scope.
- *
- * A page's platform is initialized implicitly when a platform is created via a platform factory
- * (e.g. {@link platformBrowser}), or explicitly by calling the {@link createPlatform} function.
- *
- * @publicApi
- */
- var PlatformRef = /** @class */ (function () {
- /** @internal */
- function PlatformRef(_injector) {
- this._injector = _injector;
- this._modules = [];
- this._destroyListeners = [];
- this._destroyed = false;
- }
- /**
- * Creates an instance of an `@NgModule` for the given platform
- * for offline compilation.
- *
- * @usageNotes
- * ### Simple Example
- *
- * ```typescript
- * my_module.ts:
- *
- * @NgModule({
- * imports: [BrowserModule]
- * })
- * class MyModule {}
- *
- * main.ts:
- * import {MyModuleNgFactory} from './my_module.ngfactory';
- * import {platformBrowser} from '@angular/platform-browser';
- *
- * let moduleRef = platformBrowser().bootstrapModuleFactory(MyModuleNgFactory);
- * ```
- */
- PlatformRef.prototype.bootstrapModuleFactory = function (moduleFactory, options) {
- var _this = this;
- // Note: We need to create the NgZone _before_ we instantiate the module,
- // as instantiating the module creates some providers eagerly.
- // So we create a mini parent injector that just contains the new NgZone and
- // pass that as parent to the NgModuleFactory.
- var ngZoneOption = options ? options.ngZone : undefined;
- var ngZone = getNgZone(ngZoneOption);
- var providers = [{ provide: NgZone, useValue: ngZone }];
- // Attention: Don't use ApplicationRef.run here,
- // as we want to be sure that all possible constructor calls are inside `ngZone.run`!
- return ngZone.run(function () {
- var ngZoneInjector = Injector.create({ providers: providers, parent: _this.injector, name: moduleFactory.moduleType.name });
- var moduleRef = moduleFactory.create(ngZoneInjector);
- var exceptionHandler = moduleRef.injector.get(ErrorHandler, null);
- if (!exceptionHandler) {
- throw new Error('No ErrorHandler. Is platform module (BrowserModule) included?');
- }
- // If the `LOCALE_ID` provider is defined at bootstrap we set the value for runtime i18n (ivy)
- var localeId = moduleRef.injector.get(LOCALE_ID$1, DEFAULT_LOCALE_ID);
- setLocaleId(localeId);
- moduleRef.onDestroy(function () { return remove(_this._modules, moduleRef); });
- ngZone.runOutsideAngular(function () { return ngZone.onError.subscribe({ next: function (error) { exceptionHandler.handleError(error); } }); });
- return _callAndReportToErrorHandler(exceptionHandler, ngZone, function () {
- var initStatus = moduleRef.injector.get(ApplicationInitStatus);
- initStatus.runInitializers();
- return initStatus.donePromise.then(function () {
- _this._moduleDoBootstrap(moduleRef);
- return moduleRef;
- });
- });
- });
- };
- /**
- * Creates an instance of an `@NgModule` for a given platform using the given runtime compiler.
- *
- * @usageNotes
- * ### Simple Example
- *
- * ```typescript
- * @NgModule({
- * imports: [BrowserModule]
- * })
- * class MyModule {}
- *
- * let moduleRef = platformBrowser().bootstrapModule(MyModule);
- * ```
- *
- */
- PlatformRef.prototype.bootstrapModule = function (moduleType, compilerOptions) {
- var _this = this;
- if (compilerOptions === void 0) { compilerOptions = []; }
- var options = optionsReducer({}, compilerOptions);
- return compileNgModuleFactory(this.injector, options, moduleType)
- .then(function (moduleFactory) { return _this.bootstrapModuleFactory(moduleFactory, options); });
- };
- PlatformRef.prototype._moduleDoBootstrap = function (moduleRef) {
- var appRef = moduleRef.injector.get(ApplicationRef);
- if (moduleRef._bootstrapComponents.length > 0) {
- moduleRef._bootstrapComponents.forEach(function (f) { return appRef.bootstrap(f); });
- }
- else if (moduleRef.instance.ngDoBootstrap) {
- moduleRef.instance.ngDoBootstrap(appRef);
- }
- else {
- throw new Error("The module " + stringify$1(moduleRef.instance.constructor) + " was bootstrapped, but it does not declare \"@NgModule.bootstrap\" components nor a \"ngDoBootstrap\" method. " +
- "Please define one of these.");
- }
- this._modules.push(moduleRef);
- };
- /**
- * Register a listener to be called when the platform is disposed.
- */
- PlatformRef.prototype.onDestroy = function (callback) { this._destroyListeners.push(callback); };
- Object.defineProperty(PlatformRef.prototype, "injector", {
- /**
- * Retrieve the platform {@link Injector}, which is the parent injector for
- * every Angular application on the page and provides singleton providers.
- */
- get: function () { return this._injector; },
- enumerable: true,
- configurable: true
- });
- /**
- * Destroy the Angular platform and all Angular applications on the page.
- */
- PlatformRef.prototype.destroy = function () {
- if (this._destroyed) {
- throw new Error('The platform has already been destroyed!');
- }
- this._modules.slice().forEach(function (module) { return module.destroy(); });
- this._destroyListeners.forEach(function (listener) { return listener(); });
- this._destroyed = true;
- };
- Object.defineProperty(PlatformRef.prototype, "destroyed", {
- get: function () { return this._destroyed; },
- enumerable: true,
- configurable: true
- });
- PlatformRef = __decorate([
- Injectable(),
- __metadata("design:paramtypes", [Injector])
- ], PlatformRef);
- return PlatformRef;
- }());
- function getNgZone(ngZoneOption) {
- var ngZone;
- if (ngZoneOption === 'noop') {
- ngZone = new NoopNgZone();
- }
- else {
- ngZone = (ngZoneOption === 'zone.js' ? undefined : ngZoneOption) ||
- new NgZone({ enableLongStackTrace: isDevMode() });
- }
- return ngZone;
- }
- function _callAndReportToErrorHandler(errorHandler, ngZone, callback) {
- try {
- var result = callback();
- if (isPromise$1(result)) {
- return result.catch(function (e) {
- ngZone.runOutsideAngular(function () { return errorHandler.handleError(e); });
- // rethrow as the exception handler might not do it
- throw e;
- });
- }
- return result;
- }
- catch (e) {
- ngZone.runOutsideAngular(function () { return errorHandler.handleError(e); });
- // rethrow as the exception handler might not do it
- throw e;
- }
- }
- function optionsReducer(dst, objs) {
- if (Array.isArray(objs)) {
- dst = objs.reduce(optionsReducer, dst);
- }
- else {
- dst = __assign({}, dst, objs);
- }
- return dst;
- }
- /**
- * A reference to an Angular application running on a page.
- *
- * @usageNotes
- *
- * {@a is-stable-examples}
- * ### isStable examples and caveats
- *
- * Note two important points about `isStable`, demonstrated in the examples below:
- * - the application will never be stable if you start any kind
- * of recurrent asynchronous task when the application starts
- * (for example for a polling process, started with a `setInterval`, a `setTimeout`
- * or using RxJS operators like `interval`);
- * - the `isStable` Observable runs outside of the Angular zone.
- *
- * Let's imagine that you start a recurrent task
- * (here incrementing a counter, using RxJS `interval`),
- * and at the same time subscribe to `isStable`.
- *
- * ```
- * constructor(appRef: ApplicationRef) {
- * appRef.isStable.pipe(
- * filter(stable => stable)
- * ).subscribe(() => console.log('App is stable now');
- * interval(1000).subscribe(counter => console.log(counter));
- * }
- * ```
- * In this example, `isStable` will never emit `true`,
- * and the trace "App is stable now" will never get logged.
- *
- * If you want to execute something when the app is stable,
- * you have to wait for the application to be stable
- * before starting your polling process.
- *
- * ```
- * constructor(appRef: ApplicationRef) {
- * appRef.isStable.pipe(
- * first(stable => stable),
- * tap(stable => console.log('App is stable now')),
- * switchMap(() => interval(1000))
- * ).subscribe(counter => console.log(counter));
- * }
- * ```
- * In this example, the trace "App is stable now" will be logged
- * and then the counter starts incrementing every second.
- *
- * Note also that this Observable runs outside of the Angular zone,
- * which means that the code in the subscription
- * to this Observable will not trigger the change detection.
- *
- * Let's imagine that instead of logging the counter value,
- * you update a field of your component
- * and display it in its template.
- *
- * ```
- * constructor(appRef: ApplicationRef) {
- * appRef.isStable.pipe(
- * first(stable => stable),
- * switchMap(() => interval(1000))
- * ).subscribe(counter => this.value = counter);
- * }
- * ```
- * As the `isStable` Observable runs outside the zone,
- * the `value` field will be updated properly,
- * but the template will not be refreshed!
- *
- * You'll have to manually trigger the change detection to update the template.
- *
- * ```
- * constructor(appRef: ApplicationRef, cd: ChangeDetectorRef) {
- * appRef.isStable.pipe(
- * first(stable => stable),
- * switchMap(() => interval(1000))
- * ).subscribe(counter => {
- * this.value = counter;
- * cd.detectChanges();
- * });
- * }
- * ```
- *
- * Or make the subscription callback run inside the zone.
- *
- * ```
- * constructor(appRef: ApplicationRef, zone: NgZone) {
- * appRef.isStable.pipe(
- * first(stable => stable),
- * switchMap(() => interval(1000))
- * ).subscribe(counter => zone.run(() => this.value = counter));
- * }
- * ```
- *
- * @publicApi
- */
- var ApplicationRef = /** @class */ (function () {
- /** @internal */
- function ApplicationRef(_zone, _console, _injector, _exceptionHandler, _componentFactoryResolver, _initStatus) {
- var _this = this;
- this._zone = _zone;
- this._console = _console;
- this._injector = _injector;
- this._exceptionHandler = _exceptionHandler;
- this._componentFactoryResolver = _componentFactoryResolver;
- this._initStatus = _initStatus;
- this._bootstrapListeners = [];
- this._views = [];
- this._runningTick = false;
- this._enforceNoNewChanges = false;
- this._stable = true;
- /**
- * Get a list of component types registered to this application.
- * This list is populated even before the component is created.
- */
- this.componentTypes = [];
- /**
- * Get a list of components registered to this application.
- */
- this.components = [];
- this._enforceNoNewChanges = isDevMode();
- this._zone.onMicrotaskEmpty.subscribe({ next: function () { _this._zone.run(function () { _this.tick(); }); } });
- var isCurrentlyStable = new Observable(function (observer) {
- _this._stable = _this._zone.isStable && !_this._zone.hasPendingMacrotasks &&
- !_this._zone.hasPendingMicrotasks;
- _this._zone.runOutsideAngular(function () {
- observer.next(_this._stable);
- observer.complete();
- });
- });
- var isStable = new Observable(function (observer) {
- // Create the subscription to onStable outside the Angular Zone so that
- // the callback is run outside the Angular Zone.
- var stableSub;
- _this._zone.runOutsideAngular(function () {
- stableSub = _this._zone.onStable.subscribe(function () {
- NgZone.assertNotInAngularZone();
- // Check whether there are no pending macro/micro tasks in the next tick
- // to allow for NgZone to update the state.
- scheduleMicroTask(function () {
- if (!_this._stable && !_this._zone.hasPendingMacrotasks &&
- !_this._zone.hasPendingMicrotasks) {
- _this._stable = true;
- observer.next(true);
- }
- });
- });
- });
- var unstableSub = _this._zone.onUnstable.subscribe(function () {
- NgZone.assertInAngularZone();
- if (_this._stable) {
- _this._stable = false;
- _this._zone.runOutsideAngular(function () { observer.next(false); });
- }
- });
- return function () {
- stableSub.unsubscribe();
- unstableSub.unsubscribe();
- };
- });
- this.isStable =
- merge$1(isCurrentlyStable, isStable.pipe(share()));
- }
- ApplicationRef_1 = ApplicationRef;
- /**
- * Bootstrap a new component at the root level of the application.
- *
- * @usageNotes
- * ### Bootstrap process
- *
- * When bootstrapping a new root component into an application, Angular mounts the
- * specified application component onto DOM elements identified by the componentType's
- * selector and kicks off automatic change detection to finish initializing the component.
- *
- * Optionally, a component can be mounted onto a DOM element that does not match the
- * componentType's selector.
- *
- * ### Example
- * {@example core/ts/platform/platform.ts region='longform'}
- */
- ApplicationRef.prototype.bootstrap = function (componentOrFactory, rootSelectorOrNode) {
- var _this = this;
- if (!this._initStatus.done) {
- throw new Error('Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.');
- }
- var componentFactory;
- if (componentOrFactory instanceof ComponentFactory) {
- componentFactory = componentOrFactory;
- }
- else {
- componentFactory =
- this._componentFactoryResolver.resolveComponentFactory(componentOrFactory);
- }
- this.componentTypes.push(componentFactory.componentType);
- // Create a factory associated with the current module if it's not bound to some other
- var ngModule = isBoundToModule(componentFactory) ? null : this._injector.get(NgModuleRef);
- var selectorOrNode = rootSelectorOrNode || componentFactory.selector;
- var compRef = componentFactory.create(Injector.NULL, [], selectorOrNode, ngModule);
- compRef.onDestroy(function () { _this._unloadComponent(compRef); });
- var testability = compRef.injector.get(Testability, null);
- if (testability) {
- compRef.injector.get(TestabilityRegistry)
- .registerApplication(compRef.location.nativeElement, testability);
- }
- this._loadComponent(compRef);
- if (isDevMode()) {
- this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode.");
- }
- return compRef;
- };
- /**
- * Invoke this method to explicitly process change detection and its side-effects.
- *
- * In development mode, `tick()` also performs a second change detection cycle to ensure that no
- * further changes are detected. If additional changes are picked up during this second cycle,
- * bindings in the app have side-effects that cannot be resolved in a single change detection
- * pass.
- * In this case, Angular throws an error, since an Angular application can only have one change
- * detection pass during which all change detection must complete.
- */
- ApplicationRef.prototype.tick = function () {
- var _this = this;
- var e_1, _a, e_2, _b;
- if (this._runningTick) {
- throw new Error('ApplicationRef.tick is called recursively');
- }
- var scope = ApplicationRef_1._tickScope();
- try {
- this._runningTick = true;
- try {
- for (var _c = __values(this._views), _d = _c.next(); !_d.done; _d = _c.next()) {
- var view = _d.value;
- view.detectChanges();
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_1) throw e_1.error; }
- }
- if (this._enforceNoNewChanges) {
- try {
- for (var _e = __values(this._views), _f = _e.next(); !_f.done; _f = _e.next()) {
- var view = _f.value;
- view.checkNoChanges();
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- }
- catch (e) {
- // Attention: Don't rethrow as it could cancel subscriptions to Observables!
- this._zone.runOutsideAngular(function () { return _this._exceptionHandler.handleError(e); });
- }
- finally {
- this._runningTick = false;
- wtfLeave(scope);
- }
- };
- /**
- * Attaches a view so that it will be dirty checked.
- * The view will be automatically detached when it is destroyed.
- * This will throw if the view is already attached to a ViewContainer.
- */
- ApplicationRef.prototype.attachView = function (viewRef) {
- var view = viewRef;
- this._views.push(view);
- view.attachToAppRef(this);
- };
- /**
- * Detaches a view from dirty checking again.
- */
- ApplicationRef.prototype.detachView = function (viewRef) {
- var view = viewRef;
- remove(this._views, view);
- view.detachFromAppRef();
- };
- ApplicationRef.prototype._loadComponent = function (componentRef) {
- this.attachView(componentRef.hostView);
- this.tick();
- this.components.push(componentRef);
- // Get the listeners lazily to prevent DI cycles.
- var listeners = this._injector.get(APP_BOOTSTRAP_LISTENER, []).concat(this._bootstrapListeners);
- listeners.forEach(function (listener) { return listener(componentRef); });
- };
- ApplicationRef.prototype._unloadComponent = function (componentRef) {
- this.detachView(componentRef.hostView);
- remove(this.components, componentRef);
- };
- /** @internal */
- ApplicationRef.prototype.ngOnDestroy = function () {
- // TODO(alxhub): Dispose of the NgZone.
- this._views.slice().forEach(function (view) { return view.destroy(); });
- };
- Object.defineProperty(ApplicationRef.prototype, "viewCount", {
- /**
- * Returns the number of attached views.
- */
- get: function () { return this._views.length; },
- enumerable: true,
- configurable: true
- });
- var ApplicationRef_1;
- /** @internal */
- ApplicationRef._tickScope = wtfCreateScope('ApplicationRef#tick()');
- ApplicationRef = ApplicationRef_1 = __decorate([
- Injectable(),
- __metadata("design:paramtypes", [NgZone, Console, Injector,
- ErrorHandler,
- ComponentFactoryResolver,
- ApplicationInitStatus])
- ], ApplicationRef);
- return ApplicationRef;
- }());
- function remove(list, el) {
- var index = list.indexOf(el);
- if (index > -1) {
- list.splice(index, 1);
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var SWITCH_IVY_ENABLED__PRE_R3__ = false;
- var ivyEnabled = SWITCH_IVY_ENABLED__PRE_R3__;
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _SEPARATOR = '#';
- var FACTORY_CLASS_SUFFIX = 'NgFactory';
- /**
- * Configuration for SystemJsNgModuleLoader.
- * token.
- *
- * @publicApi
- * @deprecated the `string` form of `loadChildren` is deprecated, and `SystemJsNgModuleLoaderConfig`
- * is part of its implementation. See `LoadChildren` for more details.
- */
- var SystemJsNgModuleLoaderConfig = /** @class */ (function () {
- function SystemJsNgModuleLoaderConfig() {
- }
- return SystemJsNgModuleLoaderConfig;
- }());
- var DEFAULT_CONFIG = {
- factoryPathPrefix: '',
- factoryPathSuffix: '.ngfactory',
- };
- /**
- * NgModuleFactoryLoader that uses SystemJS to load NgModuleFactory
- * @publicApi
- * @deprecated the `string` form of `loadChildren` is deprecated, and `SystemJsNgModuleLoader` is
- * part of its implementation. See `LoadChildren` for more details.
- */
- var SystemJsNgModuleLoader = /** @class */ (function () {
- function SystemJsNgModuleLoader(_compiler, config) {
- this._compiler = _compiler;
- this._config = config || DEFAULT_CONFIG;
- }
- SystemJsNgModuleLoader.prototype.load = function (path) {
- var legacyOfflineMode = !ivyEnabled && this._compiler instanceof Compiler;
- return legacyOfflineMode ? this.loadFactory(path) : this.loadAndCompile(path);
- };
- SystemJsNgModuleLoader.prototype.loadAndCompile = function (path) {
- var _this = this;
- var _a = __read(path.split(_SEPARATOR), 2), module = _a[0], exportName = _a[1];
- if (exportName === undefined) {
- exportName = 'default';
- }
- return System.import(module)
- .then(function (module) { return module[exportName]; })
- .then(function (type) { return checkNotEmpty(type, module, exportName); })
- .then(function (type) { return _this._compiler.compileModuleAsync(type); });
- };
- SystemJsNgModuleLoader.prototype.loadFactory = function (path) {
- var _a = __read(path.split(_SEPARATOR), 2), module = _a[0], exportName = _a[1];
- var factoryClassSuffix = FACTORY_CLASS_SUFFIX;
- if (exportName === undefined) {
- exportName = 'default';
- factoryClassSuffix = '';
- }
- return System.import(this._config.factoryPathPrefix + module + this._config.factoryPathSuffix)
- .then(function (module) { return module[exportName + factoryClassSuffix]; })
- .then(function (factory) { return checkNotEmpty(factory, module, exportName); });
- };
- SystemJsNgModuleLoader = __decorate([
- Injectable(),
- __param(1, Optional()),
- __metadata("design:paramtypes", [Compiler, SystemJsNgModuleLoaderConfig])
- ], SystemJsNgModuleLoader);
- return SystemJsNgModuleLoader;
- }());
- function checkNotEmpty(value, modulePath, exportName) {
- if (!value) {
- throw new Error("Cannot find '" + exportName + "' in '" + modulePath + "'");
- }
- return value;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Represents an Angular [view](guide/glossary#view),
- * specifically the [host view](guide/glossary#view-tree) that is defined by a component.
- * Also serves as the base class
- * that adds destroy methods for [embedded views](guide/glossary#view-tree).
- *
- * @see `EmbeddedViewRef`
- *
- * @publicApi
- */
- var ViewRef$1 = /** @class */ (function (_super) {
- __extends(ViewRef, _super);
- function ViewRef() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return ViewRef;
- }(ChangeDetectorRef));
- /**
- * Represents an Angular [view](guide/glossary#view) in a view container.
- * An [embedded view](guide/glossary#view-tree) can be referenced from a component
- * other than the hosting component whose template defines it, or it can be defined
- * independently by a `TemplateRef`.
- *
- * Properties of elements in a view can change, but the structure (number and order) of elements in
- * a view cannot. Change the structure of elements by inserting, moving, or
- * removing nested views in a view container.
- *
- * @see `ViewContainerRef`
- *
- * @usageNotes
- *
- * The following template breaks down into two separate `TemplateRef` instances,
- * an outer one and an inner one.
- *
- * ```
- * Count: {{items.length}}
- * <ul>
- * <li *ngFor="let item of items">{{item}}</li>
- * </ul>
- * ```
- *
- * This is the outer `TemplateRef`:
- *
- * ```
- * Count: {{items.length}}
- * <ul>
- * <ng-template ngFor let-item [ngForOf]="items"></ng-template>
- * </ul>
- * ```
- *
- * This is the inner `TemplateRef`:
- *
- * ```
- * <li>{{item}}</li>
- * ```
- *
- * The outer and inner `TemplateRef` instances are assembled into views as follows:
- *
- * ```
- * <!-- ViewRef: outer-0 -->
- * Count: 2
- * <ul>
- * <ng-template view-container-ref></ng-template>
- * <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->
- * <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->
- * </ul>
- * <!-- /ViewRef: outer-0 -->
- * ```
- * @publicApi
- */
- var EmbeddedViewRef = /** @class */ (function (_super) {
- __extends(EmbeddedViewRef, _super);
- function EmbeddedViewRef() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return EmbeddedViewRef;
- }(ViewRef$1));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @publicApi
- */
- var DebugEventListener = /** @class */ (function () {
- function DebugEventListener(name, callback) {
- this.name = name;
- this.callback = callback;
- }
- return DebugEventListener;
- }());
- var DebugNode__PRE_R3__ = /** @class */ (function () {
- function DebugNode__PRE_R3__(nativeNode, parent, _debugContext) {
- this.listeners = [];
- this.parent = null;
- this._debugContext = _debugContext;
- this.nativeNode = nativeNode;
- if (parent && parent instanceof DebugElement__PRE_R3__) {
- parent.addChild(this);
- }
- }
- Object.defineProperty(DebugNode__PRE_R3__.prototype, "injector", {
- get: function () { return this._debugContext.injector; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__PRE_R3__.prototype, "componentInstance", {
- get: function () { return this._debugContext.component; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__PRE_R3__.prototype, "context", {
- get: function () { return this._debugContext.context; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__PRE_R3__.prototype, "references", {
- get: function () { return this._debugContext.references; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__PRE_R3__.prototype, "providerTokens", {
- get: function () { return this._debugContext.providerTokens; },
- enumerable: true,
- configurable: true
- });
- return DebugNode__PRE_R3__;
- }());
- var DebugElement__PRE_R3__ = /** @class */ (function (_super) {
- __extends(DebugElement__PRE_R3__, _super);
- function DebugElement__PRE_R3__(nativeNode, parent, _debugContext) {
- var _this = _super.call(this, nativeNode, parent, _debugContext) || this;
- _this.properties = {};
- _this.attributes = {};
- _this.classes = {};
- _this.styles = {};
- _this.childNodes = [];
- _this.nativeElement = nativeNode;
- return _this;
- }
- DebugElement__PRE_R3__.prototype.addChild = function (child) {
- if (child) {
- this.childNodes.push(child);
- child.parent = this;
- }
- };
- DebugElement__PRE_R3__.prototype.removeChild = function (child) {
- var childIndex = this.childNodes.indexOf(child);
- if (childIndex !== -1) {
- child.parent = null;
- this.childNodes.splice(childIndex, 1);
- }
- };
- DebugElement__PRE_R3__.prototype.insertChildrenAfter = function (child, newChildren) {
- var _this = this;
- var _a;
- var siblingIndex = this.childNodes.indexOf(child);
- if (siblingIndex !== -1) {
- (_a = this.childNodes).splice.apply(_a, __spread([siblingIndex + 1, 0], newChildren));
- newChildren.forEach(function (c) {
- if (c.parent) {
- c.parent.removeChild(c);
- }
- child.parent = _this;
- });
- }
- };
- DebugElement__PRE_R3__.prototype.insertBefore = function (refChild, newChild) {
- var refIndex = this.childNodes.indexOf(refChild);
- if (refIndex === -1) {
- this.addChild(newChild);
- }
- else {
- if (newChild.parent) {
- newChild.parent.removeChild(newChild);
- }
- newChild.parent = this;
- this.childNodes.splice(refIndex, 0, newChild);
- }
- };
- DebugElement__PRE_R3__.prototype.query = function (predicate) {
- var results = this.queryAll(predicate);
- return results[0] || null;
- };
- DebugElement__PRE_R3__.prototype.queryAll = function (predicate) {
- var matches = [];
- _queryElementChildren(this, predicate, matches);
- return matches;
- };
- DebugElement__PRE_R3__.prototype.queryAllNodes = function (predicate) {
- var matches = [];
- _queryNodeChildren(this, predicate, matches);
- return matches;
- };
- Object.defineProperty(DebugElement__PRE_R3__.prototype, "children", {
- get: function () {
- return this
- .childNodes //
- .filter(function (node) { return node instanceof DebugElement__PRE_R3__; });
- },
- enumerable: true,
- configurable: true
- });
- DebugElement__PRE_R3__.prototype.triggerEventHandler = function (eventName, eventObj) {
- this.listeners.forEach(function (listener) {
- if (listener.name == eventName) {
- listener.callback(eventObj);
- }
- });
- };
- return DebugElement__PRE_R3__;
- }(DebugNode__PRE_R3__));
- function _queryElementChildren(element, predicate, matches) {
- element.childNodes.forEach(function (node) {
- if (node instanceof DebugElement__PRE_R3__) {
- if (predicate(node)) {
- matches.push(node);
- }
- _queryElementChildren(node, predicate, matches);
- }
- });
- }
- function _queryNodeChildren(parentNode, predicate, matches) {
- if (parentNode instanceof DebugElement__PRE_R3__) {
- parentNode.childNodes.forEach(function (node) {
- if (predicate(node)) {
- matches.push(node);
- }
- if (node instanceof DebugElement__PRE_R3__) {
- _queryNodeChildren(node, predicate, matches);
- }
- });
- }
- }
- var DebugNode__POST_R3__ = /** @class */ (function () {
- function DebugNode__POST_R3__(nativeNode) {
- this.nativeNode = nativeNode;
- }
- Object.defineProperty(DebugNode__POST_R3__.prototype, "parent", {
- get: function () {
- var parent = this.nativeNode.parentNode;
- return parent ? new DebugElement__POST_R3__(parent) : null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__POST_R3__.prototype, "injector", {
- get: function () { return getInjector(this.nativeNode); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__POST_R3__.prototype, "componentInstance", {
- get: function () {
- var nativeElement = this.nativeNode;
- return nativeElement &&
- (getComponent(nativeElement) || getViewComponent(nativeElement));
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__POST_R3__.prototype, "context", {
- get: function () { return getContext(this.nativeNode); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__POST_R3__.prototype, "listeners", {
- get: function () {
- return getListeners(this.nativeNode).filter(isBrowserEvents);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__POST_R3__.prototype, "references", {
- get: function () { return getLocalRefs(this.nativeNode); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugNode__POST_R3__.prototype, "providerTokens", {
- get: function () { return getInjectionTokens(this.nativeNode); },
- enumerable: true,
- configurable: true
- });
- return DebugNode__POST_R3__;
- }());
- var DebugElement__POST_R3__ = /** @class */ (function (_super) {
- __extends(DebugElement__POST_R3__, _super);
- function DebugElement__POST_R3__(nativeNode) {
- var _this = this;
- ngDevMode && assertDomNode(nativeNode);
- _this = _super.call(this, nativeNode) || this;
- return _this;
- }
- Object.defineProperty(DebugElement__POST_R3__.prototype, "nativeElement", {
- get: function () {
- return this.nativeNode.nodeType == Node.ELEMENT_NODE ? this.nativeNode : null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement__POST_R3__.prototype, "name", {
- get: function () { return this.nativeElement.nodeName; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement__POST_R3__.prototype, "properties", {
- /**
- * Gets a map of property names to property values for an element.
- *
- * This map includes:
- * - Regular property bindings (e.g. `[id]="id"`)
- * - Host property bindings (e.g. `host: { '[id]': "id" }`)
- * - Interpolated property bindings (e.g. `id="{{ value }}")
- *
- * It does not include:
- * - input property bindings (e.g. `[myCustomInput]="value"`)
- * - attribute bindings (e.g. `[attr.role]="menu"`)
- */
- get: function () {
- var context = loadLContext(this.nativeNode);
- var lView = context.lView;
- var tData = lView[TVIEW].data;
- var tNode = tData[context.nodeIndex];
- var properties = collectPropertyBindings(tNode, lView, tData);
- var hostProperties = collectHostPropertyBindings(tNode, lView, tData);
- var className = collectClassNames(this);
- var output = __assign({}, properties, hostProperties);
- if (className) {
- output['className'] = output['className'] ? output['className'] + (" " + className) : className;
- }
- return output;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement__POST_R3__.prototype, "attributes", {
- get: function () {
- var attributes = {};
- var element = this.nativeElement;
- if (!element) {
- return attributes;
- }
- var context = loadLContext(element);
- var lView = context.lView;
- var tNodeAttrs = lView[TVIEW].data[context.nodeIndex].attrs;
- var lowercaseTNodeAttrs = [];
- // For debug nodes we take the element's attribute directly from the DOM since it allows us
- // to account for ones that weren't set via bindings (e.g. ViewEngine keeps track of the ones
- // that are set through `Renderer2`). The problem is that the browser will lowercase all names,
- // however since we have the attributes already on the TNode, we can preserve the case by going
- // through them once, adding them to the `attributes` map and putting their lower-cased name
- // into an array. Afterwards when we're going through the native DOM attributes, we can check
- // whether we haven't run into an attribute already through the TNode.
- if (tNodeAttrs) {
- var i = 0;
- while (i < tNodeAttrs.length) {
- var attrName = tNodeAttrs[i];
- // Stop as soon as we hit a marker. We only care about the regular attributes. Everything
- // else will be handled below when we read the final attributes off the DOM.
- if (typeof attrName !== 'string')
- break;
- var attrValue = tNodeAttrs[i + 1];
- attributes[attrName] = attrValue;
- lowercaseTNodeAttrs.push(attrName.toLowerCase());
- i += 2;
- }
- }
- var eAttrs = element.attributes;
- for (var i = 0; i < eAttrs.length; i++) {
- var attr = eAttrs[i];
- // Make sure that we don't assign the same attribute both in its
- // case-sensitive form and the lower-cased one from the browser.
- if (lowercaseTNodeAttrs.indexOf(attr.name) === -1) {
- attributes[attr.name] = attr.value;
- }
- }
- return attributes;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement__POST_R3__.prototype, "classes", {
- get: function () {
- var classes = {};
- var element = this.nativeElement;
- if (element) {
- var lContext = loadLContextFromNode(element);
- var stylingContext = getStylingContextFromLView(lContext.nodeIndex, lContext.lView);
- if (stylingContext) {
- for (var i = 10 /* SingleStylesStartPosition */; i < stylingContext.length; i += 4 /* Size */) {
- if (isClassBasedValue(stylingContext, i)) {
- var className = getProp(stylingContext, i);
- var value = getValue(stylingContext, i);
- if (typeof value == 'boolean') {
- // we want to ignore `null` since those don't overwrite the values.
- classes[className] = value;
- }
- }
- }
- }
- else {
- // Fallback, just read DOM.
- var eClasses = element.classList;
- for (var i = 0; i < eClasses.length; i++) {
- classes[eClasses[i]] = true;
- }
- }
- }
- return classes;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement__POST_R3__.prototype, "styles", {
- get: function () {
- var styles = {};
- var element = this.nativeElement;
- if (element) {
- var lContext = loadLContextFromNode(element);
- var stylingContext = getStylingContextFromLView(lContext.nodeIndex, lContext.lView);
- if (stylingContext) {
- for (var i = 10 /* SingleStylesStartPosition */; i < stylingContext.length; i += 4 /* Size */) {
- if (!isClassBasedValue(stylingContext, i)) {
- var styleName = getProp(stylingContext, i);
- var value = getValue(stylingContext, i);
- if (value !== null) {
- // we want to ignore `null` since those don't overwrite the values.
- styles[styleName] = value;
- }
- }
- }
- }
- else {
- // Fallback, just read DOM.
- var eStyles = element.style;
- for (var i = 0; i < eStyles.length; i++) {
- var name_1 = eStyles.item(i);
- styles[name_1] = eStyles.getPropertyValue(name_1);
- }
- }
- }
- return styles;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement__POST_R3__.prototype, "childNodes", {
- get: function () {
- var childNodes = this.nativeNode.childNodes;
- var children = [];
- for (var i = 0; i < childNodes.length; i++) {
- var element = childNodes[i];
- children.push(getDebugNode__POST_R3__(element));
- }
- return children;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugElement__POST_R3__.prototype, "children", {
- get: function () {
- var nativeElement = this.nativeElement;
- if (!nativeElement)
- return [];
- var childNodes = nativeElement.children;
- var children = [];
- for (var i = 0; i < childNodes.length; i++) {
- var element = childNodes[i];
- children.push(getDebugNode__POST_R3__(element));
- }
- return children;
- },
- enumerable: true,
- configurable: true
- });
- DebugElement__POST_R3__.prototype.query = function (predicate) {
- var results = this.queryAll(predicate);
- return results[0] || null;
- };
- DebugElement__POST_R3__.prototype.queryAll = function (predicate) {
- var matches = [];
- _queryAllR3(this, predicate, matches, true);
- return matches;
- };
- DebugElement__POST_R3__.prototype.queryAllNodes = function (predicate) {
- var matches = [];
- _queryAllR3(this, predicate, matches, false);
- return matches;
- };
- DebugElement__POST_R3__.prototype.triggerEventHandler = function (eventName, eventObj) {
- this.listeners.forEach(function (listener) {
- if (listener.name === eventName) {
- listener.callback(eventObj);
- }
- });
- };
- return DebugElement__POST_R3__;
- }(DebugNode__POST_R3__));
- /**
- * Walk the TNode tree to find matches for the predicate.
- *
- * @param parentElement the element from which the walk is started
- * @param predicate the predicate to match
- * @param matches the list of positive matches
- * @param elementsOnly whether only elements should be searched
- */
- function _queryAllR3(parentElement, predicate, matches, elementsOnly) {
- var context = loadLContext(parentElement.nativeNode);
- var parentTNode = context.lView[TVIEW].data[context.nodeIndex];
- _queryNodeChildrenR3(parentTNode, context.lView, predicate, matches, elementsOnly, parentElement.nativeNode);
- }
- /**
- * Recursively match the current TNode against the predicate, and goes on with the next ones.
- *
- * @param tNode the current TNode
- * @param lView the LView of this TNode
- * @param predicate the predicate to match
- * @param matches the list of positive matches
- * @param elementsOnly whether only elements should be searched
- * @param rootNativeNode the root native node on which prediccate shouold not be matched
- */
- function _queryNodeChildrenR3(tNode, lView, predicate, matches, elementsOnly, rootNativeNode) {
- var e_1, _a;
- var nativeNode = getNativeByTNode(tNode, lView);
- // For each type of TNode, specific logic is executed.
- if (tNode.type === 3 /* Element */ || tNode.type === 4 /* ElementContainer */) {
- // Case 1: the TNode is an element
- // The native node has to be checked.
- _addQueryMatchR3(nativeNode, predicate, matches, elementsOnly, rootNativeNode);
- if (isComponent(tNode)) {
- // If the element is the host of a component, then all nodes in its view have to be processed.
- // Note: the component's content (tNode.child) will be processed from the insertion points.
- var componentView = getComponentViewByIndex(tNode.index, lView);
- if (componentView && componentView[TVIEW].firstChild) {
- _queryNodeChildrenR3(componentView[TVIEW].firstChild, componentView, predicate, matches, elementsOnly, rootNativeNode);
- }
- }
- else if (tNode.child) {
- // Otherwise, its children have to be processed.
- _queryNodeChildrenR3(tNode.child, lView, predicate, matches, elementsOnly, rootNativeNode);
- }
- // In all cases, if a dynamic container exists for this node, each view inside it has to be
- // processed.
- var nodeOrContainer = lView[tNode.index];
- if (isLContainer(nodeOrContainer)) {
- _queryNodeChildrenInContainerR3(nodeOrContainer, predicate, matches, elementsOnly, rootNativeNode);
- }
- }
- else if (tNode.type === 0 /* Container */) {
- // Case 2: the TNode is a container
- // The native node has to be checked.
- var lContainer = lView[tNode.index];
- _addQueryMatchR3(lContainer[NATIVE], predicate, matches, elementsOnly, rootNativeNode);
- // Each view inside the container has to be processed.
- _queryNodeChildrenInContainerR3(lContainer, predicate, matches, elementsOnly, rootNativeNode);
- }
- else if (tNode.type === 1 /* Projection */) {
- // Case 3: the TNode is a projection insertion point (i.e. a <ng-content>).
- // The nodes projected at this location all need to be processed.
- var componentView = findComponentView(lView);
- var componentHost = componentView[T_HOST];
- var head = componentHost.projection[tNode.projection];
- if (Array.isArray(head)) {
- try {
- for (var head_1 = __values(head), head_1_1 = head_1.next(); !head_1_1.done; head_1_1 = head_1.next()) {
- var nativeNode_1 = head_1_1.value;
- _addQueryMatchR3(nativeNode_1, predicate, matches, elementsOnly, rootNativeNode);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (head_1_1 && !head_1_1.done && (_a = head_1.return)) _a.call(head_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- else if (head) {
- var nextLView = componentView[PARENT];
- var nextTNode = nextLView[TVIEW].data[head.index];
- _queryNodeChildrenR3(nextTNode, nextLView, predicate, matches, elementsOnly, rootNativeNode);
- }
- }
- else if (tNode.child) {
- // Case 4: the TNode is a view.
- _queryNodeChildrenR3(tNode.child, lView, predicate, matches, elementsOnly, rootNativeNode);
- }
- // We don't want to go to the next sibling of the root node.
- if (rootNativeNode !== nativeNode) {
- // To determine the next node to be processed, we need to use the next or the projectionNext
- // link, depending on whether the current node has been projected.
- var nextTNode = (tNode.flags & 2 /* isProjected */) ? tNode.projectionNext : tNode.next;
- if (nextTNode) {
- _queryNodeChildrenR3(nextTNode, lView, predicate, matches, elementsOnly, rootNativeNode);
- }
- }
- }
- /**
- * Process all TNodes in a given container.
- *
- * @param lContainer the container to be processed
- * @param predicate the predicate to match
- * @param matches the list of positive matches
- * @param elementsOnly whether only elements should be searched
- * @param rootNativeNode the root native node on which prediccate shouold not be matched
- */
- function _queryNodeChildrenInContainerR3(lContainer, predicate, matches, elementsOnly, rootNativeNode) {
- for (var i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
- var childView = lContainer[i];
- _queryNodeChildrenR3(childView[TVIEW].node, childView, predicate, matches, elementsOnly, rootNativeNode);
- }
- }
- /**
- * Match the current native node against the predicate.
- *
- * @param nativeNode the current native node
- * @param predicate the predicate to match
- * @param matches the list of positive matches
- * @param elementsOnly whether only elements should be searched
- * @param rootNativeNode the root native node on which prediccate shouold not be matched
- */
- function _addQueryMatchR3(nativeNode, predicate, matches, elementsOnly, rootNativeNode) {
- if (rootNativeNode !== nativeNode) {
- var debugNode = getDebugNode(nativeNode);
- if (debugNode && (elementsOnly ? debugNode instanceof DebugElement__POST_R3__ : true) &&
- predicate(debugNode)) {
- matches.push(debugNode);
- }
- }
- }
- /**
- * Iterates through the property bindings for a given node and generates
- * a map of property names to values. This map only contains property bindings
- * defined in templates, not in host bindings.
- */
- function collectPropertyBindings(tNode, lView, tData) {
- var properties = {};
- var bindingIndex = getFirstBindingIndex(tNode.propertyMetadataStartIndex, tData);
- while (bindingIndex < tNode.propertyMetadataEndIndex) {
- var value = void 0;
- var propMetadata = tData[bindingIndex];
- while (!isPropMetadataString(propMetadata)) {
- // This is the first value for an interpolation. We need to build up
- // the full interpolation by combining runtime values in LView with
- // the static interstitial values stored in TData.
- value = (value || '') + renderStringify(lView[bindingIndex]) + tData[bindingIndex];
- propMetadata = tData[++bindingIndex];
- }
- value = value === undefined ? lView[bindingIndex] : value += lView[bindingIndex];
- // Property metadata string has 3 parts: property name, prefix, and suffix
- var metadataParts = propMetadata.split(INTERPOLATION_DELIMITER);
- var propertyName = metadataParts[0];
- // Attr bindings don't have property names and should be skipped
- if (propertyName) {
- // Wrap value with prefix and suffix (will be '' for normal bindings), if they're defined.
- // Avoid wrapping for normal bindings so that the value doesn't get cast to a string.
- properties[propertyName] = (metadataParts[1] && metadataParts[2]) ?
- metadataParts[1] + value + metadataParts[2] :
- value;
- }
- bindingIndex++;
- }
- return properties;
- }
- /**
- * Retrieves the first binding index that holds values for this property
- * binding.
- *
- * For normal bindings (e.g. `[id]="id"`), the binding index is the
- * same as the metadata index. For interpolations (e.g. `id="{{id}}-{{name}}"`),
- * there can be multiple binding values, so we might have to loop backwards
- * from the metadata index until we find the first one.
- *
- * @param metadataIndex The index of the first property metadata string for
- * this node.
- * @param tData The data array for the current TView
- * @returns The first binding index for this binding
- */
- function getFirstBindingIndex(metadataIndex, tData) {
- var currentBindingIndex = metadataIndex - 1;
- // If the slot before the metadata holds a string, we know that this
- // metadata applies to an interpolation with at least 2 bindings, and
- // we need to search further to access the first binding value.
- var currentValue = tData[currentBindingIndex];
- // We need to iterate until we hit either a:
- // - TNode (it is an element slot marking the end of `consts` section), OR a
- // - metadata string (slot is attribute metadata or a previous node's property metadata)
- while (typeof currentValue === 'string' && !isPropMetadataString(currentValue)) {
- currentValue = tData[--currentBindingIndex];
- }
- return currentBindingIndex + 1;
- }
- function collectHostPropertyBindings(tNode, lView, tData) {
- var properties = {};
- // Host binding values for a node are stored after directives on that node
- var hostPropIndex = tNode.directiveEnd;
- var propMetadata = tData[hostPropIndex];
- // When we reach a value in TView.data that is not a string, we know we've
- // hit the next node's providers and directives and should stop copying data.
- while (typeof propMetadata === 'string') {
- var propertyName = propMetadata.split(INTERPOLATION_DELIMITER)[0];
- properties[propertyName] = lView[hostPropIndex];
- propMetadata = tData[++hostPropIndex];
- }
- return properties;
- }
- function collectClassNames(debugElement) {
- var e_2, _a;
- var classes = debugElement.classes;
- var output = '';
- try {
- for (var _b = __values(Object.keys(classes)), _c = _b.next(); !_c.done; _c = _b.next()) {
- var className = _c.value;
- if (classes[className]) {
- output = output ? output + (" " + className) : className;
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_2) throw e_2.error; }
- }
- return output;
- }
- // Need to keep the nodes in a global Map so that multiple angular apps are supported.
- var _nativeNodeToDebugNode = new Map();
- function getDebugNode__PRE_R3__(nativeNode) {
- return _nativeNodeToDebugNode.get(nativeNode) || null;
- }
- var NG_DEBUG_PROPERTY = '__ng_debug__';
- function getDebugNode__POST_R3__(nativeNode) {
- if (nativeNode instanceof Node) {
- if (!(nativeNode.hasOwnProperty(NG_DEBUG_PROPERTY))) {
- nativeNode[NG_DEBUG_PROPERTY] = nativeNode.nodeType == Node.ELEMENT_NODE ?
- new DebugElement__POST_R3__(nativeNode) :
- new DebugNode__POST_R3__(nativeNode);
- }
- return nativeNode[NG_DEBUG_PROPERTY];
- }
- return null;
- }
- /**
- * @publicApi
- */
- var getDebugNode = getDebugNode__PRE_R3__;
- function indexDebugNode(node) {
- _nativeNodeToDebugNode.set(node.nativeNode, node);
- }
- function removeDebugNodeFromIndex(node) {
- _nativeNodeToDebugNode.delete(node.nativeNode);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var _CORE_PLATFORM_PROVIDERS = [
- // Set a default platform name for platforms that don't set it explicitly.
- { provide: PLATFORM_ID, useValue: 'unknown' },
- { provide: PlatformRef, deps: [Injector] },
- { provide: TestabilityRegistry, deps: [] },
- { provide: Console, deps: [] },
- ];
- /**
- * This platform has to be included in any other platform
- *
- * @publicApi
- */
- var platformCore = createPlatformFactory(null, 'core', _CORE_PLATFORM_PROVIDERS);
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function _iterableDiffersFactory() {
- return defaultIterableDiffers;
- }
- function _keyValueDiffersFactory() {
- return defaultKeyValueDiffers;
- }
- function _localeFactory(locale) {
- return locale || 'en-US';
- }
- /**
- * A built-in [dependency injection token](guide/glossary#di-token)
- * that is used to configure the root injector for bootstrapping.
- */
- var APPLICATION_MODULE_PROVIDERS = [
- {
- provide: ApplicationRef,
- useClass: ApplicationRef,
- deps: [NgZone, Console, Injector, ErrorHandler, ComponentFactoryResolver, ApplicationInitStatus]
- },
- { provide: SCHEDULER, deps: [NgZone], useFactory: zoneSchedulerFactory },
- {
- provide: ApplicationInitStatus,
- useClass: ApplicationInitStatus,
- deps: [[new Optional(), APP_INITIALIZER]]
- },
- { provide: Compiler, useClass: Compiler, deps: [] },
- APP_ID_RANDOM_PROVIDER,
- { provide: IterableDiffers, useFactory: _iterableDiffersFactory, deps: [] },
- { provide: KeyValueDiffers, useFactory: _keyValueDiffersFactory, deps: [] },
- {
- provide: LOCALE_ID$1,
- useFactory: _localeFactory,
- deps: [[new Inject(LOCALE_ID$1), new Optional(), new SkipSelf()]]
- },
- ];
- /**
- * Schedule work at next available slot.
- *
- * In Ivy this is just `requestAnimationFrame`. For compatibility reasons when bootstrapped
- * using `platformRef.bootstrap` we need to use `NgZone.onStable` as the scheduling mechanism.
- * This overrides the scheduling mechanism in Ivy to `NgZone.onStable`.
- *
- * @param ngZone NgZone to use for scheduling.
- */
- function zoneSchedulerFactory(ngZone) {
- var queue = [];
- ngZone.onStable.subscribe(function () {
- while (queue.length) {
- queue.pop()();
- }
- });
- return function (fn) { queue.push(fn); };
- }
- /**
- * Configures the root injector for an app with
- * providers of `@angular/core` dependencies that `ApplicationRef` needs
- * to bootstrap components.
- *
- * Re-exported by `BrowserModule`, which is included automatically in the root
- * `AppModule` when you create a new app with the CLI `new` command.
- *
- * @publicApi
- */
- var ApplicationModule = /** @class */ (function () {
- // Inject ApplicationRef to make it eager...
- function ApplicationModule(appRef) {
- }
- ApplicationModule = __decorate([
- NgModule({ providers: APPLICATION_MODULE_PROVIDERS }),
- __metadata("design:paramtypes", [ApplicationRef])
- ], ApplicationModule);
- return ApplicationModule;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function createElement(view, renderHost, def) {
- var elDef = def.element;
- var rootSelectorOrNode = view.root.selectorOrNode;
- var renderer = view.renderer;
- var el;
- if (view.parent || !rootSelectorOrNode) {
- if (elDef.name) {
- el = renderer.createElement(elDef.name, elDef.ns);
- }
- else {
- el = renderer.createComment('');
- }
- var parentEl = getParentRenderElement(view, renderHost, def);
- if (parentEl) {
- renderer.appendChild(parentEl, el);
- }
- }
- else {
- // when using native Shadow DOM, do not clear the root element contents to allow slot projection
- var preserveContent = (!!elDef.componentRendererType &&
- elDef.componentRendererType.encapsulation === ViewEncapsulation$1.ShadowDom);
- el = renderer.selectRootElement(rootSelectorOrNode, preserveContent);
- }
- if (elDef.attrs) {
- for (var i = 0; i < elDef.attrs.length; i++) {
- var _a = __read(elDef.attrs[i], 3), ns = _a[0], name_2 = _a[1], value = _a[2];
- renderer.setAttribute(el, name_2, value, ns);
- }
- }
- return el;
- }
- function listenToElementOutputs(view, compView, def, el) {
- for (var i = 0; i < def.outputs.length; i++) {
- var output = def.outputs[i];
- var handleEventClosure = renderEventHandlerClosure(view, def.nodeIndex, elementEventFullName(output.target, output.eventName));
- var listenTarget = output.target;
- var listenerView = view;
- if (output.target === 'component') {
- listenTarget = null;
- listenerView = compView;
- }
- var disposable = listenerView.renderer.listen(listenTarget || el, output.eventName, handleEventClosure);
- view.disposables[def.outputIndex + i] = disposable;
- }
- }
- function renderEventHandlerClosure(view, index, eventName) {
- return function (event) { return dispatchEvent(view, index, eventName, event); };
- }
- function checkAndUpdateElementInline(view, def, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- var bindLen = def.bindings.length;
- var changed = false;
- if (bindLen > 0 && checkAndUpdateElementValue(view, def, 0, v0))
- changed = true;
- if (bindLen > 1 && checkAndUpdateElementValue(view, def, 1, v1))
- changed = true;
- if (bindLen > 2 && checkAndUpdateElementValue(view, def, 2, v2))
- changed = true;
- if (bindLen > 3 && checkAndUpdateElementValue(view, def, 3, v3))
- changed = true;
- if (bindLen > 4 && checkAndUpdateElementValue(view, def, 4, v4))
- changed = true;
- if (bindLen > 5 && checkAndUpdateElementValue(view, def, 5, v5))
- changed = true;
- if (bindLen > 6 && checkAndUpdateElementValue(view, def, 6, v6))
- changed = true;
- if (bindLen > 7 && checkAndUpdateElementValue(view, def, 7, v7))
- changed = true;
- if (bindLen > 8 && checkAndUpdateElementValue(view, def, 8, v8))
- changed = true;
- if (bindLen > 9 && checkAndUpdateElementValue(view, def, 9, v9))
- changed = true;
- return changed;
- }
- function checkAndUpdateElementDynamic(view, def, values) {
- var changed = false;
- for (var i = 0; i < values.length; i++) {
- if (checkAndUpdateElementValue(view, def, i, values[i]))
- changed = true;
- }
- return changed;
- }
- function checkAndUpdateElementValue(view, def, bindingIdx, value) {
- if (!checkAndUpdateBinding(view, def, bindingIdx, value)) {
- return false;
- }
- var binding = def.bindings[bindingIdx];
- var elData = asElementData(view, def.nodeIndex);
- var renderNode = elData.renderElement;
- var name = binding.name;
- switch (binding.flags & 15 /* Types */) {
- case 1 /* TypeElementAttribute */:
- setElementAttribute(view, binding, renderNode, binding.ns, name, value);
- break;
- case 2 /* TypeElementClass */:
- setElementClass(view, renderNode, name, value);
- break;
- case 4 /* TypeElementStyle */:
- setElementStyle(view, binding, renderNode, name, value);
- break;
- case 8 /* TypeProperty */:
- var bindView = (def.flags & 33554432 /* ComponentView */ &&
- binding.flags & 32 /* SyntheticHostProperty */) ?
- elData.componentView :
- view;
- setElementProperty(bindView, binding, renderNode, name, value);
- break;
- }
- return true;
- }
- function setElementAttribute(view, binding, renderNode, ns, name, value) {
- var securityContext = binding.securityContext;
- var renderValue = securityContext ? view.root.sanitizer.sanitize(securityContext, value) : value;
- renderValue = renderValue != null ? renderValue.toString() : null;
- var renderer = view.renderer;
- if (value != null) {
- renderer.setAttribute(renderNode, name, renderValue, ns);
- }
- else {
- renderer.removeAttribute(renderNode, name, ns);
- }
- }
- function setElementClass(view, renderNode, name, value) {
- var renderer = view.renderer;
- if (value) {
- renderer.addClass(renderNode, name);
- }
- else {
- renderer.removeClass(renderNode, name);
- }
- }
- function setElementStyle(view, binding, renderNode, name, value) {
- var renderValue = view.root.sanitizer.sanitize(SecurityContext$1.STYLE, value);
- if (renderValue != null) {
- renderValue = renderValue.toString();
- var unit = binding.suffix;
- if (unit != null) {
- renderValue = renderValue + unit;
- }
- }
- else {
- renderValue = null;
- }
- var renderer = view.renderer;
- if (renderValue != null) {
- renderer.setStyle(renderNode, name, renderValue);
- }
- else {
- renderer.removeStyle(renderNode, name);
- }
- }
- function setElementProperty(view, binding, renderNode, name, value) {
- var securityContext = binding.securityContext;
- var renderValue = securityContext ? view.root.sanitizer.sanitize(securityContext, value) : value;
- view.renderer.setProperty(renderNode, name, renderValue);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function createQuery() {
- return new QueryList();
- }
- function dirtyParentQueries(view) {
- var queryIds = view.def.nodeMatchedQueries;
- while (view.parent && isEmbeddedView(view)) {
- var tplDef = view.parentNodeDef;
- view = view.parent;
- // content queries
- var end = tplDef.nodeIndex + tplDef.childCount;
- for (var i = 0; i <= end; i++) {
- var nodeDef = view.def.nodes[i];
- if ((nodeDef.flags & 67108864 /* TypeContentQuery */) &&
- (nodeDef.flags & 536870912 /* DynamicQuery */) &&
- (nodeDef.query.filterId & queryIds) === nodeDef.query.filterId) {
- asQueryList(view, i).setDirty();
- }
- if ((nodeDef.flags & 1 /* TypeElement */ && i + nodeDef.childCount < tplDef.nodeIndex) ||
- !(nodeDef.childFlags & 67108864 /* TypeContentQuery */) ||
- !(nodeDef.childFlags & 536870912 /* DynamicQuery */)) {
- // skip elements that don't contain the template element or no query.
- i += nodeDef.childCount;
- }
- }
- }
- // view queries
- if (view.def.nodeFlags & 134217728 /* TypeViewQuery */) {
- for (var i = 0; i < view.def.nodes.length; i++) {
- var nodeDef = view.def.nodes[i];
- if ((nodeDef.flags & 134217728 /* TypeViewQuery */) && (nodeDef.flags & 536870912 /* DynamicQuery */)) {
- asQueryList(view, i).setDirty();
- }
- // only visit the root nodes
- i += nodeDef.childCount;
- }
- }
- }
- function checkAndUpdateQuery(view, nodeDef) {
- var queryList = asQueryList(view, nodeDef.nodeIndex);
- if (!queryList.dirty) {
- return;
- }
- var directiveInstance;
- var newValues = undefined;
- if (nodeDef.flags & 67108864 /* TypeContentQuery */) {
- var elementDef = nodeDef.parent.parent;
- newValues = calcQueryValues(view, elementDef.nodeIndex, elementDef.nodeIndex + elementDef.childCount, nodeDef.query, []);
- directiveInstance = asProviderData(view, nodeDef.parent.nodeIndex).instance;
- }
- else if (nodeDef.flags & 134217728 /* TypeViewQuery */) {
- newValues = calcQueryValues(view, 0, view.def.nodes.length - 1, nodeDef.query, []);
- directiveInstance = view.component;
- }
- queryList.reset(newValues);
- var bindings = nodeDef.query.bindings;
- var notify = false;
- for (var i = 0; i < bindings.length; i++) {
- var binding = bindings[i];
- var boundValue = void 0;
- switch (binding.bindingType) {
- case 0 /* First */:
- boundValue = queryList.first;
- break;
- case 1 /* All */:
- boundValue = queryList;
- notify = true;
- break;
- }
- directiveInstance[binding.propName] = boundValue;
- }
- if (notify) {
- queryList.notifyOnChanges();
- }
- }
- function calcQueryValues(view, startIndex, endIndex, queryDef, values) {
- for (var i = startIndex; i <= endIndex; i++) {
- var nodeDef = view.def.nodes[i];
- var valueType = nodeDef.matchedQueries[queryDef.id];
- if (valueType != null) {
- values.push(getQueryValue(view, nodeDef, valueType));
- }
- if (nodeDef.flags & 1 /* TypeElement */ && nodeDef.element.template &&
- (nodeDef.element.template.nodeMatchedQueries & queryDef.filterId) ===
- queryDef.filterId) {
- var elementData = asElementData(view, i);
- // check embedded views that were attached at the place of their template,
- // but process child nodes first if some match the query (see issue #16568)
- if ((nodeDef.childMatchedQueries & queryDef.filterId) === queryDef.filterId) {
- calcQueryValues(view, i + 1, i + nodeDef.childCount, queryDef, values);
- i += nodeDef.childCount;
- }
- if (nodeDef.flags & 16777216 /* EmbeddedViews */) {
- var embeddedViews = elementData.viewContainer._embeddedViews;
- for (var k = 0; k < embeddedViews.length; k++) {
- var embeddedView = embeddedViews[k];
- var dvc = declaredViewContainer(embeddedView);
- if (dvc && dvc === elementData) {
- calcQueryValues(embeddedView, 0, embeddedView.def.nodes.length - 1, queryDef, values);
- }
- }
- }
- var projectedViews = elementData.template._projectedViews;
- if (projectedViews) {
- for (var k = 0; k < projectedViews.length; k++) {
- var projectedView = projectedViews[k];
- calcQueryValues(projectedView, 0, projectedView.def.nodes.length - 1, queryDef, values);
- }
- }
- }
- if ((nodeDef.childMatchedQueries & queryDef.filterId) !== queryDef.filterId) {
- // if no child matches the query, skip the children.
- i += nodeDef.childCount;
- }
- }
- return values;
- }
- function getQueryValue(view, nodeDef, queryValueType) {
- if (queryValueType != null) {
- // a match
- switch (queryValueType) {
- case 1 /* RenderElement */:
- return asElementData(view, nodeDef.nodeIndex).renderElement;
- case 0 /* ElementRef */:
- return new ElementRef(asElementData(view, nodeDef.nodeIndex).renderElement);
- case 2 /* TemplateRef */:
- return asElementData(view, nodeDef.nodeIndex).template;
- case 3 /* ViewContainerRef */:
- return asElementData(view, nodeDef.nodeIndex).viewContainer;
- case 4 /* Provider */:
- return asProviderData(view, nodeDef.nodeIndex).instance;
- }
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function appendNgContent(view, renderHost, def) {
- var parentEl = getParentRenderElement(view, renderHost, def);
- if (!parentEl) {
- // Nothing to do if there is no parent element.
- return;
- }
- var ngContentIndex = def.ngContent.index;
- visitProjectedRenderNodes(view, ngContentIndex, 1 /* AppendChild */, parentEl, null, undefined);
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function createPureExpression(view, def) {
- return { value: undefined };
- }
- function checkAndUpdatePureExpressionInline(view, def, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- var bindings = def.bindings;
- var changed = false;
- var bindLen = bindings.length;
- if (bindLen > 0 && checkAndUpdateBinding(view, def, 0, v0))
- changed = true;
- if (bindLen > 1 && checkAndUpdateBinding(view, def, 1, v1))
- changed = true;
- if (bindLen > 2 && checkAndUpdateBinding(view, def, 2, v2))
- changed = true;
- if (bindLen > 3 && checkAndUpdateBinding(view, def, 3, v3))
- changed = true;
- if (bindLen > 4 && checkAndUpdateBinding(view, def, 4, v4))
- changed = true;
- if (bindLen > 5 && checkAndUpdateBinding(view, def, 5, v5))
- changed = true;
- if (bindLen > 6 && checkAndUpdateBinding(view, def, 6, v6))
- changed = true;
- if (bindLen > 7 && checkAndUpdateBinding(view, def, 7, v7))
- changed = true;
- if (bindLen > 8 && checkAndUpdateBinding(view, def, 8, v8))
- changed = true;
- if (bindLen > 9 && checkAndUpdateBinding(view, def, 9, v9))
- changed = true;
- if (changed) {
- var data = asPureExpressionData(view, def.nodeIndex);
- var value = void 0;
- switch (def.flags & 201347067 /* Types */) {
- case 32 /* TypePureArray */:
- value = new Array(bindings.length);
- if (bindLen > 0)
- value[0] = v0;
- if (bindLen > 1)
- value[1] = v1;
- if (bindLen > 2)
- value[2] = v2;
- if (bindLen > 3)
- value[3] = v3;
- if (bindLen > 4)
- value[4] = v4;
- if (bindLen > 5)
- value[5] = v5;
- if (bindLen > 6)
- value[6] = v6;
- if (bindLen > 7)
- value[7] = v7;
- if (bindLen > 8)
- value[8] = v8;
- if (bindLen > 9)
- value[9] = v9;
- break;
- case 64 /* TypePureObject */:
- value = {};
- if (bindLen > 0)
- value[bindings[0].name] = v0;
- if (bindLen > 1)
- value[bindings[1].name] = v1;
- if (bindLen > 2)
- value[bindings[2].name] = v2;
- if (bindLen > 3)
- value[bindings[3].name] = v3;
- if (bindLen > 4)
- value[bindings[4].name] = v4;
- if (bindLen > 5)
- value[bindings[5].name] = v5;
- if (bindLen > 6)
- value[bindings[6].name] = v6;
- if (bindLen > 7)
- value[bindings[7].name] = v7;
- if (bindLen > 8)
- value[bindings[8].name] = v8;
- if (bindLen > 9)
- value[bindings[9].name] = v9;
- break;
- case 128 /* TypePurePipe */:
- var pipe = v0;
- switch (bindLen) {
- case 1:
- value = pipe.transform(v0);
- break;
- case 2:
- value = pipe.transform(v1);
- break;
- case 3:
- value = pipe.transform(v1, v2);
- break;
- case 4:
- value = pipe.transform(v1, v2, v3);
- break;
- case 5:
- value = pipe.transform(v1, v2, v3, v4);
- break;
- case 6:
- value = pipe.transform(v1, v2, v3, v4, v5);
- break;
- case 7:
- value = pipe.transform(v1, v2, v3, v4, v5, v6);
- break;
- case 8:
- value = pipe.transform(v1, v2, v3, v4, v5, v6, v7);
- break;
- case 9:
- value = pipe.transform(v1, v2, v3, v4, v5, v6, v7, v8);
- break;
- case 10:
- value = pipe.transform(v1, v2, v3, v4, v5, v6, v7, v8, v9);
- break;
- }
- break;
- }
- data.value = value;
- }
- return changed;
- }
- function checkAndUpdatePureExpressionDynamic(view, def, values) {
- var bindings = def.bindings;
- var changed = false;
- for (var i = 0; i < values.length; i++) {
- // Note: We need to loop over all values, so that
- // the old values are updates as well!
- if (checkAndUpdateBinding(view, def, i, values[i])) {
- changed = true;
- }
- }
- if (changed) {
- var data = asPureExpressionData(view, def.nodeIndex);
- var value = void 0;
- switch (def.flags & 201347067 /* Types */) {
- case 32 /* TypePureArray */:
- value = values;
- break;
- case 64 /* TypePureObject */:
- value = {};
- for (var i = 0; i < values.length; i++) {
- value[bindings[i].name] = values[i];
- }
- break;
- case 128 /* TypePurePipe */:
- var pipe = values[0];
- var params = values.slice(1);
- value = pipe.transform.apply(pipe, __spread(params));
- break;
- }
- data.value = value;
- }
- return changed;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function createText(view, renderHost, def) {
- var renderNode;
- var renderer = view.renderer;
- renderNode = renderer.createText(def.text.prefix);
- var parentEl = getParentRenderElement(view, renderHost, def);
- if (parentEl) {
- renderer.appendChild(parentEl, renderNode);
- }
- return { renderText: renderNode };
- }
- function checkAndUpdateTextInline(view, def, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- var changed = false;
- var bindings = def.bindings;
- var bindLen = bindings.length;
- if (bindLen > 0 && checkAndUpdateBinding(view, def, 0, v0))
- changed = true;
- if (bindLen > 1 && checkAndUpdateBinding(view, def, 1, v1))
- changed = true;
- if (bindLen > 2 && checkAndUpdateBinding(view, def, 2, v2))
- changed = true;
- if (bindLen > 3 && checkAndUpdateBinding(view, def, 3, v3))
- changed = true;
- if (bindLen > 4 && checkAndUpdateBinding(view, def, 4, v4))
- changed = true;
- if (bindLen > 5 && checkAndUpdateBinding(view, def, 5, v5))
- changed = true;
- if (bindLen > 6 && checkAndUpdateBinding(view, def, 6, v6))
- changed = true;
- if (bindLen > 7 && checkAndUpdateBinding(view, def, 7, v7))
- changed = true;
- if (bindLen > 8 && checkAndUpdateBinding(view, def, 8, v8))
- changed = true;
- if (bindLen > 9 && checkAndUpdateBinding(view, def, 9, v9))
- changed = true;
- if (changed) {
- var value = def.text.prefix;
- if (bindLen > 0)
- value += _addInterpolationPart(v0, bindings[0]);
- if (bindLen > 1)
- value += _addInterpolationPart(v1, bindings[1]);
- if (bindLen > 2)
- value += _addInterpolationPart(v2, bindings[2]);
- if (bindLen > 3)
- value += _addInterpolationPart(v3, bindings[3]);
- if (bindLen > 4)
- value += _addInterpolationPart(v4, bindings[4]);
- if (bindLen > 5)
- value += _addInterpolationPart(v5, bindings[5]);
- if (bindLen > 6)
- value += _addInterpolationPart(v6, bindings[6]);
- if (bindLen > 7)
- value += _addInterpolationPart(v7, bindings[7]);
- if (bindLen > 8)
- value += _addInterpolationPart(v8, bindings[8]);
- if (bindLen > 9)
- value += _addInterpolationPart(v9, bindings[9]);
- var renderNode = asTextData(view, def.nodeIndex).renderText;
- view.renderer.setValue(renderNode, value);
- }
- return changed;
- }
- function checkAndUpdateTextDynamic(view, def, values) {
- var bindings = def.bindings;
- var changed = false;
- for (var i = 0; i < values.length; i++) {
- // Note: We need to loop over all values, so that
- // the old values are updates as well!
- if (checkAndUpdateBinding(view, def, i, values[i])) {
- changed = true;
- }
- }
- if (changed) {
- var value = '';
- for (var i = 0; i < values.length; i++) {
- value = value + _addInterpolationPart(values[i], bindings[i]);
- }
- value = def.text.prefix + value;
- var renderNode = asTextData(view, def.nodeIndex).renderText;
- view.renderer.setValue(renderNode, value);
- }
- return changed;
- }
- function _addInterpolationPart(value, binding) {
- var valueStr = value != null ? value.toString() : '';
- return valueStr + binding.suffix;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function createEmbeddedView(parent, anchorDef, viewDef, context) {
- // embedded views are seen as siblings to the anchor, so we need
- // to get the parent of the anchor and use it as parentIndex.
- var view = createView(parent.root, parent.renderer, parent, anchorDef, viewDef);
- initView(view, parent.component, context);
- createViewNodes(view);
- return view;
- }
- function createRootView(root, def, context) {
- var view = createView(root, root.renderer, null, null, def);
- initView(view, context, context);
- createViewNodes(view);
- return view;
- }
- function createComponentView(parentView, nodeDef, viewDef, hostElement) {
- var rendererType = nodeDef.element.componentRendererType;
- var compRenderer;
- if (!rendererType) {
- compRenderer = parentView.root.renderer;
- }
- else {
- compRenderer = parentView.root.rendererFactory.createRenderer(hostElement, rendererType);
- }
- return createView(parentView.root, compRenderer, parentView, nodeDef.element.componentProvider, viewDef);
- }
- function createView(root, renderer, parent, parentNodeDef, def) {
- var nodes = new Array(def.nodes.length);
- var disposables = def.outputCount ? new Array(def.outputCount) : null;
- var view = {
- def: def,
- parent: parent,
- viewContainerParent: null, parentNodeDef: parentNodeDef,
- context: null,
- component: null, nodes: nodes,
- state: 13 /* CatInit */, root: root, renderer: renderer,
- oldValues: new Array(def.bindingCount), disposables: disposables,
- initIndex: -1
- };
- return view;
- }
- function initView(view, component, context) {
- view.component = component;
- view.context = context;
- }
- function createViewNodes(view) {
- var renderHost;
- if (isComponentView(view)) {
- var hostDef = view.parentNodeDef;
- renderHost = asElementData(view.parent, hostDef.parent.nodeIndex).renderElement;
- }
- var def = view.def;
- var nodes = view.nodes;
- for (var i = 0; i < def.nodes.length; i++) {
- var nodeDef = def.nodes[i];
- Services.setCurrentNode(view, i);
- var nodeData = void 0;
- switch (nodeDef.flags & 201347067 /* Types */) {
- case 1 /* TypeElement */:
- var el = createElement(view, renderHost, nodeDef);
- var componentView = undefined;
- if (nodeDef.flags & 33554432 /* ComponentView */) {
- var compViewDef = resolveDefinition(nodeDef.element.componentView);
- componentView = Services.createComponentView(view, nodeDef, compViewDef, el);
- }
- listenToElementOutputs(view, componentView, nodeDef, el);
- nodeData = {
- renderElement: el,
- componentView: componentView,
- viewContainer: null,
- template: nodeDef.element.template ? createTemplateData(view, nodeDef) : undefined
- };
- if (nodeDef.flags & 16777216 /* EmbeddedViews */) {
- nodeData.viewContainer = createViewContainerData(view, nodeDef, nodeData);
- }
- break;
- case 2 /* TypeText */:
- nodeData = createText(view, renderHost, nodeDef);
- break;
- case 512 /* TypeClassProvider */:
- case 1024 /* TypeFactoryProvider */:
- case 2048 /* TypeUseExistingProvider */:
- case 256 /* TypeValueProvider */: {
- nodeData = nodes[i];
- if (!nodeData && !(nodeDef.flags & 4096 /* LazyProvider */)) {
- var instance = createProviderInstance(view, nodeDef);
- nodeData = { instance: instance };
- }
- break;
- }
- case 16 /* TypePipe */: {
- var instance = createPipeInstance(view, nodeDef);
- nodeData = { instance: instance };
- break;
- }
- case 16384 /* TypeDirective */: {
- nodeData = nodes[i];
- if (!nodeData) {
- var instance = createDirectiveInstance(view, nodeDef);
- nodeData = { instance: instance };
- }
- if (nodeDef.flags & 32768 /* Component */) {
- var compView = asElementData(view, nodeDef.parent.nodeIndex).componentView;
- initView(compView, nodeData.instance, nodeData.instance);
- }
- break;
- }
- case 32 /* TypePureArray */:
- case 64 /* TypePureObject */:
- case 128 /* TypePurePipe */:
- nodeData = createPureExpression(view, nodeDef);
- break;
- case 67108864 /* TypeContentQuery */:
- case 134217728 /* TypeViewQuery */:
- nodeData = createQuery();
- break;
- case 8 /* TypeNgContent */:
- appendNgContent(view, renderHost, nodeDef);
- // no runtime data needed for NgContent...
- nodeData = undefined;
- break;
- }
- nodes[i] = nodeData;
- }
- // Create the ViewData.nodes of component views after we created everything else,
- // so that e.g. ng-content works
- execComponentViewsAction(view, ViewAction.CreateViewNodes);
- // fill static content and view queries
- execQueriesAction(view, 67108864 /* TypeContentQuery */ | 134217728 /* TypeViewQuery */, 268435456 /* StaticQuery */, 0 /* CheckAndUpdate */);
- }
- function checkNoChangesView(view) {
- markProjectedViewsForCheck(view);
- Services.updateDirectives(view, 1 /* CheckNoChanges */);
- execEmbeddedViewsAction(view, ViewAction.CheckNoChanges);
- Services.updateRenderer(view, 1 /* CheckNoChanges */);
- execComponentViewsAction(view, ViewAction.CheckNoChanges);
- // Note: We don't check queries for changes as we didn't do this in v2.x.
- // TODO(tbosch): investigate if we can enable the check again in v5.x with a nicer error message.
- view.state &= ~(64 /* CheckProjectedViews */ | 32 /* CheckProjectedView */);
- }
- function checkAndUpdateView(view) {
- if (view.state & 1 /* BeforeFirstCheck */) {
- view.state &= ~1 /* BeforeFirstCheck */;
- view.state |= 2 /* FirstCheck */;
- }
- else {
- view.state &= ~2 /* FirstCheck */;
- }
- shiftInitState(view, 0 /* InitState_BeforeInit */, 256 /* InitState_CallingOnInit */);
- markProjectedViewsForCheck(view);
- Services.updateDirectives(view, 0 /* CheckAndUpdate */);
- execEmbeddedViewsAction(view, ViewAction.CheckAndUpdate);
- execQueriesAction(view, 67108864 /* TypeContentQuery */, 536870912 /* DynamicQuery */, 0 /* CheckAndUpdate */);
- var callInit = shiftInitState(view, 256 /* InitState_CallingOnInit */, 512 /* InitState_CallingAfterContentInit */);
- callLifecycleHooksChildrenFirst(view, 2097152 /* AfterContentChecked */ | (callInit ? 1048576 /* AfterContentInit */ : 0));
- Services.updateRenderer(view, 0 /* CheckAndUpdate */);
- execComponentViewsAction(view, ViewAction.CheckAndUpdate);
- execQueriesAction(view, 134217728 /* TypeViewQuery */, 536870912 /* DynamicQuery */, 0 /* CheckAndUpdate */);
- callInit = shiftInitState(view, 512 /* InitState_CallingAfterContentInit */, 768 /* InitState_CallingAfterViewInit */);
- callLifecycleHooksChildrenFirst(view, 8388608 /* AfterViewChecked */ | (callInit ? 4194304 /* AfterViewInit */ : 0));
- if (view.def.flags & 2 /* OnPush */) {
- view.state &= ~8 /* ChecksEnabled */;
- }
- view.state &= ~(64 /* CheckProjectedViews */ | 32 /* CheckProjectedView */);
- shiftInitState(view, 768 /* InitState_CallingAfterViewInit */, 1024 /* InitState_AfterInit */);
- }
- function checkAndUpdateNode(view, nodeDef, argStyle, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- if (argStyle === 0 /* Inline */) {
- return checkAndUpdateNodeInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
- }
- else {
- return checkAndUpdateNodeDynamic(view, nodeDef, v0);
- }
- }
- function markProjectedViewsForCheck(view) {
- var def = view.def;
- if (!(def.nodeFlags & 4 /* ProjectedTemplate */)) {
- return;
- }
- for (var i = 0; i < def.nodes.length; i++) {
- var nodeDef = def.nodes[i];
- if (nodeDef.flags & 4 /* ProjectedTemplate */) {
- var projectedViews = asElementData(view, i).template._projectedViews;
- if (projectedViews) {
- for (var i_1 = 0; i_1 < projectedViews.length; i_1++) {
- var projectedView = projectedViews[i_1];
- projectedView.state |= 32 /* CheckProjectedView */;
- markParentViewsForCheckProjectedViews(projectedView, view);
- }
- }
- }
- else if ((nodeDef.childFlags & 4 /* ProjectedTemplate */) === 0) {
- // a parent with leafs
- // no child is a component,
- // then skip the children
- i += nodeDef.childCount;
- }
- }
- }
- function checkAndUpdateNodeInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- switch (nodeDef.flags & 201347067 /* Types */) {
- case 1 /* TypeElement */:
- return checkAndUpdateElementInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
- case 2 /* TypeText */:
- return checkAndUpdateTextInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
- case 16384 /* TypeDirective */:
- return checkAndUpdateDirectiveInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
- case 32 /* TypePureArray */:
- case 64 /* TypePureObject */:
- case 128 /* TypePurePipe */:
- return checkAndUpdatePureExpressionInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
- default:
- throw 'unreachable';
- }
- }
- function checkAndUpdateNodeDynamic(view, nodeDef, values) {
- switch (nodeDef.flags & 201347067 /* Types */) {
- case 1 /* TypeElement */:
- return checkAndUpdateElementDynamic(view, nodeDef, values);
- case 2 /* TypeText */:
- return checkAndUpdateTextDynamic(view, nodeDef, values);
- case 16384 /* TypeDirective */:
- return checkAndUpdateDirectiveDynamic(view, nodeDef, values);
- case 32 /* TypePureArray */:
- case 64 /* TypePureObject */:
- case 128 /* TypePurePipe */:
- return checkAndUpdatePureExpressionDynamic(view, nodeDef, values);
- default:
- throw 'unreachable';
- }
- }
- function checkNoChangesNode(view, nodeDef, argStyle, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- if (argStyle === 0 /* Inline */) {
- checkNoChangesNodeInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
- }
- else {
- checkNoChangesNodeDynamic(view, nodeDef, v0);
- }
- // Returning false is ok here as we would have thrown in case of a change.
- return false;
- }
- function checkNoChangesNodeInline(view, nodeDef, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- var bindLen = nodeDef.bindings.length;
- if (bindLen > 0)
- checkBindingNoChanges(view, nodeDef, 0, v0);
- if (bindLen > 1)
- checkBindingNoChanges(view, nodeDef, 1, v1);
- if (bindLen > 2)
- checkBindingNoChanges(view, nodeDef, 2, v2);
- if (bindLen > 3)
- checkBindingNoChanges(view, nodeDef, 3, v3);
- if (bindLen > 4)
- checkBindingNoChanges(view, nodeDef, 4, v4);
- if (bindLen > 5)
- checkBindingNoChanges(view, nodeDef, 5, v5);
- if (bindLen > 6)
- checkBindingNoChanges(view, nodeDef, 6, v6);
- if (bindLen > 7)
- checkBindingNoChanges(view, nodeDef, 7, v7);
- if (bindLen > 8)
- checkBindingNoChanges(view, nodeDef, 8, v8);
- if (bindLen > 9)
- checkBindingNoChanges(view, nodeDef, 9, v9);
- }
- function checkNoChangesNodeDynamic(view, nodeDef, values) {
- for (var i = 0; i < values.length; i++) {
- checkBindingNoChanges(view, nodeDef, i, values[i]);
- }
- }
- /**
- * Workaround https://github.com/angular/tsickle/issues/497
- * @suppress {misplacedTypeAnnotation}
- */
- function checkNoChangesQuery(view, nodeDef) {
- var queryList = asQueryList(view, nodeDef.nodeIndex);
- if (queryList.dirty) {
- throw expressionChangedAfterItHasBeenCheckedError(Services.createDebugContext(view, nodeDef.nodeIndex), "Query " + nodeDef.query.id + " not dirty", "Query " + nodeDef.query.id + " dirty", (view.state & 1 /* BeforeFirstCheck */) !== 0);
- }
- }
- function destroyView(view) {
- if (view.state & 128 /* Destroyed */) {
- return;
- }
- execEmbeddedViewsAction(view, ViewAction.Destroy);
- execComponentViewsAction(view, ViewAction.Destroy);
- callLifecycleHooksChildrenFirst(view, 131072 /* OnDestroy */);
- if (view.disposables) {
- for (var i = 0; i < view.disposables.length; i++) {
- view.disposables[i]();
- }
- }
- detachProjectedView(view);
- if (view.renderer.destroyNode) {
- destroyViewNodes(view);
- }
- if (isComponentView(view)) {
- view.renderer.destroy();
- }
- view.state |= 128 /* Destroyed */;
- }
- function destroyViewNodes(view) {
- var len = view.def.nodes.length;
- for (var i = 0; i < len; i++) {
- var def = view.def.nodes[i];
- if (def.flags & 1 /* TypeElement */) {
- view.renderer.destroyNode(asElementData(view, i).renderElement);
- }
- else if (def.flags & 2 /* TypeText */) {
- view.renderer.destroyNode(asTextData(view, i).renderText);
- }
- else if (def.flags & 67108864 /* TypeContentQuery */ || def.flags & 134217728 /* TypeViewQuery */) {
- asQueryList(view, i).destroy();
- }
- }
- }
- var ViewAction;
- (function (ViewAction) {
- ViewAction[ViewAction["CreateViewNodes"] = 0] = "CreateViewNodes";
- ViewAction[ViewAction["CheckNoChanges"] = 1] = "CheckNoChanges";
- ViewAction[ViewAction["CheckNoChangesProjectedViews"] = 2] = "CheckNoChangesProjectedViews";
- ViewAction[ViewAction["CheckAndUpdate"] = 3] = "CheckAndUpdate";
- ViewAction[ViewAction["CheckAndUpdateProjectedViews"] = 4] = "CheckAndUpdateProjectedViews";
- ViewAction[ViewAction["Destroy"] = 5] = "Destroy";
- })(ViewAction || (ViewAction = {}));
- function execComponentViewsAction(view, action) {
- var def = view.def;
- if (!(def.nodeFlags & 33554432 /* ComponentView */)) {
- return;
- }
- for (var i = 0; i < def.nodes.length; i++) {
- var nodeDef = def.nodes[i];
- if (nodeDef.flags & 33554432 /* ComponentView */) {
- // a leaf
- callViewAction(asElementData(view, i).componentView, action);
- }
- else if ((nodeDef.childFlags & 33554432 /* ComponentView */) === 0) {
- // a parent with leafs
- // no child is a component,
- // then skip the children
- i += nodeDef.childCount;
- }
- }
- }
- function execEmbeddedViewsAction(view, action) {
- var def = view.def;
- if (!(def.nodeFlags & 16777216 /* EmbeddedViews */)) {
- return;
- }
- for (var i = 0; i < def.nodes.length; i++) {
- var nodeDef = def.nodes[i];
- if (nodeDef.flags & 16777216 /* EmbeddedViews */) {
- // a leaf
- var embeddedViews = asElementData(view, i).viewContainer._embeddedViews;
- for (var k = 0; k < embeddedViews.length; k++) {
- callViewAction(embeddedViews[k], action);
- }
- }
- else if ((nodeDef.childFlags & 16777216 /* EmbeddedViews */) === 0) {
- // a parent with leafs
- // no child is a component,
- // then skip the children
- i += nodeDef.childCount;
- }
- }
- }
- function callViewAction(view, action) {
- var viewState = view.state;
- switch (action) {
- case ViewAction.CheckNoChanges:
- if ((viewState & 128 /* Destroyed */) === 0) {
- if ((viewState & 12 /* CatDetectChanges */) === 12 /* CatDetectChanges */) {
- checkNoChangesView(view);
- }
- else if (viewState & 64 /* CheckProjectedViews */) {
- execProjectedViewsAction(view, ViewAction.CheckNoChangesProjectedViews);
- }
- }
- break;
- case ViewAction.CheckNoChangesProjectedViews:
- if ((viewState & 128 /* Destroyed */) === 0) {
- if (viewState & 32 /* CheckProjectedView */) {
- checkNoChangesView(view);
- }
- else if (viewState & 64 /* CheckProjectedViews */) {
- execProjectedViewsAction(view, action);
- }
- }
- break;
- case ViewAction.CheckAndUpdate:
- if ((viewState & 128 /* Destroyed */) === 0) {
- if ((viewState & 12 /* CatDetectChanges */) === 12 /* CatDetectChanges */) {
- checkAndUpdateView(view);
- }
- else if (viewState & 64 /* CheckProjectedViews */) {
- execProjectedViewsAction(view, ViewAction.CheckAndUpdateProjectedViews);
- }
- }
- break;
- case ViewAction.CheckAndUpdateProjectedViews:
- if ((viewState & 128 /* Destroyed */) === 0) {
- if (viewState & 32 /* CheckProjectedView */) {
- checkAndUpdateView(view);
- }
- else if (viewState & 64 /* CheckProjectedViews */) {
- execProjectedViewsAction(view, action);
- }
- }
- break;
- case ViewAction.Destroy:
- // Note: destroyView recurses over all views,
- // so we don't need to special case projected views here.
- destroyView(view);
- break;
- case ViewAction.CreateViewNodes:
- createViewNodes(view);
- break;
- }
- }
- function execProjectedViewsAction(view, action) {
- execEmbeddedViewsAction(view, action);
- execComponentViewsAction(view, action);
- }
- function execQueriesAction(view, queryFlags, staticDynamicQueryFlag, checkType) {
- if (!(view.def.nodeFlags & queryFlags) || !(view.def.nodeFlags & staticDynamicQueryFlag)) {
- return;
- }
- var nodeCount = view.def.nodes.length;
- for (var i = 0; i < nodeCount; i++) {
- var nodeDef = view.def.nodes[i];
- if ((nodeDef.flags & queryFlags) && (nodeDef.flags & staticDynamicQueryFlag)) {
- Services.setCurrentNode(view, nodeDef.nodeIndex);
- switch (checkType) {
- case 0 /* CheckAndUpdate */:
- checkAndUpdateQuery(view, nodeDef);
- break;
- case 1 /* CheckNoChanges */:
- checkNoChangesQuery(view, nodeDef);
- break;
- }
- }
- if (!(nodeDef.childFlags & queryFlags) || !(nodeDef.childFlags & staticDynamicQueryFlag)) {
- // no child has a matching query
- // then skip the children
- i += nodeDef.childCount;
- }
- }
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var initialized = false;
- function initServicesIfNeeded() {
- if (initialized) {
- return;
- }
- initialized = true;
- var services = isDevMode() ? createDebugServices() : createProdServices();
- Services.setCurrentNode = services.setCurrentNode;
- Services.createRootView = services.createRootView;
- Services.createEmbeddedView = services.createEmbeddedView;
- Services.createComponentView = services.createComponentView;
- Services.createNgModuleRef = services.createNgModuleRef;
- Services.overrideProvider = services.overrideProvider;
- Services.overrideComponentView = services.overrideComponentView;
- Services.clearOverrides = services.clearOverrides;
- Services.checkAndUpdateView = services.checkAndUpdateView;
- Services.checkNoChangesView = services.checkNoChangesView;
- Services.destroyView = services.destroyView;
- Services.resolveDep = resolveDep;
- Services.createDebugContext = services.createDebugContext;
- Services.handleEvent = services.handleEvent;
- Services.updateDirectives = services.updateDirectives;
- Services.updateRenderer = services.updateRenderer;
- Services.dirtyParentQueries = dirtyParentQueries;
- }
- function createProdServices() {
- return {
- setCurrentNode: function () { },
- createRootView: createProdRootView,
- createEmbeddedView: createEmbeddedView,
- createComponentView: createComponentView,
- createNgModuleRef: createNgModuleRef,
- overrideProvider: NOOP,
- overrideComponentView: NOOP,
- clearOverrides: NOOP,
- checkAndUpdateView: checkAndUpdateView,
- checkNoChangesView: checkNoChangesView,
- destroyView: destroyView,
- createDebugContext: function (view, nodeIndex) { return new DebugContext_(view, nodeIndex); },
- handleEvent: function (view, nodeIndex, eventName, event) {
- return view.def.handleEvent(view, nodeIndex, eventName, event);
- },
- updateDirectives: function (view, checkType) { return view.def.updateDirectives(checkType === 0 /* CheckAndUpdate */ ? prodCheckAndUpdateNode :
- prodCheckNoChangesNode, view); },
- updateRenderer: function (view, checkType) { return view.def.updateRenderer(checkType === 0 /* CheckAndUpdate */ ? prodCheckAndUpdateNode :
- prodCheckNoChangesNode, view); },
- };
- }
- function createDebugServices() {
- return {
- setCurrentNode: debugSetCurrentNode,
- createRootView: debugCreateRootView,
- createEmbeddedView: debugCreateEmbeddedView,
- createComponentView: debugCreateComponentView,
- createNgModuleRef: debugCreateNgModuleRef,
- overrideProvider: debugOverrideProvider,
- overrideComponentView: debugOverrideComponentView,
- clearOverrides: debugClearOverrides,
- checkAndUpdateView: debugCheckAndUpdateView,
- checkNoChangesView: debugCheckNoChangesView,
- destroyView: debugDestroyView,
- createDebugContext: function (view, nodeIndex) { return new DebugContext_(view, nodeIndex); },
- handleEvent: debugHandleEvent,
- updateDirectives: debugUpdateDirectives,
- updateRenderer: debugUpdateRenderer,
- };
- }
- function createProdRootView(elInjector, projectableNodes, rootSelectorOrNode, def, ngModule, context) {
- var rendererFactory = ngModule.injector.get(RendererFactory2);
- return createRootView(createRootData(elInjector, ngModule, rendererFactory, projectableNodes, rootSelectorOrNode), def, context);
- }
- function debugCreateRootView(elInjector, projectableNodes, rootSelectorOrNode, def, ngModule, context) {
- var rendererFactory = ngModule.injector.get(RendererFactory2);
- var root = createRootData(elInjector, ngModule, new DebugRendererFactory2(rendererFactory), projectableNodes, rootSelectorOrNode);
- var defWithOverride = applyProviderOverridesToView(def);
- return callWithDebugContext(DebugAction.create, createRootView, null, [root, defWithOverride, context]);
- }
- function createRootData(elInjector, ngModule, rendererFactory, projectableNodes, rootSelectorOrNode) {
- var sanitizer = ngModule.injector.get(Sanitizer);
- var errorHandler = ngModule.injector.get(ErrorHandler);
- var renderer = rendererFactory.createRenderer(null, null);
- return {
- ngModule: ngModule,
- injector: elInjector, projectableNodes: projectableNodes,
- selectorOrNode: rootSelectorOrNode, sanitizer: sanitizer, rendererFactory: rendererFactory, renderer: renderer, errorHandler: errorHandler
- };
- }
- function debugCreateEmbeddedView(parentView, anchorDef, viewDef, context) {
- var defWithOverride = applyProviderOverridesToView(viewDef);
- return callWithDebugContext(DebugAction.create, createEmbeddedView, null, [parentView, anchorDef, defWithOverride, context]);
- }
- function debugCreateComponentView(parentView, nodeDef, viewDef, hostElement) {
- var overrideComponentView = viewDefOverrides.get(nodeDef.element.componentProvider.provider.token);
- if (overrideComponentView) {
- viewDef = overrideComponentView;
- }
- else {
- viewDef = applyProviderOverridesToView(viewDef);
- }
- return callWithDebugContext(DebugAction.create, createComponentView, null, [parentView, nodeDef, viewDef, hostElement]);
- }
- function debugCreateNgModuleRef(moduleType, parentInjector, bootstrapComponents, def) {
- var defWithOverride = applyProviderOverridesToNgModule(def);
- return createNgModuleRef(moduleType, parentInjector, bootstrapComponents, defWithOverride);
- }
- var providerOverrides = new Map();
- var providerOverridesWithScope = new Map();
- var viewDefOverrides = new Map();
- function debugOverrideProvider(override) {
- providerOverrides.set(override.token, override);
- var injectableDef;
- if (typeof override.token === 'function' && (injectableDef = getInjectableDef(override.token)) &&
- typeof injectableDef.providedIn === 'function') {
- providerOverridesWithScope.set(override.token, override);
- }
- }
- function debugOverrideComponentView(comp, compFactory) {
- var hostViewDef = resolveDefinition(getComponentViewDefinitionFactory(compFactory));
- var compViewDef = resolveDefinition(hostViewDef.nodes[0].element.componentView);
- viewDefOverrides.set(comp, compViewDef);
- }
- function debugClearOverrides() {
- providerOverrides.clear();
- providerOverridesWithScope.clear();
- viewDefOverrides.clear();
- }
- // Notes about the algorithm:
- // 1) Locate the providers of an element and check if one of them was overwritten
- // 2) Change the providers of that element
- //
- // We only create new datastructures if we need to, to keep perf impact
- // reasonable.
- function applyProviderOverridesToView(def) {
- if (providerOverrides.size === 0) {
- return def;
- }
- var elementIndicesWithOverwrittenProviders = findElementIndicesWithOverwrittenProviders(def);
- if (elementIndicesWithOverwrittenProviders.length === 0) {
- return def;
- }
- // clone the whole view definition,
- // as it maintains references between the nodes that are hard to update.
- def = def.factory(function () { return NOOP; });
- for (var i = 0; i < elementIndicesWithOverwrittenProviders.length; i++) {
- applyProviderOverridesToElement(def, elementIndicesWithOverwrittenProviders[i]);
- }
- return def;
- function findElementIndicesWithOverwrittenProviders(def) {
- var elIndicesWithOverwrittenProviders = [];
- var lastElementDef = null;
- for (var i = 0; i < def.nodes.length; i++) {
- var nodeDef = def.nodes[i];
- if (nodeDef.flags & 1 /* TypeElement */) {
- lastElementDef = nodeDef;
- }
- if (lastElementDef && nodeDef.flags & 3840 /* CatProviderNoDirective */ &&
- providerOverrides.has(nodeDef.provider.token)) {
- elIndicesWithOverwrittenProviders.push(lastElementDef.nodeIndex);
- lastElementDef = null;
- }
- }
- return elIndicesWithOverwrittenProviders;
- }
- function applyProviderOverridesToElement(viewDef, elIndex) {
- for (var i = elIndex + 1; i < viewDef.nodes.length; i++) {
- var nodeDef = viewDef.nodes[i];
- if (nodeDef.flags & 1 /* TypeElement */) {
- // stop at the next element
- return;
- }
- if (nodeDef.flags & 3840 /* CatProviderNoDirective */) {
- var provider = nodeDef.provider;
- var override = providerOverrides.get(provider.token);
- if (override) {
- nodeDef.flags = (nodeDef.flags & ~3840 /* CatProviderNoDirective */) | override.flags;
- provider.deps = splitDepsDsl(override.deps);
- provider.value = override.value;
- }
- }
- }
- }
- }
- // Notes about the algorithm:
- // We only create new datastructures if we need to, to keep perf impact
- // reasonable.
- function applyProviderOverridesToNgModule(def) {
- var _a = calcHasOverrides(def), hasOverrides = _a.hasOverrides, hasDeprecatedOverrides = _a.hasDeprecatedOverrides;
- if (!hasOverrides) {
- return def;
- }
- // clone the whole view definition,
- // as it maintains references between the nodes that are hard to update.
- def = def.factory(function () { return NOOP; });
- applyProviderOverrides(def);
- return def;
- function calcHasOverrides(def) {
- var hasOverrides = false;
- var hasDeprecatedOverrides = false;
- if (providerOverrides.size === 0) {
- return { hasOverrides: hasOverrides, hasDeprecatedOverrides: hasDeprecatedOverrides };
- }
- def.providers.forEach(function (node) {
- var override = providerOverrides.get(node.token);
- if ((node.flags & 3840 /* CatProviderNoDirective */) && override) {
- hasOverrides = true;
- hasDeprecatedOverrides = hasDeprecatedOverrides || override.deprecatedBehavior;
- }
- });
- def.modules.forEach(function (module) {
- providerOverridesWithScope.forEach(function (override, token) {
- if (getInjectableDef(token).providedIn === module) {
- hasOverrides = true;
- hasDeprecatedOverrides = hasDeprecatedOverrides || override.deprecatedBehavior;
- }
- });
- });
- return { hasOverrides: hasOverrides, hasDeprecatedOverrides: hasDeprecatedOverrides };
- }
- function applyProviderOverrides(def) {
- for (var i = 0; i < def.providers.length; i++) {
- var provider = def.providers[i];
- if (hasDeprecatedOverrides) {
- // We had a bug where me made
- // all providers lazy. Keep this logic behind a flag
- // for migrating existing users.
- provider.flags |= 4096 /* LazyProvider */;
- }
- var override = providerOverrides.get(provider.token);
- if (override) {
- provider.flags = (provider.flags & ~3840 /* CatProviderNoDirective */) | override.flags;
- provider.deps = splitDepsDsl(override.deps);
- provider.value = override.value;
- }
- }
- if (providerOverridesWithScope.size > 0) {
- var moduleSet_1 = new Set(def.modules);
- providerOverridesWithScope.forEach(function (override, token) {
- if (moduleSet_1.has(getInjectableDef(token).providedIn)) {
- var provider = {
- token: token,
- flags: override.flags | (hasDeprecatedOverrides ? 4096 /* LazyProvider */ : 0 /* None */),
- deps: splitDepsDsl(override.deps),
- value: override.value,
- index: def.providers.length,
- };
- def.providers.push(provider);
- def.providersByKey[tokenKey(token)] = provider;
- }
- });
- }
- }
- }
- function prodCheckAndUpdateNode(view, checkIndex, argStyle, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- var nodeDef = view.def.nodes[checkIndex];
- checkAndUpdateNode(view, nodeDef, argStyle, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
- return (nodeDef.flags & 224 /* CatPureExpression */) ?
- asPureExpressionData(view, checkIndex).value :
- undefined;
- }
- function prodCheckNoChangesNode(view, checkIndex, argStyle, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9) {
- var nodeDef = view.def.nodes[checkIndex];
- checkNoChangesNode(view, nodeDef, argStyle, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9);
- return (nodeDef.flags & 224 /* CatPureExpression */) ?
- asPureExpressionData(view, checkIndex).value :
- undefined;
- }
- function debugCheckAndUpdateView(view) {
- return callWithDebugContext(DebugAction.detectChanges, checkAndUpdateView, null, [view]);
- }
- function debugCheckNoChangesView(view) {
- return callWithDebugContext(DebugAction.checkNoChanges, checkNoChangesView, null, [view]);
- }
- function debugDestroyView(view) {
- return callWithDebugContext(DebugAction.destroy, destroyView, null, [view]);
- }
- var DebugAction;
- (function (DebugAction) {
- DebugAction[DebugAction["create"] = 0] = "create";
- DebugAction[DebugAction["detectChanges"] = 1] = "detectChanges";
- DebugAction[DebugAction["checkNoChanges"] = 2] = "checkNoChanges";
- DebugAction[DebugAction["destroy"] = 3] = "destroy";
- DebugAction[DebugAction["handleEvent"] = 4] = "handleEvent";
- })(DebugAction || (DebugAction = {}));
- var _currentAction;
- var _currentView;
- var _currentNodeIndex;
- function debugSetCurrentNode(view, nodeIndex) {
- _currentView = view;
- _currentNodeIndex = nodeIndex;
- }
- function debugHandleEvent(view, nodeIndex, eventName, event) {
- debugSetCurrentNode(view, nodeIndex);
- return callWithDebugContext(DebugAction.handleEvent, view.def.handleEvent, null, [view, nodeIndex, eventName, event]);
- }
- function debugUpdateDirectives(view, checkType) {
- if (view.state & 128 /* Destroyed */) {
- throw viewDestroyedError(DebugAction[_currentAction]);
- }
- debugSetCurrentNode(view, nextDirectiveWithBinding(view, 0));
- return view.def.updateDirectives(debugCheckDirectivesFn, view);
- function debugCheckDirectivesFn(view, nodeIndex, argStyle) {
- var values = [];
- for (var _i = 3; _i < arguments.length; _i++) {
- values[_i - 3] = arguments[_i];
- }
- var nodeDef = view.def.nodes[nodeIndex];
- if (checkType === 0 /* CheckAndUpdate */) {
- debugCheckAndUpdateNode(view, nodeDef, argStyle, values);
- }
- else {
- debugCheckNoChangesNode(view, nodeDef, argStyle, values);
- }
- if (nodeDef.flags & 16384 /* TypeDirective */) {
- debugSetCurrentNode(view, nextDirectiveWithBinding(view, nodeIndex));
- }
- return (nodeDef.flags & 224 /* CatPureExpression */) ?
- asPureExpressionData(view, nodeDef.nodeIndex).value :
- undefined;
- }
- }
- function debugUpdateRenderer(view, checkType) {
- if (view.state & 128 /* Destroyed */) {
- throw viewDestroyedError(DebugAction[_currentAction]);
- }
- debugSetCurrentNode(view, nextRenderNodeWithBinding(view, 0));
- return view.def.updateRenderer(debugCheckRenderNodeFn, view);
- function debugCheckRenderNodeFn(view, nodeIndex, argStyle) {
- var values = [];
- for (var _i = 3; _i < arguments.length; _i++) {
- values[_i - 3] = arguments[_i];
- }
- var nodeDef = view.def.nodes[nodeIndex];
- if (checkType === 0 /* CheckAndUpdate */) {
- debugCheckAndUpdateNode(view, nodeDef, argStyle, values);
- }
- else {
- debugCheckNoChangesNode(view, nodeDef, argStyle, values);
- }
- if (nodeDef.flags & 3 /* CatRenderNode */) {
- debugSetCurrentNode(view, nextRenderNodeWithBinding(view, nodeIndex));
- }
- return (nodeDef.flags & 224 /* CatPureExpression */) ?
- asPureExpressionData(view, nodeDef.nodeIndex).value :
- undefined;
- }
- }
- function debugCheckAndUpdateNode(view, nodeDef, argStyle, givenValues) {
- var changed = checkAndUpdateNode.apply(void 0, __spread([view, nodeDef, argStyle], givenValues));
- if (changed) {
- var values = argStyle === 1 /* Dynamic */ ? givenValues[0] : givenValues;
- if (nodeDef.flags & 16384 /* TypeDirective */) {
- var bindingValues = {};
- for (var i = 0; i < nodeDef.bindings.length; i++) {
- var binding = nodeDef.bindings[i];
- var value = values[i];
- if (binding.flags & 8 /* TypeProperty */) {
- bindingValues[normalizeDebugBindingName(binding.nonMinifiedName)] =
- normalizeDebugBindingValue(value);
- }
- }
- var elDef = nodeDef.parent;
- var el = asElementData(view, elDef.nodeIndex).renderElement;
- if (!elDef.element.name) {
- // a comment.
- view.renderer.setValue(el, "bindings=" + JSON.stringify(bindingValues, null, 2));
- }
- else {
- // a regular element.
- for (var attr in bindingValues) {
- var value = bindingValues[attr];
- if (value != null) {
- view.renderer.setAttribute(el, attr, value);
- }
- else {
- view.renderer.removeAttribute(el, attr);
- }
- }
- }
- }
- }
- }
- function debugCheckNoChangesNode(view, nodeDef, argStyle, values) {
- checkNoChangesNode.apply(void 0, __spread([view, nodeDef, argStyle], values));
- }
- function nextDirectiveWithBinding(view, nodeIndex) {
- for (var i = nodeIndex; i < view.def.nodes.length; i++) {
- var nodeDef = view.def.nodes[i];
- if (nodeDef.flags & 16384 /* TypeDirective */ && nodeDef.bindings && nodeDef.bindings.length) {
- return i;
- }
- }
- return null;
- }
- function nextRenderNodeWithBinding(view, nodeIndex) {
- for (var i = nodeIndex; i < view.def.nodes.length; i++) {
- var nodeDef = view.def.nodes[i];
- if ((nodeDef.flags & 3 /* CatRenderNode */) && nodeDef.bindings && nodeDef.bindings.length) {
- return i;
- }
- }
- return null;
- }
- var DebugContext_ = /** @class */ (function () {
- function DebugContext_(view, nodeIndex) {
- this.view = view;
- this.nodeIndex = nodeIndex;
- if (nodeIndex == null) {
- this.nodeIndex = nodeIndex = 0;
- }
- this.nodeDef = view.def.nodes[nodeIndex];
- var elDef = this.nodeDef;
- var elView = view;
- while (elDef && (elDef.flags & 1 /* TypeElement */) === 0) {
- elDef = elDef.parent;
- }
- if (!elDef) {
- while (!elDef && elView) {
- elDef = viewParentEl(elView);
- elView = elView.parent;
- }
- }
- this.elDef = elDef;
- this.elView = elView;
- }
- Object.defineProperty(DebugContext_.prototype, "elOrCompView", {
- get: function () {
- // Has to be done lazily as we use the DebugContext also during creation of elements...
- return asElementData(this.elView, this.elDef.nodeIndex).componentView || this.view;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugContext_.prototype, "injector", {
- get: function () { return createInjector$1(this.elView, this.elDef); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugContext_.prototype, "component", {
- get: function () { return this.elOrCompView.component; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugContext_.prototype, "context", {
- get: function () { return this.elOrCompView.context; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugContext_.prototype, "providerTokens", {
- get: function () {
- var tokens = [];
- if (this.elDef) {
- for (var i = this.elDef.nodeIndex + 1; i <= this.elDef.nodeIndex + this.elDef.childCount; i++) {
- var childDef = this.elView.def.nodes[i];
- if (childDef.flags & 20224 /* CatProvider */) {
- tokens.push(childDef.provider.token);
- }
- i += childDef.childCount;
- }
- }
- return tokens;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugContext_.prototype, "references", {
- get: function () {
- var references = {};
- if (this.elDef) {
- collectReferences(this.elView, this.elDef, references);
- for (var i = this.elDef.nodeIndex + 1; i <= this.elDef.nodeIndex + this.elDef.childCount; i++) {
- var childDef = this.elView.def.nodes[i];
- if (childDef.flags & 20224 /* CatProvider */) {
- collectReferences(this.elView, childDef, references);
- }
- i += childDef.childCount;
- }
- }
- return references;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugContext_.prototype, "componentRenderElement", {
- get: function () {
- var elData = findHostElement(this.elOrCompView);
- return elData ? elData.renderElement : undefined;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(DebugContext_.prototype, "renderNode", {
- get: function () {
- return this.nodeDef.flags & 2 /* TypeText */ ? renderNode(this.view, this.nodeDef) :
- renderNode(this.elView, this.elDef);
- },
- enumerable: true,
- configurable: true
- });
- DebugContext_.prototype.logError = function (console) {
- var values = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- values[_i - 1] = arguments[_i];
- }
- var logViewDef;
- var logNodeIndex;
- if (this.nodeDef.flags & 2 /* TypeText */) {
- logViewDef = this.view.def;
- logNodeIndex = this.nodeDef.nodeIndex;
- }
- else {
- logViewDef = this.elView.def;
- logNodeIndex = this.elDef.nodeIndex;
- }
- // Note: we only generate a log function for text and element nodes
- // to make the generated code as small as possible.
- var renderNodeIndex = getRenderNodeIndex(logViewDef, logNodeIndex);
- var currRenderNodeIndex = -1;
- var nodeLogger = function () {
- var _a;
- currRenderNodeIndex++;
- if (currRenderNodeIndex === renderNodeIndex) {
- return (_a = console.error).bind.apply(_a, __spread([console], values));
- }
- else {
- return NOOP;
- }
- };
- logViewDef.factory(nodeLogger);
- if (currRenderNodeIndex < renderNodeIndex) {
- console.error('Illegal state: the ViewDefinitionFactory did not call the logger!');
- console.error.apply(console, __spread(values));
- }
- };
- return DebugContext_;
- }());
- function getRenderNodeIndex(viewDef, nodeIndex) {
- var renderNodeIndex = -1;
- for (var i = 0; i <= nodeIndex; i++) {
- var nodeDef = viewDef.nodes[i];
- if (nodeDef.flags & 3 /* CatRenderNode */) {
- renderNodeIndex++;
- }
- }
- return renderNodeIndex;
- }
- function findHostElement(view) {
- while (view && !isComponentView(view)) {
- view = view.parent;
- }
- if (view.parent) {
- return asElementData(view.parent, viewParentEl(view).nodeIndex);
- }
- return null;
- }
- function collectReferences(view, nodeDef, references) {
- for (var refName in nodeDef.references) {
- references[refName] = getQueryValue(view, nodeDef, nodeDef.references[refName]);
- }
- }
- function callWithDebugContext(action, fn, self, args) {
- var oldAction = _currentAction;
- var oldView = _currentView;
- var oldNodeIndex = _currentNodeIndex;
- try {
- _currentAction = action;
- var result = fn.apply(self, args);
- _currentView = oldView;
- _currentNodeIndex = oldNodeIndex;
- _currentAction = oldAction;
- return result;
- }
- catch (e) {
- if (isViewDebugError(e) || !_currentView) {
- throw e;
- }
- throw viewWrappedDebugError(e, getCurrentDebugContext());
- }
- }
- function getCurrentDebugContext() {
- return _currentView ? new DebugContext_(_currentView, _currentNodeIndex) : null;
- }
- var DebugRendererFactory2 = /** @class */ (function () {
- function DebugRendererFactory2(delegate) {
- this.delegate = delegate;
- }
- DebugRendererFactory2.prototype.createRenderer = function (element, renderData) {
- return new DebugRenderer2(this.delegate.createRenderer(element, renderData));
- };
- DebugRendererFactory2.prototype.begin = function () {
- if (this.delegate.begin) {
- this.delegate.begin();
- }
- };
- DebugRendererFactory2.prototype.end = function () {
- if (this.delegate.end) {
- this.delegate.end();
- }
- };
- DebugRendererFactory2.prototype.whenRenderingDone = function () {
- if (this.delegate.whenRenderingDone) {
- return this.delegate.whenRenderingDone();
- }
- return Promise.resolve(null);
- };
- return DebugRendererFactory2;
- }());
- var DebugRenderer2 = /** @class */ (function () {
- function DebugRenderer2(delegate) {
- this.delegate = delegate;
- /**
- * Factory function used to create a `DebugContext` when a node is created.
- *
- * The `DebugContext` allows to retrieve information about the nodes that are useful in tests.
- *
- * The factory is configurable so that the `DebugRenderer2` could instantiate either a View Engine
- * or a Render context.
- */
- this.debugContextFactory = getCurrentDebugContext;
- this.data = this.delegate.data;
- }
- DebugRenderer2.prototype.createDebugContext = function (nativeElement) { return this.debugContextFactory(nativeElement); };
- DebugRenderer2.prototype.destroyNode = function (node) {
- removeDebugNodeFromIndex(getDebugNode(node));
- if (this.delegate.destroyNode) {
- this.delegate.destroyNode(node);
- }
- };
- DebugRenderer2.prototype.destroy = function () { this.delegate.destroy(); };
- DebugRenderer2.prototype.createElement = function (name, namespace) {
- var el = this.delegate.createElement(name, namespace);
- var debugCtx = this.createDebugContext(el);
- if (debugCtx) {
- var debugEl = new DebugElement__PRE_R3__(el, null, debugCtx);
- debugEl.name = name;
- indexDebugNode(debugEl);
- }
- return el;
- };
- DebugRenderer2.prototype.createComment = function (value) {
- var comment = this.delegate.createComment(value);
- var debugCtx = this.createDebugContext(comment);
- if (debugCtx) {
- indexDebugNode(new DebugNode__PRE_R3__(comment, null, debugCtx));
- }
- return comment;
- };
- DebugRenderer2.prototype.createText = function (value) {
- var text = this.delegate.createText(value);
- var debugCtx = this.createDebugContext(text);
- if (debugCtx) {
- indexDebugNode(new DebugNode__PRE_R3__(text, null, debugCtx));
- }
- return text;
- };
- DebugRenderer2.prototype.appendChild = function (parent, newChild) {
- var debugEl = getDebugNode(parent);
- var debugChildEl = getDebugNode(newChild);
- if (debugEl && debugChildEl && debugEl instanceof DebugElement__PRE_R3__) {
- debugEl.addChild(debugChildEl);
- }
- this.delegate.appendChild(parent, newChild);
- };
- DebugRenderer2.prototype.insertBefore = function (parent, newChild, refChild) {
- var debugEl = getDebugNode(parent);
- var debugChildEl = getDebugNode(newChild);
- var debugRefEl = getDebugNode(refChild);
- if (debugEl && debugChildEl && debugEl instanceof DebugElement__PRE_R3__) {
- debugEl.insertBefore(debugRefEl, debugChildEl);
- }
- this.delegate.insertBefore(parent, newChild, refChild);
- };
- DebugRenderer2.prototype.removeChild = function (parent, oldChild) {
- var debugEl = getDebugNode(parent);
- var debugChildEl = getDebugNode(oldChild);
- if (debugEl && debugChildEl && debugEl instanceof DebugElement__PRE_R3__) {
- debugEl.removeChild(debugChildEl);
- }
- this.delegate.removeChild(parent, oldChild);
- };
- DebugRenderer2.prototype.selectRootElement = function (selectorOrNode, preserveContent) {
- var el = this.delegate.selectRootElement(selectorOrNode, preserveContent);
- var debugCtx = getCurrentDebugContext();
- if (debugCtx) {
- indexDebugNode(new DebugElement__PRE_R3__(el, null, debugCtx));
- }
- return el;
- };
- DebugRenderer2.prototype.setAttribute = function (el, name, value, namespace) {
- var debugEl = getDebugNode(el);
- if (debugEl && debugEl instanceof DebugElement__PRE_R3__) {
- var fullName = namespace ? namespace + ':' + name : name;
- debugEl.attributes[fullName] = value;
- }
- this.delegate.setAttribute(el, name, value, namespace);
- };
- DebugRenderer2.prototype.removeAttribute = function (el, name, namespace) {
- var debugEl = getDebugNode(el);
- if (debugEl && debugEl instanceof DebugElement__PRE_R3__) {
- var fullName = namespace ? namespace + ':' + name : name;
- debugEl.attributes[fullName] = null;
- }
- this.delegate.removeAttribute(el, name, namespace);
- };
- DebugRenderer2.prototype.addClass = function (el, name) {
- var debugEl = getDebugNode(el);
- if (debugEl && debugEl instanceof DebugElement__PRE_R3__) {
- debugEl.classes[name] = true;
- }
- this.delegate.addClass(el, name);
- };
- DebugRenderer2.prototype.removeClass = function (el, name) {
- var debugEl = getDebugNode(el);
- if (debugEl && debugEl instanceof DebugElement__PRE_R3__) {
- debugEl.classes[name] = false;
- }
- this.delegate.removeClass(el, name);
- };
- DebugRenderer2.prototype.setStyle = function (el, style, value, flags) {
- var debugEl = getDebugNode(el);
- if (debugEl && debugEl instanceof DebugElement__PRE_R3__) {
- debugEl.styles[style] = value;
- }
- this.delegate.setStyle(el, style, value, flags);
- };
- DebugRenderer2.prototype.removeStyle = function (el, style, flags) {
- var debugEl = getDebugNode(el);
- if (debugEl && debugEl instanceof DebugElement__PRE_R3__) {
- debugEl.styles[style] = null;
- }
- this.delegate.removeStyle(el, style, flags);
- };
- DebugRenderer2.prototype.setProperty = function (el, name, value) {
- var debugEl = getDebugNode(el);
- if (debugEl && debugEl instanceof DebugElement__PRE_R3__) {
- debugEl.properties[name] = value;
- }
- this.delegate.setProperty(el, name, value);
- };
- DebugRenderer2.prototype.listen = function (target, eventName, callback) {
- if (typeof target !== 'string') {
- var debugEl = getDebugNode(target);
- if (debugEl) {
- debugEl.listeners.push(new DebugEventListener(eventName, callback));
- }
- }
- return this.delegate.listen(target, eventName, callback);
- };
- DebugRenderer2.prototype.parentNode = function (node) { return this.delegate.parentNode(node); };
- DebugRenderer2.prototype.nextSibling = function (node) { return this.delegate.nextSibling(node); };
- DebugRenderer2.prototype.setValue = function (node, value) { return this.delegate.setValue(node, value); };
- return DebugRenderer2;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- function cloneNgModuleDefinition(def) {
- var providers = Array.from(def.providers);
- var modules = Array.from(def.modules);
- var providersByKey = {};
- for (var key in def.providersByKey) {
- providersByKey[key] = def.providersByKey[key];
- }
- return {
- factory: def.factory,
- isRoot: def.isRoot, providers: providers, modules: modules, providersByKey: providersByKey,
- };
- }
- var NgModuleFactory_ = /** @class */ (function (_super) {
- __extends(NgModuleFactory_, _super);
- function NgModuleFactory_(moduleType, _bootstrapComponents, _ngModuleDefFactory) {
- var _this =
- // Attention: this ctor is called as top level function.
- // Putting any logic in here will destroy closure tree shaking!
- _super.call(this) || this;
- _this.moduleType = moduleType;
- _this._bootstrapComponents = _bootstrapComponents;
- _this._ngModuleDefFactory = _ngModuleDefFactory;
- return _this;
- }
- NgModuleFactory_.prototype.create = function (parentInjector) {
- initServicesIfNeeded();
- // Clone the NgModuleDefinition so that any tree shakeable provider definition
- // added to this instance of the NgModuleRef doesn't affect the cached copy.
- // See https://github.com/angular/angular/issues/25018.
- var def = cloneNgModuleDefinition(resolveDefinition(this._ngModuleDefFactory));
- return Services.createNgModuleRef(this.moduleType, parentInjector || Injector.NULL, this._bootstrapComponents, def);
- };
- return NgModuleFactory_;
- }(NgModuleFactory));
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // clang-format on
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- // This file only reexports content of the `src` folder. Keep it that way.
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var ReflectorModuleModuleResolutionHost = /** @class */ (function () {
- function ReflectorModuleModuleResolutionHost(host, getProgram) {
- var _this = this;
- this.host = host;
- this.getProgram = getProgram;
- // Note: verboseInvalidExpressions is important so that
- // the collector will collect errors instead of throwing
- this.metadataCollector = new MetadataCollector({ verboseInvalidExpression: true });
- if (host.directoryExists)
- this.directoryExists = function (directoryName) { return _this.host.directoryExists(directoryName); };
- }
- ReflectorModuleModuleResolutionHost.prototype.fileExists = function (fileName) { return !!this.host.getScriptSnapshot(fileName); };
- ReflectorModuleModuleResolutionHost.prototype.readFile = function (fileName) {
- var snapshot = this.host.getScriptSnapshot(fileName);
- if (snapshot) {
- return snapshot.getText(0, snapshot.getLength());
- }
- // Typescript readFile() declaration should be `readFile(fileName: string): string | undefined
- return undefined;
- };
- ReflectorModuleModuleResolutionHost.prototype.getSourceFileMetadata = function (fileName) {
- var sf = this.getProgram().getSourceFile(fileName);
- return sf ? this.metadataCollector.getMetadata(sf) : undefined;
- };
- ReflectorModuleModuleResolutionHost.prototype.cacheMetadata = function (fileName) {
- // Don't cache the metadata for .ts files as they might change in the editor!
- return fileName.endsWith('.d.ts');
- };
- return ReflectorModuleModuleResolutionHost;
- }());
- var ReflectorHost = /** @class */ (function () {
- function ReflectorHost(getProgram, serviceHost, options) {
- this.options = options;
- this.metadataReaderCache = createMetadataReaderCache();
- this.hostAdapter = new ReflectorModuleModuleResolutionHost(serviceHost, getProgram);
- }
- ReflectorHost.prototype.getMetadataFor = function (modulePath) {
- return readMetadata(modulePath, this.hostAdapter, this.metadataReaderCache);
- };
- ReflectorHost.prototype.moduleNameToFileName = function (moduleName, containingFile) {
- if (!containingFile) {
- if (moduleName.indexOf('.') === 0) {
- throw new Error('Resolution of relative paths requires a containing file.');
- }
- // Any containing file gives the same result for absolute imports
- containingFile = path.join(this.options.basePath, 'index.ts').replace(/\\/g, '/');
- }
- var resolved = ts.resolveModuleName(moduleName, containingFile, this.options, this.hostAdapter)
- .resolvedModule;
- return resolved ? resolved.resolvedFileName : null;
- };
- ReflectorHost.prototype.getOutputName = function (filePath) { return filePath; };
- return ReflectorHost;
- }());
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * Create a `LanguageServiceHost`
- */
- function createLanguageServiceFromTypescript(host, service) {
- var ngHost = new TypeScriptServiceHost(host, service);
- var ngServer = createLanguageService(ngHost);
- return ngServer;
- }
- /**
- * The language service never needs the normalized versions of the metadata. To avoid parsing
- * the content and resolving references, return an empty file. This also allows normalizing
- * template that are syntatically incorrect which is required to provide completions in
- * syntactically incorrect templates.
- */
- var DummyHtmlParser = /** @class */ (function (_super) {
- __extends(DummyHtmlParser, _super);
- function DummyHtmlParser() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- DummyHtmlParser.prototype.parse = function () { return new ParseTreeResult([], []); };
- return DummyHtmlParser;
- }(HtmlParser));
- /**
- * Avoid loading resources in the language servcie by using a dummy loader.
- */
- var DummyResourceLoader = /** @class */ (function (_super) {
- __extends(DummyResourceLoader, _super);
- function DummyResourceLoader() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- DummyResourceLoader.prototype.get = function (url) { return Promise.resolve(''); };
- return DummyResourceLoader;
- }(ResourceLoader));
- /**
- * An implementation of a `LanguageServiceHost` for a TypeScript project.
- *
- * The `TypeScriptServiceHost` implements the Angular `LanguageServiceHost` using
- * the TypeScript language services.
- *
- * @publicApi
- */
- var TypeScriptServiceHost = /** @class */ (function () {
- function TypeScriptServiceHost(host, tsService) {
- this.host = host;
- this.tsService = tsService;
- this._staticSymbolCache = new StaticSymbolCache();
- this._typeCache = [];
- this.modulesOutOfDate = true;
- this.fileVersions = new Map();
- }
- Object.defineProperty(TypeScriptServiceHost.prototype, "resolver", {
- /**
- * Angular LanguageServiceHost implementation
- */
- get: function () {
- var _this = this;
- this.validate();
- var result = this._resolver;
- if (!result) {
- var moduleResolver = new NgModuleResolver(this.reflector);
- var directiveResolver = new DirectiveResolver(this.reflector);
- var pipeResolver = new PipeResolver(this.reflector);
- var elementSchemaRegistry = new DomElementSchemaRegistry();
- var resourceLoader = new DummyResourceLoader();
- var urlResolver = createOfflineCompileUrlResolver();
- var htmlParser = new DummyHtmlParser();
- // This tracks the CompileConfig in codegen.ts. Currently these options
- // are hard-coded.
- var config = new CompilerConfig({ defaultEncapsulation: ViewEncapsulation$1.Emulated, useJit: false });
- var directiveNormalizer = new DirectiveNormalizer(resourceLoader, urlResolver, htmlParser, config);
- result = this._resolver = new CompileMetadataResolver(config, htmlParser, moduleResolver, directiveResolver, pipeResolver, new JitSummaryResolver(), elementSchemaRegistry, directiveNormalizer, new Console(), this._staticSymbolCache, this.reflector, function (error, type) { return _this.collectError(error, type && type.filePath); });
- }
- return result;
- },
- enumerable: true,
- configurable: true
- });
- TypeScriptServiceHost.prototype.getTemplateReferences = function () {
- this.ensureTemplateMap();
- return this.templateReferences || [];
- };
- TypeScriptServiceHost.prototype.getTemplateAt = function (fileName, position) {
- var sourceFile = this.getSourceFile(fileName);
- if (sourceFile) {
- this.context = sourceFile.fileName;
- var node = this.findNode(sourceFile, position);
- if (node) {
- return this.getSourceFromNode(fileName, this.host.getScriptVersion(sourceFile.fileName), node);
- }
- }
- else {
- this.ensureTemplateMap();
- // TODO: Cannocalize the file?
- var componentType = this.fileToComponent.get(fileName);
- if (componentType) {
- return this.getSourceFromType(fileName, this.host.getScriptVersion(fileName), componentType);
- }
- }
- return undefined;
- };
- TypeScriptServiceHost.prototype.getAnalyzedModules = function () {
- this.updateAnalyzedModules();
- return this.ensureAnalyzedModules();
- };
- TypeScriptServiceHost.prototype.ensureAnalyzedModules = function () {
- var analyzedModules = this.analyzedModules;
- if (!analyzedModules) {
- if (this.host.getScriptFileNames().length === 0) {
- analyzedModules = {
- files: [],
- ngModuleByPipeOrDirective: new Map(),
- ngModules: [],
- };
- }
- else {
- var analyzeHost = { isSourceFile: function (filePath) { return true; } };
- var programFiles = this.program.getSourceFiles().map(function (sf) { return sf.fileName; });
- analyzedModules =
- analyzeNgModules(programFiles, analyzeHost, this.staticSymbolResolver, this.resolver);
- }
- this.analyzedModules = analyzedModules;
- }
- return analyzedModules;
- };
- TypeScriptServiceHost.prototype.getTemplates = function (fileName) {
- var _this = this;
- this.ensureTemplateMap();
- var componentType = this.fileToComponent.get(fileName);
- if (componentType) {
- var templateSource = this.getTemplateAt(fileName, 0);
- if (templateSource) {
- return [templateSource];
- }
- }
- else {
- var version_1 = this.host.getScriptVersion(fileName);
- var result_1 = [];
- // Find each template string in the file
- var visit_1 = function (child) {
- var templateSource = _this.getSourceFromNode(fileName, version_1, child);
- if (templateSource) {
- result_1.push(templateSource);
- }
- else {
- ts.forEachChild(child, visit_1);
- }
- };
- var sourceFile = this.getSourceFile(fileName);
- if (sourceFile) {
- this.context = sourceFile.path || sourceFile.fileName;
- ts.forEachChild(sourceFile, visit_1);
- }
- return result_1.length ? result_1 : undefined;
- }
- };
- TypeScriptServiceHost.prototype.getDeclarations = function (fileName) {
- var _this = this;
- var result = [];
- var sourceFile = this.getSourceFile(fileName);
- if (sourceFile) {
- var visit_2 = function (child) {
- var declaration = _this.getDeclarationFromNode(sourceFile, child);
- if (declaration) {
- result.push(declaration);
- }
- else {
- ts.forEachChild(child, visit_2);
- }
- };
- ts.forEachChild(sourceFile, visit_2);
- }
- return result;
- };
- TypeScriptServiceHost.prototype.getSourceFile = function (fileName) {
- return this.tsService.getProgram().getSourceFile(fileName);
- };
- TypeScriptServiceHost.prototype.updateAnalyzedModules = function () {
- this.validate();
- if (this.modulesOutOfDate) {
- this.analyzedModules = null;
- this._reflector = null;
- this.templateReferences = null;
- this.fileToComponent = null;
- this.ensureAnalyzedModules();
- this.modulesOutOfDate = false;
- }
- };
- Object.defineProperty(TypeScriptServiceHost.prototype, "program", {
- get: function () { return this.tsService.getProgram(); },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(TypeScriptServiceHost.prototype, "checker", {
- get: function () {
- var checker = this._checker;
- if (!checker) {
- checker = this._checker = this.program.getTypeChecker();
- }
- return checker;
- },
- enumerable: true,
- configurable: true
- });
- TypeScriptServiceHost.prototype.validate = function () {
- var _this = this;
- var e_1, _a;
- var program = this.program;
- if (this.lastProgram !== program) {
- // Invalidate file that have changed in the static symbol resolver
- var invalidateFile = function (fileName) {
- return _this._staticSymbolResolver.invalidateFile(fileName);
- };
- this.clearCaches();
- var seen_1 = new Set();
- try {
- for (var _b = __values(this.program.getSourceFiles()), _c = _b.next(); !_c.done; _c = _b.next()) {
- var sourceFile = _c.value;
- var fileName = sourceFile.fileName;
- seen_1.add(fileName);
- var version = this.host.getScriptVersion(fileName);
- var lastVersion = this.fileVersions.get(fileName);
- if (version != lastVersion) {
- this.fileVersions.set(fileName, version);
- if (this._staticSymbolResolver) {
- invalidateFile(fileName);
- }
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_1) throw e_1.error; }
- }
- // Remove file versions that are no longer in the file and invalidate them.
- var missing = Array.from(this.fileVersions.keys()).filter(function (f) { return !seen_1.has(f); });
- missing.forEach(function (f) { return _this.fileVersions.delete(f); });
- if (this._staticSymbolResolver) {
- missing.forEach(invalidateFile);
- }
- this.lastProgram = program;
- }
- };
- TypeScriptServiceHost.prototype.clearCaches = function () {
- this._checker = null;
- this._typeCache = [];
- this._resolver = null;
- this.collectedErrors = null;
- this.modulesOutOfDate = true;
- };
- TypeScriptServiceHost.prototype.ensureTemplateMap = function () {
- var e_2, _a, e_3, _b;
- if (!this.fileToComponent || !this.templateReferences) {
- var fileToComponent = new Map();
- var templateReference = [];
- var ngModuleSummary = this.getAnalyzedModules();
- var urlResolver = createOfflineCompileUrlResolver();
- try {
- for (var _c = __values(ngModuleSummary.ngModules), _d = _c.next(); !_d.done; _d = _c.next()) {
- var module_1 = _d.value;
- try {
- for (var _e = __values(module_1.declaredDirectives), _f = _e.next(); !_f.done; _f = _e.next()) {
- var directive = _f.value;
- var metadata = this.resolver.getNonNormalizedDirectiveMetadata(directive.reference).metadata;
- if (metadata.isComponent && metadata.template && metadata.template.templateUrl) {
- var templateName = urlResolver.resolve(this.reflector.componentModuleUrl(directive.reference), metadata.template.templateUrl);
- fileToComponent.set(templateName, directive.reference);
- templateReference.push(templateName);
- }
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
- }
- finally { if (e_3) throw e_3.error; }
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_2) throw e_2.error; }
- }
- this.fileToComponent = fileToComponent;
- this.templateReferences = templateReference;
- }
- };
- TypeScriptServiceHost.prototype.getSourceFromDeclaration = function (fileName, version, source, span, type, declaration, node, sourceFile) {
- var queryCache = undefined;
- var t = this;
- if (declaration) {
- return {
- version: version,
- source: source,
- span: span,
- type: type,
- get members() {
- return getClassMembersFromDeclaration(t.program, t.checker, sourceFile, declaration);
- },
- get query() {
- if (!queryCache) {
- var pipes_1 = [];
- var templateInfo = t.getTemplateAstAtPosition(fileName, node.getStart());
- if (templateInfo) {
- pipes_1 = templateInfo.pipes;
- }
- queryCache = getSymbolQuery(t.program, t.checker, sourceFile, function () { return getPipesTable(sourceFile, t.program, t.checker, pipes_1); });
- }
- return queryCache;
- }
- };
- }
- };
- TypeScriptServiceHost.prototype.getSourceFromNode = function (fileName, version, node) {
- var result = undefined;
- switch (node.kind) {
- case ts.SyntaxKind.NoSubstitutionTemplateLiteral:
- case ts.SyntaxKind.StringLiteral:
- var _a = __read(this.getTemplateClassDeclFromNode(node), 2), declaration = _a[0], decorator = _a[1];
- if (declaration && declaration.name) {
- var sourceFile = this.getSourceFile(fileName);
- if (sourceFile) {
- return this.getSourceFromDeclaration(fileName, version, this.stringOf(node) || '', shrink(spanOf$3(node)), this.reflector.getStaticSymbol(sourceFile.fileName, declaration.name.text), declaration, node, sourceFile);
- }
- }
- break;
- }
- return result;
- };
- TypeScriptServiceHost.prototype.getSourceFromType = function (fileName, version, type) {
- var result = undefined;
- var declaration = this.getTemplateClassFromStaticSymbol(type);
- if (declaration) {
- var snapshot = this.host.getScriptSnapshot(fileName);
- if (snapshot) {
- var source = snapshot.getText(0, snapshot.getLength());
- result = this.getSourceFromDeclaration(fileName, version, source, { start: 0, end: source.length }, type, declaration, declaration, declaration.getSourceFile());
- }
- }
- return result;
- };
- Object.defineProperty(TypeScriptServiceHost.prototype, "reflectorHost", {
- get: function () {
- var _this = this;
- var result = this._reflectorHost;
- if (!result) {
- if (!this.context) {
- // Make up a context by finding the first script and using that as the base dir.
- var scriptFileNames = this.host.getScriptFileNames();
- if (0 === scriptFileNames.length) {
- throw new Error('Internal error: no script file names found');
- }
- this.context = scriptFileNames[0];
- }
- // Use the file context's directory as the base directory.
- // The host's getCurrentDirectory() is not reliable as it is always "" in
- // tsserver. We don't need the exact base directory, just one that contains
- // a source file.
- var source = this.tsService.getProgram().getSourceFile(this.context);
- if (!source) {
- throw new Error('Internal error: no context could be determined');
- }
- var tsConfigPath = findTsConfig(source.fileName);
- var basePath = path.dirname(tsConfigPath || this.context);
- var options = { basePath: basePath, genDir: basePath };
- var compilerOptions = this.host.getCompilationSettings();
- if (compilerOptions && compilerOptions.baseUrl) {
- options.baseUrl = compilerOptions.baseUrl;
- }
- if (compilerOptions && compilerOptions.paths) {
- options.paths = compilerOptions.paths;
- }
- result = this._reflectorHost =
- new ReflectorHost(function () { return _this.tsService.getProgram(); }, this.host, options);
- }
- return result;
- },
- enumerable: true,
- configurable: true
- });
- TypeScriptServiceHost.prototype.collectError = function (error, filePath) {
- if (filePath) {
- var errorMap = this.collectedErrors;
- if (!errorMap || !this.collectedErrors) {
- errorMap = this.collectedErrors = new Map();
- }
- var errors = errorMap.get(filePath);
- if (!errors) {
- errors = [];
- this.collectedErrors.set(filePath, errors);
- }
- errors.push(error);
- }
- };
- Object.defineProperty(TypeScriptServiceHost.prototype, "staticSymbolResolver", {
- get: function () {
- var _this = this;
- var result = this._staticSymbolResolver;
- if (!result) {
- this._summaryResolver = new AotSummaryResolver({
- loadSummary: function (filePath) { return null; },
- isSourceFile: function (sourceFilePath) { return true; },
- toSummaryFileName: function (sourceFilePath) { return sourceFilePath; },
- fromSummaryFileName: function (filePath) { return filePath; },
- }, this._staticSymbolCache);
- result = this._staticSymbolResolver = new StaticSymbolResolver(this.reflectorHost, this._staticSymbolCache, this._summaryResolver, function (e, filePath) { return _this.collectError(e, filePath); });
- }
- return result;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(TypeScriptServiceHost.prototype, "reflector", {
- get: function () {
- var _this = this;
- var result = this._reflector;
- if (!result) {
- var ssr = this.staticSymbolResolver;
- result = this._reflector = new StaticReflector(this._summaryResolver, ssr, [], [], function (e, filePath) { return _this.collectError(e, filePath); });
- }
- return result;
- },
- enumerable: true,
- configurable: true
- });
- TypeScriptServiceHost.prototype.getTemplateClassFromStaticSymbol = function (type) {
- var source = this.getSourceFile(type.filePath);
- if (source) {
- var declarationNode = ts.forEachChild(source, function (child) {
- if (child.kind === ts.SyntaxKind.ClassDeclaration) {
- var classDeclaration = child;
- if (classDeclaration.name != null && classDeclaration.name.text === type.name) {
- return classDeclaration;
- }
- }
- });
- return declarationNode;
- }
- return undefined;
- };
- /**
- * Given a template string node, see if it is an Angular template string, and if so return the
- * containing class.
- */
- TypeScriptServiceHost.prototype.getTemplateClassDeclFromNode = function (currentToken) {
- // Verify we are in a 'template' property assignment, in an object literal, which is an call
- // arg, in a decorator
- var parentNode = currentToken.parent; // PropertyAssignment
- if (!parentNode) {
- return TypeScriptServiceHost.missingTemplate;
- }
- if (parentNode.kind !== ts.SyntaxKind.PropertyAssignment) {
- return TypeScriptServiceHost.missingTemplate;
- }
- else {
- // TODO: Is this different for a literal, i.e. a quoted property name like "template"?
- if (parentNode.name.text !== 'template') {
- return TypeScriptServiceHost.missingTemplate;
- }
- }
- parentNode = parentNode.parent; // ObjectLiteralExpression
- if (!parentNode || parentNode.kind !== ts.SyntaxKind.ObjectLiteralExpression) {
- return TypeScriptServiceHost.missingTemplate;
- }
- parentNode = parentNode.parent; // CallExpression
- if (!parentNode || parentNode.kind !== ts.SyntaxKind.CallExpression) {
- return TypeScriptServiceHost.missingTemplate;
- }
- var callTarget = parentNode.expression;
- var decorator = parentNode.parent; // Decorator
- if (!decorator || decorator.kind !== ts.SyntaxKind.Decorator) {
- return TypeScriptServiceHost.missingTemplate;
- }
- var declaration = decorator.parent; // ClassDeclaration
- if (!declaration || declaration.kind !== ts.SyntaxKind.ClassDeclaration) {
- return TypeScriptServiceHost.missingTemplate;
- }
- return [declaration, callTarget];
- };
- TypeScriptServiceHost.prototype.getCollectedErrors = function (defaultSpan, sourceFile) {
- var errors = (this.collectedErrors && this.collectedErrors.get(sourceFile.fileName));
- return (errors && errors.map(function (e) {
- var line = e.line || (e.position && e.position.line);
- var column = e.column || (e.position && e.position.column);
- var span = spanAt$1(sourceFile, line, column) || defaultSpan;
- if (isFormattedError(e)) {
- return errorToDiagnosticWithChain(e, span);
- }
- return { message: e.message, span: span };
- })) ||
- [];
- };
- TypeScriptServiceHost.prototype.getDeclarationFromNode = function (sourceFile, node) {
- var e_4, _a;
- if (node.kind == ts.SyntaxKind.ClassDeclaration && node.decorators &&
- node.name) {
- try {
- for (var _b = __values(node.decorators), _c = _b.next(); !_c.done; _c = _b.next()) {
- var decorator = _c.value;
- if (decorator.expression && decorator.expression.kind == ts.SyntaxKind.CallExpression) {
- var classDeclaration = node;
- if (classDeclaration.name) {
- var call = decorator.expression;
- var target = call.expression;
- var type = this.checker.getTypeAtLocation(target);
- if (type) {
- var staticSymbol = this.reflector.getStaticSymbol(sourceFile.fileName, classDeclaration.name.text);
- try {
- if (this.resolver.isDirective(staticSymbol)) {
- var metadata = this.resolver.getNonNormalizedDirectiveMetadata(staticSymbol).metadata;
- var declarationSpan = spanOf$3(target);
- return {
- type: staticSymbol,
- declarationSpan: declarationSpan,
- metadata: metadata,
- errors: this.getCollectedErrors(declarationSpan, sourceFile)
- };
- }
- }
- catch (e) {
- if (e.message) {
- this.collectError(e, sourceFile.fileName);
- var declarationSpan = spanOf$3(target);
- return {
- type: staticSymbol,
- declarationSpan: declarationSpan,
- errors: this.getCollectedErrors(declarationSpan, sourceFile)
- };
- }
- }
- }
- }
- }
- }
- }
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_4) throw e_4.error; }
- }
- }
- };
- TypeScriptServiceHost.prototype.stringOf = function (node) {
- switch (node.kind) {
- case ts.SyntaxKind.NoSubstitutionTemplateLiteral:
- return node.text;
- case ts.SyntaxKind.StringLiteral:
- return node.text;
- }
- };
- TypeScriptServiceHost.prototype.findNode = function (sourceFile, position) {
- function find(node) {
- if (position >= node.getStart() && position < node.getEnd()) {
- return ts.forEachChild(node, find) || node;
- }
- }
- return find(sourceFile);
- };
- TypeScriptServiceHost.prototype.getTemplateAstAtPosition = function (fileName, position) {
- var template = this.getTemplateAt(fileName, position);
- if (template) {
- var astResult = this.getTemplateAst(template, fileName);
- if (astResult && astResult.htmlAst && astResult.templateAst && astResult.directive &&
- astResult.directives && astResult.pipes && astResult.expressionParser)
- return {
- position: position,
- fileName: fileName,
- template: template,
- htmlAst: astResult.htmlAst,
- directive: astResult.directive,
- directives: astResult.directives,
- pipes: astResult.pipes,
- templateAst: astResult.templateAst,
- expressionParser: astResult.expressionParser
- };
- }
- return undefined;
- };
- TypeScriptServiceHost.prototype.getTemplateAst = function (template, contextFile) {
- var _this = this;
- var result = undefined;
- try {
- var resolvedMetadata = this.resolver.getNonNormalizedDirectiveMetadata(template.type);
- var metadata = resolvedMetadata && resolvedMetadata.metadata;
- if (metadata) {
- var rawHtmlParser = new HtmlParser();
- var htmlParser = new I18NHtmlParser(rawHtmlParser);
- var expressionParser = new Parser$1(new Lexer());
- var config = new CompilerConfig();
- var parser = new TemplateParser(config, this.resolver.getReflector(), expressionParser, new DomElementSchemaRegistry(), htmlParser, null, []);
- var htmlResult = htmlParser.parse(template.source, '', { tokenizeExpansionForms: true });
- var analyzedModules = this.getAnalyzedModules();
- var errors = undefined;
- var ngModule = analyzedModules.ngModuleByPipeOrDirective.get(template.type);
- if (!ngModule) {
- // Reported by the the declaration diagnostics.
- ngModule = findSuitableDefaultModule(analyzedModules);
- }
- if (ngModule) {
- var directives = ngModule.transitiveModule.directives
- .map(function (d) { return _this.resolver.getNonNormalizedDirectiveMetadata(d.reference); })
- .filter(function (d) { return d; })
- .map(function (d) { return d.metadata.toSummary(); });
- var pipes = ngModule.transitiveModule.pipes.map(function (p) { return _this.resolver.getOrLoadPipeMetadata(p.reference).toSummary(); });
- var schemas = ngModule.schemas;
- var parseResult = parser.tryParseHtml(htmlResult, metadata, directives, pipes, schemas);
- result = {
- htmlAst: htmlResult.rootNodes,
- templateAst: parseResult.templateAst,
- directive: metadata, directives: directives, pipes: pipes,
- parseErrors: parseResult.errors, expressionParser: expressionParser, errors: errors
- };
- }
- }
- }
- catch (e) {
- var span = template.span;
- if (e.fileName == contextFile) {
- span = template.query.getSpanAt(e.line, e.column) || span;
- }
- result = { errors: [{ kind: DiagnosticKind$1.Error, message: e.message, span: span }] };
- }
- return result || {};
- };
- TypeScriptServiceHost.missingTemplate = [undefined, undefined];
- return TypeScriptServiceHost;
- }());
- function findSuitableDefaultModule(modules) {
- var e_5, _a;
- var result = undefined;
- var resultSize = 0;
- try {
- for (var _b = __values(modules.ngModules), _c = _b.next(); !_c.done; _c = _b.next()) {
- var module_2 = _c.value;
- var moduleSize = module_2.transitiveModule.directives.length;
- if (moduleSize > resultSize) {
- result = module_2;
- resultSize = moduleSize;
- }
- }
- }
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_5) throw e_5.error; }
- }
- return result;
- }
- function findTsConfig(fileName) {
- var dir = path.dirname(fileName);
- while (fs.existsSync(dir)) {
- var candidate = path.join(dir, 'tsconfig.json');
- if (fs.existsSync(candidate))
- return candidate;
- var parentDir = path.dirname(dir);
- if (parentDir === dir)
- break;
- dir = parentDir;
- }
- }
- function spanOf$3(node) {
- return { start: node.getStart(), end: node.getEnd() };
- }
- function shrink(span, offset) {
- if (offset == null)
- offset = 1;
- return { start: span.start + offset, end: span.end - offset };
- }
- function spanAt$1(sourceFile, line, column) {
- if (line != null && column != null) {
- var position_1 = ts.getPositionOfLineAndCharacter(sourceFile, line, column);
- var findChild = function findChild(node) {
- if (node.kind > ts.SyntaxKind.LastToken && node.pos <= position_1 && node.end > position_1) {
- var betterNode = ts.forEachChild(node, findChild);
- return betterNode || node;
- }
- };
- var node = ts.forEachChild(sourceFile, findChild);
- if (node) {
- return { start: node.getStart(), end: node.getEnd() };
- }
- }
- }
- function convertChain(chain) {
- return { message: chain.message, next: chain.next ? convertChain(chain.next) : undefined };
- }
- function errorToDiagnosticWithChain(error, span) {
- return { message: error.chain ? convertChain(error.chain) : error.message, span: span };
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var projectHostMap = new WeakMap();
- function getExternalFiles(project) {
- var host = projectHostMap.get(project);
- if (host) {
- var externalFiles = host.getTemplateReferences();
- return externalFiles;
- }
- }
- function completionToEntry(c) {
- return {
- // TODO: remove any and fix type error.
- kind: c.kind,
- name: c.name,
- sortText: c.sort,
- kindModifiers: ''
- };
- }
- function diagnosticChainToDiagnosticChain(chain) {
- return {
- messageText: chain.message,
- category: ts.DiagnosticCategory.Error,
- code: 0,
- next: chain.next ? diagnosticChainToDiagnosticChain(chain.next) : undefined
- };
- }
- function diagnosticMessageToDiagnosticMessageText(message) {
- if (typeof message === 'string') {
- return message;
- }
- return diagnosticChainToDiagnosticChain(message);
- }
- function diagnosticToDiagnostic(d, file) {
- var result = {
- file: file,
- start: d.span.start,
- length: d.span.end - d.span.start,
- messageText: diagnosticMessageToDiagnosticMessageText(d.message),
- category: ts.DiagnosticCategory.Error,
- code: 0,
- source: 'ng'
- };
- return result;
- }
- function create(info) {
- var oldLS = info.languageService;
- var proxy = Object.assign({}, oldLS);
- var logger = info.project.projectService.logger;
- function tryOperation(attempting, callback) {
- try {
- return callback();
- }
- catch (e) {
- logger.info("Failed to " + attempting + ": " + e.toString());
- logger.info("Stack trace: " + e.stack);
- return null;
- }
- }
- var serviceHost = new TypeScriptServiceHost(info.languageServiceHost, oldLS);
- var ls = createLanguageService(serviceHost);
- projectHostMap.set(info.project, serviceHost);
- proxy.getCompletionsAtPosition = function (fileName, position, options) {
- var base = oldLS.getCompletionsAtPosition(fileName, position, options) || {
- isGlobalCompletion: false,
- isMemberCompletion: false,
- isNewIdentifierLocation: false,
- entries: []
- };
- tryOperation('get completions', function () {
- var e_1, _a;
- var results = ls.getCompletionsAt(fileName, position);
- if (results && results.length) {
- if (base === undefined) {
- base = {
- isGlobalCompletion: false,
- isMemberCompletion: false,
- isNewIdentifierLocation: false,
- entries: []
- };
- }
- try {
- for (var results_1 = __values(results), results_1_1 = results_1.next(); !results_1_1.done; results_1_1 = results_1.next()) {
- var entry = results_1_1.value;
- base.entries.push(completionToEntry(entry));
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (results_1_1 && !results_1_1.done && (_a = results_1.return)) _a.call(results_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- });
- return base;
- };
- proxy.getQuickInfoAtPosition = function (fileName, position) {
- var base = oldLS.getQuickInfoAtPosition(fileName, position);
- var ours = ls.getHoverAt(fileName, position);
- if (!ours) {
- return base;
- }
- var result = {
- kind: ts.ScriptElementKind.unknown,
- kindModifiers: ts.ScriptElementKindModifier.none,
- textSpan: {
- start: ours.span.start,
- length: ours.span.end - ours.span.start,
- },
- displayParts: ours.text.map(function (part) {
- return {
- text: part.text,
- kind: part.language || 'angular',
- };
- }),
- documentation: [],
- };
- if (base && base.tags) {
- result.tags = base.tags;
- }
- return result;
- };
- proxy.getSemanticDiagnostics = function (fileName) {
- var result = oldLS.getSemanticDiagnostics(fileName);
- var base = result || [];
- tryOperation('get diagnostics', function () {
- logger.info("Computing Angular semantic diagnostics...");
- var ours = ls.getDiagnostics(fileName);
- if (ours && ours.length) {
- var file_1 = oldLS.getProgram().getSourceFile(fileName);
- if (file_1) {
- base.push.apply(base, ours.map(function (d) { return diagnosticToDiagnostic(d, file_1); }));
- }
- }
- });
- return base;
- };
- proxy.getDefinitionAtPosition = function (fileName, position) {
- var base = oldLS.getDefinitionAtPosition(fileName, position);
- if (base && base.length) {
- return base;
- }
- var ours = ls.getDefinitionAt(fileName, position);
- if (ours && ours.length) {
- return ours.map(function (loc) {
- return {
- fileName: loc.fileName,
- textSpan: {
- start: loc.span.start,
- length: loc.span.end - loc.span.start,
- },
- name: '',
- kind: ts.ScriptElementKind.unknown,
- containerName: loc.fileName,
- containerKind: ts.ScriptElementKind.unknown,
- };
- });
- }
- };
- proxy.getDefinitionAndBoundSpan = function (fileName, position) {
- var base = oldLS.getDefinitionAndBoundSpan(fileName, position);
- if (base && base.definitions && base.definitions.length) {
- return base;
- }
- var ours = ls.getDefinitionAt(fileName, position);
- if (ours && ours.length) {
- return {
- definitions: ours.map(function (loc) {
- return {
- fileName: loc.fileName,
- textSpan: {
- start: loc.span.start,
- length: loc.span.end - loc.span.start,
- },
- name: '',
- kind: ts.ScriptElementKind.unknown,
- containerName: loc.fileName,
- containerKind: ts.ScriptElementKind.unknown,
- };
- }),
- textSpan: {
- start: ours[0].span.start,
- length: ours[0].span.end - ours[0].span.start,
- },
- };
- }
- };
- return proxy;
- }
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- var VERSION$3 = new Version$1('8.1.3');
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- /**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
- exports.createLanguageService = createLanguageService;
- exports.TypeScriptServiceHost = TypeScriptServiceHost;
- exports.createLanguageServiceFromTypescript = createLanguageServiceFromTypescript;
- exports.VERSION = VERSION$3;
- exports.getExternalFiles = getExternalFiles;
- exports.create = create;
- Object.defineProperty(exports, '__esModule', { value: true });
- });
- //# sourceMappingURL=language-service.umd.js.map
|