{"version":3,"sources":["../ts/modules/localization.ts"],"names":["TranslateResult","constructor","itemPath","text","found","dateFetched","expires","this","Date","getTime","serialize","toUTCString","deserialize","data","exports","currentLanguage","$","attr","currentSite","translate","let","defer","queue","cache","caching_1","SessionStorageCache","pendingRequests","fetchItems","itemsToFetch","length","itemPaths","i","itemToFetch","hasOwnProperty","resolve","promise","indexOf","push","cachedResult","cacheKey","serializedValue","get","retval","unset","fireCallback","splice","itemResult","callbackFired","setTimeout","reject","localization_1","String","then","ttl","results","datum","result","console_1","error","set","forEach","pendingRequest","translateImpl","getPromise","Array","isArray","Promise","all","map","fetch","queued","filter","q","getPromiseTry","v","immediate"],"mappings":"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","file":"localization.js","sourcesContent":["import { String as StringService } from 'services/localization';\r\nimport { ICache, SessionStorageCache } from 'caching';\r\nimport { error } from 'console';\r\nimport * as $ from 'jquery';\r\n\r\ntype CacheKey = [ string, string ];\r\n\r\ninterface ITranslateResultSerialized {\r\n\titemPath: string;\r\n\ttext: string;\r\n\tfound: boolean;\r\n\tdateFetched: string;\r\n\texpires: string;\r\n}\r\n\r\nexport interface ITranslateResult {\r\n\titemPath: string;\r\n\ttext: string;\r\n\tfound: boolean;\r\n\tdateFetched: Date;\r\n\texpires: Date;\r\n}\r\n\r\nexport interface ITranslate {\r\n\t( itemPath: string ): Promise;\r\n\tfetch( immediate?: boolean ): void;\r\n\tdefer(): void;\r\n}\r\n\r\nclass TranslateResult implements ITranslateResult {\r\n\tconstructor( itemPath: string, text: string, found: boolean, dateFetched: Date, expires: Date ) {\r\n\t\tthis.itemPath = itemPath;\r\n\t\tthis.text = text;\r\n\t\tthis.found = found;\r\n\t\tthis.dateFetched = new Date( dateFetched.getTime() );\r\n\t\tthis.expires = new Date( expires.getTime() );\r\n\t}\r\n\r\n\tpublic itemPath: string;\r\n\tpublic text: string;\r\n\tpublic found: boolean;\r\n\tpublic dateFetched: Date;\r\n\tpublic expires: Date;\r\n\r\n\tpublic serialize(): ITranslateResultSerialized {\r\n\t\tconst { itemPath, text, found, dateFetched, expires } = this;\r\n\t\treturn { itemPath, text, found, dateFetched: dateFetched.toUTCString(), expires: expires.toUTCString() };\r\n\t}\r\n\r\n\tpublic static deserialize( data: ITranslateResultSerialized ) {\r\n\t\tconst { itemPath, text, found, dateFetched, expires } = data;\r\n\t\treturn new TranslateResult( itemPath, text, found, new Date( dateFetched ), new Date( expires ) );\r\n\t}\r\n}\r\n\r\ninterface IQueuedTranslate {\r\n\titemPath: string;\r\n\tpromise: Promise;\r\n\tresolve( result: ITranslateResult ): void;\r\n\tresolve( result: PromiseLike ): void;\r\n\treject( result?: ITranslateResult ): void;\r\n}\r\n\r\nexport const currentLanguage = $( 'html' ).attr( 'lang' ) || 'en';\r\nexport const currentSite = $( 'html' ).attr( 'data-site' ) || 'US';\r\n\r\nexport const translate: ITranslate = ( () => {\r\n\tlet defer = 0;\r\n\tconst queue: Array = [],\r\n\t\tcache: ICache = new SessionStorageCache( 'translate' ),\r\n\t\tpendingRequests: { [ itemPath: string ]: IQueuedTranslate } = {};\r\n\r\n\tfunction getCachedResult( itemPath: string ): ITranslateResult {\r\n\t\tconst cacheKey: CacheKey = [ currentLanguage, itemPath ],\r\n\t\t\tserializedValue = cache.get( cacheKey );\r\n\t\tif( !serializedValue ) return undefined;\r\n\t\tconst retval = TranslateResult.deserialize( serializedValue );\r\n\t\tif( retval.expires < ( new Date ) ) {\r\n\t\t\tcache.unset( cacheKey );\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\treturn retval;\r\n\t}\r\n\r\n\tfunction fetchItems( itemsToFetch: Array ) {\r\n\t\tif( itemsToFetch.length <= 0 ) return;\r\n\r\n\t\tconst itemPaths: Array = [];\r\n\r\n\t\tfunction fireCallback( itemResult: ITranslateResult ) {\r\n\t\t\tconst callbackFired: IQueuedTranslate = pendingRequests[ itemResult.itemPath ];\r\n\t\t\tdelete pendingRequests[ itemResult.itemPath ];\r\n\r\n\t\t\tif( !callbackFired ) return;\r\n\r\n\t\t\tsetTimeout( () => {\r\n\t\t\t\tif( itemResult.found ) callbackFired.resolve( itemResult );\r\n\t\t\t\telse callbackFired.reject( itemResult );\r\n\t\t\t}, 0 );\r\n\t\t}\r\n\r\n\t\tfor( let i = 0; i < itemsToFetch.length; i++ ) {\r\n\t\t\tlet itemToFetch = itemsToFetch[ i ],\r\n\t\t\t\titemPath = itemToFetch.itemPath;\r\n\r\n\t\t\tif( pendingRequests.hasOwnProperty( itemPath ) ) {\r\n\t\t\t\titemToFetch.resolve( pendingRequests[ itemPath ].promise );\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif( itemPaths.indexOf( itemPath ) < 0 ) itemPaths.push( itemPath );\r\n\r\n\t\t\tpendingRequests[ itemPath ] = itemToFetch;\r\n\t\t}\r\n\r\n\t\tfor( let i = 0; i < itemPaths.length; i++ ) {\r\n\t\t\tlet itemPath = itemPaths[ i ],\r\n\t\t\t\tcachedResult = getCachedResult( itemPath );\r\n\t\t\tif( cachedResult ) {\r\n\t\t\t\tfireCallback( cachedResult );\r\n\t\t\t\titemPaths.splice( i--, 1 );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif( itemPaths.length <= 0 ) return;\r\n\t\t\t\r\n\t\t( new StringService ).translate( itemPaths, currentLanguage )\r\n\t\t.then(\r\n\t\t\tdata => {\r\n\t\t\t\tconst dateFetched = new Date(),\r\n\t\t\t\t\tttl = data.ttl || 0,\r\n\t\t\t\t\tresults = [];\r\n\t\t\t\tfor( let i = 0; i < data.results.length; i++ ) {\r\n\t\t\t\t\tconst datum = data.results[ i ],\r\n\t\t\t\t\t\tresult = new TranslateResult( datum.itemPath, datum.text, datum.found, dateFetched, new Date( dateFetched.getTime() + ttl ) );\r\n\r\n\t\t\t\t\tif( !result.found ) {\r\n\t\t\t\t\t\terror( `Translate: Dictionary entry not found: ${datum.itemPath}` );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcache.set( [ currentLanguage, result.itemPath ], result.serialize() );\r\n\t\t\t\t\tresults.push( result );\r\n\t\t\t\t\tfireCallback( result );\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t() => {\r\n\t\t\titemPaths.forEach( itemPath => {\r\n\t\t\t\tconst pendingRequest = pendingRequests[ itemPath ];\r\n\t\t\t\tif( pendingRequest ) {\r\n\t\t\t\t\tpendingRequest.reject();\r\n\t\t\t\t\tdelete pendingRequests[ itemPath ];\r\n\t\t\t\t}\r\n\t\t\t} );\r\n\t\t} );\r\n\t}\r\n\t\t\r\n\tfunction translateImpl( itemPath: string, getPromise: ( itemPath: string ) => Promise ): Promise;\r\n\tfunction translateImpl( itemPaths: Array, getPromise: ( itemPath: string ) => Promise ): Promise>;\r\n\tfunction translateImpl( itemPaths: any, getPromise: ( itemPath: string ) => Promise ): any {\r\n\t\tif( Array.isArray( itemPaths ) ) {\r\n\t\t\ttranslate.defer();\r\n\t\t\tconst retval = Promise.all( (>itemPaths).map( getPromise ) );\r\n\t\t\ttranslate.fetch();\r\n\t\t\treturn retval;\r\n\t\t} else {\r\n\t\t\treturn getPromise( itemPaths );\r\n\t\t}\r\n\t}\r\n\r\n\tfunction getPromise( itemPath: string ) {\r\n\t\tconst queued = queue.filter( q => q.itemPath === itemPath )[ 0 ];\r\n\t\tif( queued ) return queued.promise;\r\n\t\tif( pendingRequests.hasOwnProperty( itemPath ) ) return pendingRequests[ itemPath ].promise;\r\n\r\n\t\tconst itemToFetch = { itemPath, promise: >null, resolve: <(result?: any) => any>null, reject: <(result?: any) => any>null },\r\n\t\t\tpromise = new Promise( ( resolve, reject ) => {\r\n\t\t\t\titemToFetch.resolve = resolve;\r\n\t\t\t\titemToFetch.reject = reject;\r\n\t\t\t\tif( defer > 0 ) queue.push( itemToFetch );\r\n\t\t\t\telse fetchItems( [ itemToFetch ] );\r\n\t\t\t} );\r\n\t\titemToFetch.promise = promise;\r\n\t\treturn promise;\r\n\t}\r\n\r\n\tfunction getPromiseTry( itemPath: string ) {\r\n\t\treturn getPromise( itemPath ).then( v => v, v => v );\r\n\t}\r\n\r\n\tvar translate: any = itemPaths => translateImpl( itemPaths, getPromise );\r\n\r\n\ttranslate[ 'try' ] = itemPaths => translateImpl( itemPaths, getPromiseTry );\r\n\r\n\ttranslate.fetch = ( immediate?: boolean ) => {\r\n\t\tif( defer > 0 ) {\r\n\t\t\tif( immediate ) defer = 0;\r\n\t\t\telse --defer;\r\n\t\t}\r\n\t\tif( defer <= 0 ) {\r\n\t\t\tdefer = 0;\r\n\t\t\tfetchItems( queue.splice( 0, queue.length ) );\r\n\t\t}\r\n\t};\r\n\r\n\ttranslate.defer = () => { ++defer; };\r\n\r\n\treturn translate;\r\n} )();\r\n"]}