{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/store/leftDrawer.ts","webpack:///./src/App.vue?864c","webpack:///./src/styles/quasar.scss?4b69","webpack:///./src/utils/impl.ts","webpack:///./src/validation/uploadStateValidationModel.ts","webpack:///./src/store/validation.ts","webpack:///./src/utils/fileListExtensions.ts","webpack:///./src/router/routes/apiTest.ts","webpack:///./src/validation/common/rules.ts","webpack:///./src/settings.ts","webpack:///./src/router/routes/subscriptions.ts","webpack:///./src/utils/stringUtils.ts","webpack:///./src/store/apiTest/upload.ts","webpack:///./src/router/paramTransformer.ts","webpack:///./src/router/index.ts","webpack:///./src/utils/nullable.ts","webpack:///./src/store/contracts/apiTest/upload.ts","webpack:///./src/utils/arrayExtensions.ts","webpack:///./src/utils/stringExtensions.ts","webpack:///./src/App.vue","webpack:///./src/App.vue?a672","webpack:///./src/quasar-user-options.js","webpack:///./src/store/utils/axiosAdminMsalInterceptor.ts","webpack:///./src/store/utils/axiosAdminSubscriptionKeyInterceptor.ts","webpack:///./src/store/utils/axiosClientSubscriptionKeyInterceptor.ts","webpack:///./src/main.ts","webpack:///./src/validation/index.ts","webpack:///./src/router/routes/imageCategories.ts","webpack:///./src/App.vue?a8b5","webpack:///./src/store/login.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","LeftDrawerStoreKey","provided","createState","open","setLeftDrawerState","state","toggleLeftDrawer","provideStore","app","provide","useStore","impl","UploadStateFieldName","UploadStateValidationModel","setField","SubscriptionKey","model","subscriptionKey","rules","ValidationStoreKey","results","modelResults","modelName","fieldResult","fieldKey","fieldIsError","fieldErrorMessage","isValid","checkSubModels","checkSubModelsValue","startsWithCheck","subModels","keys","filter","k","startsWith","flatMap","map","none","isError","setResults","setModelFieldResult","areValid","models","reduce","acc","curr","validateModel","dataGetter","validate","validateModelField","field","validateField","doValidations","newResults","doValidation","modelValue","doFieldsValidation","fields","clear","forEach","subModel","reset","storeState","createForState","store","FileList","toArray","files","this","f","item","ApiTestRoutes","stringRequiredRule","getValueRequiredRule","trim","numberRequiredRule","isNaN","conditionalRules","predicate","rule","context","check","checker","errorMessage","errorMsg","Settings","appVersion","adminApiBaseUrl","adminApiSubscriptionKey","clientApiBaseUrl","clientApiSubscriptionKey","msalClientId","msalTenantId","msalAppIdentifier","environmentMode","defaultContractQuota","val","Number","parseInt","defaultMonthlyQuota","defaultDailyQuota","SubscriptionRoutes","isNullOrWhitespace","UploadStoreKey","Batch","uploads","isOpen","notify","routedNamespace","uploadId","setUploads","setIsOpen","setNotify","setRoutedNamespace","setSubscriptionKey","upload","namespace","url","uploadComplete","sendRequest","cancelTokenSource","CancelToken","source","cancelToken","token","id","fileName","xhr","uploadState","loading","cancelled","setRequestState","requestState","u","stateUpload","find","su","setStatusDisplay","statusDisplay","setAxiosResponse","response","blob","Blob","contentType","post","withCredentials","headers","myNamespace","findIndex","success","catch","failed","abortUpload","index","namespaceUpload","cancel","cleanupSuccess","doTransformations","transforms","query","route","props","params","param","transform","transformRouteParams","passThrough","paramValue","String","routes","path","component","children","base","redirect","list","view","subscriptionId","generate","transactions","imageAnalysis","router","history","nullable","onNotNull","possiblyNull","UploadState","shim","Array","distinct","distinctBy","values","Set","v","has","add","some","sortBy","sortFn","sort","item1","item2","value1","value2","filterNulls","orDefault","arr","groupBy","next","min","defaultValue","max","capitalize","charAt","toUpperCase","replaceAllInstances","searchStr","replaceWith","parts","split","join","localeIncludes","options","toString","thisStr","opts","collator","Intl","Collator","_c","idx","compare","$route","fullPath","render","config","screen","bodyClasses","plugins","Notify","Loading","Dialog","Mutation","iconSet","registerAdminMsalInterceptor","axios","interceptors","use","urlstr","baseURL","URL","adminUrl","hostname","toLowerCase","login","getAccessToken","accessToken","Authorization","registerAdminSubscriptionKeyInterceptor","urlStr","registerClientSubscriptionKeyInterceptor","clientUrl","App","loginStore","loadStoreState","mount","ValidationModel","thisModel","parentModel","ImageCategoryRoutes","LoginStoreKey","msalConfig","auth","clientId","authority","cache","cacheLocation","storeAuthStateInCookie","msal","loginRequest","scopes","account","setAccount","getAccount","currentAccounts","getAllAccounts","handleAuthResponse","handleRedirectPromise","authResult","isSignedIn","signIn","loginRedirect","signOut","logoutReq","logoutRedirect","acquireTokenSilent"],"mappings":"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","file":"js/app.301acfd7.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({\"apiTest~imageCategories~subscriptions\":\"apiTest~imageCategories~subscriptions\",\"apiTest\":\"apiTest\",\"imageCategories~subscriptions\":\"imageCategories~subscriptions\",\"imageCategories\":\"imageCategories\",\"subscriptions\":\"subscriptions\"}[chunkId]||chunkId) + \".\" + {\"apiTest~imageCategories~subscriptions\":\"aa3efae4\",\"apiTest\":\"0e2f0d91\",\"imageCategories~subscriptions\":\"411acf82\",\"imageCategories\":\"f7964720\",\"subscriptions\":\"c305b460\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"apiTest~imageCategories~subscriptions\":1,\"apiTest\":1,\"imageCategories\":1,\"subscriptions\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({\"apiTest~imageCategories~subscriptions\":\"apiTest~imageCategories~subscriptions\",\"apiTest\":\"apiTest\",\"imageCategories~subscriptions\":\"imageCategories~subscriptions\",\"imageCategories\":\"imageCategories\",\"subscriptions\":\"subscriptions\"}[chunkId]||chunkId) + \".\" + {\"apiTest~imageCategories~subscriptions\":\"95f6ac95\",\"apiTest\":\"36bdc954\",\"imageCategories~subscriptions\":\"31d6cfe0\",\"imageCategories\":\"e7c4bdfc\",\"subscriptions\":\"03539526\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { provide, inject, reactive, App, readonly } from 'vue';\r\nimport {\r\n ILeftDrawerState,\r\n ILeftDrawerStore,\r\n TSetLeftDrawerState,\r\n TToggleLeftDrawer\r\n} from '@/store/contracts/leftDrawer';\r\nimport { impl } from '@/utils/impl';\r\n\r\nconst LeftDrawerStoreKey = Symbol('LeftDrawerStore');\r\nlet provided = false;\r\n\r\nconst createState = () => reactive(impl({\r\n open: true\r\n}));\r\n\r\nfunction setLeftDrawerState (state: ILeftDrawerState): TSetLeftDrawerState {\r\n return (value) => {\r\n state.open = value;\r\n };\r\n}\r\n\r\nfunction toggleLeftDrawer (state: ILeftDrawerState): TToggleLeftDrawer {\r\n return () => {\r\n setLeftDrawerState(state)(!state.open);\r\n };\r\n}\r\n\r\nexport function provideStore (app?: App): void {\r\n if (!provided) {\r\n provided = true;\r\n if (app !== undefined) {\r\n app.provide(LeftDrawerStoreKey, createState());\r\n } else {\r\n provide(LeftDrawerStoreKey, createState());\r\n }\r\n }\r\n}\r\n\r\nexport function useStore (): ILeftDrawerStore {\r\n const state = inject(LeftDrawerStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using LeftDrawerStore before providing it!');\r\n }\r\n\r\n return {\r\n state: readonly(state),\r\n setLeftDrawerState: setLeftDrawerState(state),\r\n toggleLeftDrawer: toggleLeftDrawer(state)\r\n };\r\n}\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Gray50\":\"#fafafa\",\"Gray100\":\"#f2f4f5\",\"Gray200\":\"#ebeff2\",\"Gray300\":\"#dae0e6\",\"Gray400\":\"#bec5cc\",\"Gray500\":\"#a1aab3\",\"Gray600\":\"#8a9299\",\"Gray700\":\"#737980\",\"Gray800\":\"#5c6166\",\"Gray900\":\"#45494d\",\"Navy50\":\"#bde3fc\",\"Navy100\":\"#7ec9fc\",\"Navy200\":\"#3faffc\",\"Navy300\":\"#0095fc\",\"Navy400\":\"#0086e3\",\"Navy500\":\"#0077c9\",\"Navy600\":\"#0068b0\",\"Navy700\":\"#005996\",\"Navy800\":\"#004a7d\",\"Navy900\":\"#002b49\",\"Blue50\":\"#bbeafa\",\"Blue100\":\"#7ddafa\",\"Blue200\":\"#3ecafa\",\"Blue300\":\"#00bbfa\",\"Blue400\":\"#00a8e1\",\"Blue500\":\"#0095c7\",\"Blue600\":\"#0081ad\",\"Blue700\":\"#006e94\",\"Blue800\":\"#005b7a\",\"Blue900\":\"#004861\",\"Red50\":\"#f2b5c1\",\"Red100\":\"#f2798f\",\"Red200\":\"#f23d5e\",\"Red300\":\"#f2002c\",\"Red400\":\"#d90027\",\"Red500\":\"#bf0023\",\"Red600\":\"#a6001e\",\"Red700\":\"#8c001a\",\"Red800\":\"#730015\",\"Red900\":\"#590010\",\"Yellow50\":\"#fcf8bd\",\"Yellow100\":\"#fcf37e\",\"Yellow200\":\"#fcef3f\",\"Yellow300\":\"#fceb00\",\"Yellow400\":\"#e3d400\",\"Yellow500\":\"#c9bc00\",\"White\":\"#fff\",\"Black\":\"#17181a\",\"Orange\":\"#ff8900\",\"Transparent\":\"rgba(255,255,255,0)\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Gray50\":\"#fafafa\",\"Gray100\":\"#f2f4f5\",\"Gray200\":\"#ebeff2\",\"Gray300\":\"#dae0e6\",\"Gray400\":\"#bec5cc\",\"Gray500\":\"#a1aab3\",\"Gray600\":\"#8a9299\",\"Gray700\":\"#737980\",\"Gray800\":\"#5c6166\",\"Gray900\":\"#45494d\",\"Navy50\":\"#bde3fc\",\"Navy100\":\"#7ec9fc\",\"Navy200\":\"#3faffc\",\"Navy300\":\"#0095fc\",\"Navy400\":\"#0086e3\",\"Navy500\":\"#0077c9\",\"Navy600\":\"#0068b0\",\"Navy700\":\"#005996\",\"Navy800\":\"#004a7d\",\"Navy900\":\"#002b49\",\"Blue50\":\"#bbeafa\",\"Blue100\":\"#7ddafa\",\"Blue200\":\"#3ecafa\",\"Blue300\":\"#00bbfa\",\"Blue400\":\"#00a8e1\",\"Blue500\":\"#0095c7\",\"Blue600\":\"#0081ad\",\"Blue700\":\"#006e94\",\"Blue800\":\"#005b7a\",\"Blue900\":\"#004861\",\"Red50\":\"#f2b5c1\",\"Red100\":\"#f2798f\",\"Red200\":\"#f23d5e\",\"Red300\":\"#f2002c\",\"Red400\":\"#d90027\",\"Red500\":\"#bf0023\",\"Red600\":\"#a6001e\",\"Red700\":\"#8c001a\",\"Red800\":\"#730015\",\"Red900\":\"#590010\",\"Yellow50\":\"#fcf8bd\",\"Yellow100\":\"#fcf37e\",\"Yellow200\":\"#fcef3f\",\"Yellow300\":\"#fceb00\",\"Yellow400\":\"#e3d400\",\"Yellow500\":\"#c9bc00\",\"White\":\"#fff\",\"Black\":\"#17181a\",\"Orange\":\"#ff8900\",\"Transparent\":\"rgba(255,255,255,0)\"};","/**\r\n * Use function snytax for creating an implementation of an interface\r\n * Without the need for an explicit cast, which would remove compile-time type safety.\r\n *\r\n * @param i the interface implementation\r\n * @return the interface implementation\r\n */\r\nexport function impl (i: I): I {\r\n return i;\r\n}\r\n","import { IUploadState } from '@/store/contracts/apiTest/upload';\r\nimport { ValidationModel } from '@/validation';\r\nimport { stringRequiredRule } from '@/validation/common/rules';\r\n\r\nexport enum UploadStateFieldName {\r\n SubscriptionKey = 'subscriptionKey'\r\n}\r\n\r\nclass UploadStateValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n\r\n this.setField(UploadStateFieldName.SubscriptionKey, {\r\n getter: (model) => model?.subscriptionKey ?? null,\r\n rules: [\r\n stringRequiredRule('Subscription Key is required.')\r\n ]\r\n });\r\n }\r\n\r\n public get modelName (): string {\r\n return 'UploadState';\r\n }\r\n}\r\n\r\nexport default new UploadStateValidationModel();\r\n","import {\r\n IModelValue,\r\n IValidationState,\r\n IValidationStore,\r\n TFieldErrorMessage,\r\n TFieldIsError,\r\n TFieldResult,\r\n TModelResults,\r\n TIsValid,\r\n TSetResults,\r\n TSetModelFieldResult,\r\n TDoValidations,\r\n TDoValidation,\r\n TDoFieldsValidation,\r\n IModelFieldValue,\r\n TClear,\r\n TReset\r\n} from '@/store/contracts/validation';\r\nimport { impl } from '@/utils/impl';\r\nimport { IIndexable } from '@/utils/indexable';\r\nimport { ValidationModel } from '@/validation';\r\nimport { App, inject, provide, reactive, readonly } from 'vue';\r\n\r\nconst ValidationStoreKey = Symbol('ValidationStore');\r\n\r\nconst createState = () => reactive(impl({\r\n results: {}\r\n}));\r\n\r\nfunction modelResults (state: IValidationState): TModelResults {\r\n return (modelName: string) => state.results[modelName] ?? {};\r\n}\r\n\r\nfunction fieldResult (state: IValidationState): TFieldResult {\r\n return (modelName: string, fieldKey: string) =>\r\n modelResults(state)(modelName)[fieldKey] ?? true;\r\n}\r\n\r\nfunction fieldIsError (state: IValidationState): TFieldIsError {\r\n return (modelName: string, fieldKey: string) =>\r\n fieldResult(state)(modelName, fieldKey) !== true;\r\n}\r\n\r\nfunction fieldErrorMessage (state: IValidationState): TFieldErrorMessage {\r\n return (modelName: string, fieldKey: string) => {\r\n const result = fieldResult(state)(modelName, fieldKey);\r\n return result === true ? '' : result;\r\n };\r\n}\r\n\r\nfunction isValid (state: IValidationState): TIsValid {\r\n return (model: ValidationModel, checkSubModels?: boolean) => {\r\n const checkSubModelsValue = checkSubModels ?? true;\r\n const startsWithCheck = `${model.modelName}:`;\r\n const subModels = Object.keys(state.results)\r\n .filter((k) => k.startsWith(startsWithCheck) && checkSubModelsValue);\r\n return [model.modelName, ...subModels].flatMap((modelName) => {\r\n return Object.keys(state.results[modelName] ?? {})\r\n .map((fieldKey) => fieldIsError(state)(modelName, fieldKey));\r\n }).none((isError) => isError);\r\n };\r\n}\r\n\r\nfunction setResults (state: IValidationState): TSetResults {\r\n return (results: IIndexable>) => {\r\n state.results = results;\r\n };\r\n}\r\n\r\nfunction setModelFieldResult (state: IValidationState): TSetModelFieldResult {\r\n return (modelName: string, fieldKey: string, value: string | true) => {\r\n if (state.results[modelName] === undefined) {\r\n state.results[modelName] = {};\r\n }\r\n state.results[modelName][fieldKey] = value;\r\n };\r\n}\r\n\r\nfunction areValid (state: IValidationState) : (models: Array>, checkSubModels?: boolean) => boolean {\r\n return (models: Array>, checkSubModels?: boolean) =>\r\n models.reduce(\r\n (acc: boolean, curr) => acc && isValid(state)(curr, checkSubModels),\r\n true);\r\n}\r\n\r\nasync function validateModel (\r\n dataGetter: () => IIndexable>,\r\n { model, value }: IModelValue)\r\n : Promise>> {\r\n const result = await model.validate(value);\r\n const data = dataGetter();\r\n return {\r\n ...data,\r\n [model.modelName]: {\r\n ...data[model.modelName],\r\n ...result\r\n }\r\n };\r\n}\r\n\r\nasync function validateModelField (\r\n dataGetter: () => IIndexable>,\r\n field: string,\r\n { model, value }: IModelValue)\r\n : Promise>> {\r\n const result = await model.validateField(field, value);\r\n const data = dataGetter();\r\n return {\r\n ...data,\r\n [model.modelName]: {\r\n ...(data[model.modelName] ?? {}),\r\n [field]: result\r\n }\r\n };\r\n}\r\n\r\nfunction doValidations (state: IValidationState): TDoValidations {\r\n return async (models: IModelValue[]) => {\r\n const newResults = await (models.reduce(\r\n async (acc, curr) => {\r\n const results = await acc;\r\n setResults(state)(results);\r\n return validateModel(() => state.results, curr);\r\n },\r\n Promise.resolve(state.results)));\r\n setResults(state)(newResults);\r\n return areValid(state)(\r\n models.map(({ model }: IModelValue) => model),\r\n true);\r\n };\r\n}\r\n\r\nfunction doValidation (state: IValidationState): TDoValidation {\r\n return (modelValue: IModelValue) => doValidations(state)([modelValue]);\r\n}\r\n\r\nfunction doFieldsValidation (state: IValidationState): TDoFieldsValidation {\r\n return async ({ model, fields, value }: IModelFieldValue) => {\r\n const newResults = await (fields.reduce(\r\n async (acc, curr) => {\r\n const results = await acc;\r\n setResults(state)(results);\r\n return validateModelField(\r\n () => state.results,\r\n curr,\r\n { model, value });\r\n },\r\n Promise.resolve(state.results)));\r\n setResults(state)(newResults);\r\n return isValid(state)(model, true);\r\n };\r\n}\r\n\r\nfunction clear (state: IValidationState): TClear {\r\n return (model: ValidationModel) => {\r\n const startsWithCheck = `${model.modelName}:`;\r\n const subModels = Object.keys(state.results).filter((k) => k.startsWith(startsWithCheck));\r\n const newResults = {\r\n ...state.results,\r\n [model.modelName]: {}\r\n };\r\n subModels.forEach((subModel) => { newResults[subModel] = {}; });\r\n setResults(state)(newResults);\r\n };\r\n}\r\n\r\nfunction reset (state: IValidationState): TReset {\r\n return () => {\r\n setResults(state)({});\r\n };\r\n}\r\n\r\nconst storeState = createState();\r\n\r\nconst createForState = (state: IValidationState) => impl({\r\n state: readonly(state),\r\n modelResults: modelResults(state),\r\n fieldResult: fieldResult(state),\r\n fieldIsError: fieldIsError(state),\r\n fieldErrorMessage: fieldErrorMessage(state),\r\n isValid: isValid(state),\r\n setResults: setResults(state),\r\n setModelFieldResult: setModelFieldResult(state),\r\n doValidation: doValidation(state),\r\n doValidations: doValidations(state),\r\n doFieldsValidation: doFieldsValidation(state),\r\n clear: clear(state),\r\n reset: reset(state)\r\n});\r\n\r\nexport const store: IValidationStore = createForState(storeState);\r\n\r\nexport function provideStore (app?: App): void {\r\n if (app !== undefined) {\r\n app.provide(ValidationStoreKey, storeState);\r\n } else {\r\n provide(ValidationStoreKey, storeState);\r\n }\r\n}\r\n\r\nexport function useStore (): IValidationStore {\r\n const state = inject(ValidationStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using ValidationStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","FileList.prototype.toArray = function (): File[] {\r\n const files: File[] = [];\r\n for (let i = 0; i < this.length; i++) {\r\n const f = this.item(i);\r\n if (f != null) {\r\n files.push(f);\r\n }\r\n }\r\n return files;\r\n};\r\n","export enum ApiTestRoutes {\r\n index = 'apiTest-index',\r\n imageAnalysis = 'apiTest-imageAnalysis'\r\n}\r\n","// import {FORMAT_DATE, FORMAT_TIME} from '@/utils/dateTime';\r\n// import moment from 'moment';\r\nimport { IFieldValidationContext } from '@/validation';\r\n\r\nexport type TValidationRule = (context: IFieldValidationContext) => Promise;\r\n\r\nexport const stringRequiredRule = getValueRequiredRule((value) => value !== null && value.trim().length > 0);\r\nexport const numberRequiredRule = getValueRequiredRule((value) => value !== null && !isNaN(value));\r\n\r\nexport function conditionalRules (predicate: (context: IFieldValidationContext) => boolean, rules: TValidationRule[]): TValidationRule[] {\r\n return rules.map((rule) => {\r\n return async (context) => {\r\n if (predicate(context)) {\r\n return await rule(context);\r\n }\r\n return true;\r\n };\r\n });\r\n}\r\n\r\nexport function getValueRequiredRule (\r\n check?: (value: V | null) => boolean)\r\n : (errorMessage?: string) => TValidationRule {\r\n const checker = check ?? ((value) => value !== null);\r\n return (errorMessage?: string) => {\r\n const errorMsg = errorMessage ?? 'Please enter a value.';\r\n return async ({ value }: IFieldValidationContext) => checker(value) || errorMsg;\r\n };\r\n}\r\n\r\n// Tested this here: https://regexr.com/5scv9 so I know it's good.\r\nconst emailRegex = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\r\n\r\nexport function emailFormatRule (message?: string): TValidationRule {\r\n return async ({ value }: IFieldValidationContext) =>\r\n value === null || emailRegex.test(value) || (message ?? `${value} is not a valid email.`);\r\n}\r\n\r\nexport interface IPasswordValidationOptions {\r\n length?: number;\r\n containsNumber?: true;\r\n containsUpper?: true;\r\n containsLower?: true;\r\n containsSymbol?: true;\r\n}\r\n\r\nconst digitRegex = /[0-9]/;\r\nconst symbolRegex = /[^a-zA-Z\\d\\s:]/;\r\nconst upperRegex = /[A-Z]/;\r\nconst lowerRegex = /[a-z]/;\r\n\r\nexport function passwordRequirements (options: IPasswordValidationOptions, fieldName = 'Password'): TValidationRule {\r\n return async ({ value }: IFieldValidationContext) => {\r\n if (value === null) {\r\n // We don't check password required here. use stringRequiredRule for that.\r\n return true;\r\n }\r\n\r\n if (options.length !== undefined) {\r\n if (value.length < options.length) {\r\n return `${fieldName} must be at least ${options.length} characters.`;\r\n }\r\n }\r\n\r\n if (options.containsNumber) {\r\n if (!digitRegex.test(value)) {\r\n return `${fieldName} should contain at least one number.`;\r\n }\r\n }\r\n\r\n if (options.containsLower) {\r\n if (!lowerRegex.test(value)) {\r\n return `${fieldName} should contain at least lowercase letter.`;\r\n }\r\n }\r\n\r\n if (options.containsUpper) {\r\n if (!upperRegex.test(value)) {\r\n return `${fieldName} should contain at least uppercase letter.`;\r\n }\r\n }\r\n\r\n if (options.containsSymbol) {\r\n if (!symbolRegex.test(value)) {\r\n return `${fieldName} should contain at least one symbol (#,$,%,^,&, etc).`;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n}\r\n\r\n/*\r\n For now, we don't have a need for validating dates.\r\n When we do, we can add moment as a dependency and\r\n uncomment the following code to get some common validator rules.\r\n*/\r\n\r\n// export const dateFormatRule = getDateFormatRule();\r\n// export const timeFormatRule = getTimeFormatRule();\r\n\r\n// export const dateRequiredRule: (errorMessage?: string)\r\n// => (context: IFieldValidationContext)\r\n// => Promise = (errorMessage?: string) => {\r\n// const errMsg = errorMessage ?? `Date ${FORMAT_DATE.toLowerCase()} is required.`;\r\n// return getValueRequiredRule(\r\n// (value) => value !== null && (value instanceof Date || value !== ''))(errMsg);\r\n// };\r\n\r\n// export function getDateFormatRule (\r\n// dateFormat?: string)\r\n// : (errorMessage?: string) => (context: IFieldValidationContext) => Promise {\r\n// const format = dateFormat ?? FORMAT_DATE;\r\n// return (errorMessage?: string) => {\r\n// const errorMsg = errorMessage ?? `Date invalid format ${format.toLowerCase()}.`;\r\n// return async ({ value }: IFieldValidationContext) => !value ||\r\n// value instanceof Date ||\r\n// (value.length === format.length && moment(value, format).isValid()) ||\r\n// errorMsg;\r\n// };\r\n// }\r\n\r\n// export function getTimeFormatRule (\r\n// timeFormat?: string)\r\n// : (errorMessage?: string) => (context: IFieldValidationContext) => Promise {\r\n// const format = timeFormat ?? FORMAT_TIME;\r\n// return (errorMessage?: string) => {\r\n// const errorMsg = errorMessage ?? `Time invalid format ${format.toLowerCase()}.`;\r\n// return async ({ value }: IFieldValidationContext) => !value ||\r\n// moment(`01/01/1979 ${value.toUpperCase()}`, `MM/DD/YYYY ${format}`).isValid() ||\r\n// errorMsg;\r\n// };\r\n// }\r\n","import { nullable } from '@/utils/nullable';\r\n\r\nexport interface ISettings {\r\n appVersion: string;\r\n adminApiBaseUrl: string;\r\n adminApiSubscriptionKey: string;\r\n clientApiBaseUrl: string;\r\n clientApiSubscriptionKey: string;\r\n msalClientId: string;\r\n msalTenantId: string;\r\n msalAppIdentifier: string;\r\n environmentMode: string;\r\n defaultContractQuota: number | null;\r\n defaultMonthlyQuota: number | null;\r\n defaultDailyQuota: number | null;\r\n}\r\n\r\nexport const Settings: ISettings = {\r\n appVersion: process.env.VUE_APP_VERSION,\r\n adminApiBaseUrl: process.env.VUE_APP_ADMIN_API_BASEURL,\r\n adminApiSubscriptionKey: process.env.VUE_APP_ADMIN_API_SUBSCRIPTION_KEY,\r\n clientApiBaseUrl: process.env.VUE_APP_API_BASEURL,\r\n clientApiSubscriptionKey: process.env.VUE_APP_API_SUBSCRIPTION_KEY,\r\n msalClientId: process.env.VUE_APP_MSAL_CLIENT_ID,\r\n msalTenantId: process.env.VUE_APP_MSAL_TENANT_ID,\r\n msalAppIdentifier: process.env.VUE_APP_MSAL_APP_IDENTIFIER,\r\n environmentMode: process.env.NODE_ENV,\r\n defaultContractQuota: nullable(process.env.VUE_APP_DEFAULT_CONTRACT_QUOTA, (val) => {\r\n const result = Number.parseInt(val);\r\n return isNaN(result) ? null : result;\r\n }) ?? null,\r\n defaultMonthlyQuota: nullable(process.env.VUE_APP_DEFAULT_MONTHLY_QUOTA, (val) => {\r\n const result = Number.parseInt(val);\r\n return isNaN(result) ? null : result;\r\n }) ?? null,\r\n defaultDailyQuota: nullable(process.env.VUE_APP_DEFAULT_DAILY_QUOTA, (val) => {\r\n const result = Number.parseInt(val);\r\n return isNaN(result) ? null : result;\r\n }) ?? null\r\n};\r\n","export enum SubscriptionRoutes {\r\n base = 'subscription',\r\n list = 'subscription-list',\r\n generate = 'subscription-generate',\r\n view = 'subscription-view',\r\n transactions = 'subscription-transactions'\r\n}\r\n","export function isNullOrWhitespace (value: V | null | undefined): boolean {\r\n return value === null || value === undefined || `${value}`.trim() === '';\r\n}\r\n","import { provide, inject, reactive, App, readonly } from 'vue';\r\nimport { IUploadState, IUploadStore, IUploadInformation, TUpload, TAbortUpload, TSetUploads, TCleanupSuccess, UploadState, TSetIsOpen, TSetRoutedNamespace, TReset, TSetStatusDisplay, TUploadCompleteCallback, TSetSubscriptionKey } from '@/store/contracts/apiTest/upload';\r\nimport { impl } from '@/utils/impl';\r\nimport { isNullOrWhitespace } from '@/utils/stringUtils';\r\nimport Axios, { AxiosResponse } from 'axios';\r\nimport { store as validationStore } from '@/store/validation';\r\nimport validationModel from '@/validation/uploadStateValidationModel';\r\n\r\nconst UploadStoreKey = Symbol('UploadStore');\r\nconst Batch = false; // Just hard coding this hear so can include logic to batch if that ever speeds up.\r\n\r\nconst createState = () => reactive(impl({\r\n uploads: {},\r\n isOpen: false,\r\n notify: false,\r\n routedNamespace: 'Transcribe',\r\n uploadId: 0,\r\n subscriptionKey: null\r\n}));\r\n\r\nfunction setUploads (state: IUploadState): TSetUploads {\r\n return (uploads) => {\r\n state.uploads = uploads;\r\n };\r\n}\r\n\r\nfunction setIsOpen (state: IUploadState): TSetIsOpen {\r\n return (isOpen) => {\r\n state.isOpen = isOpen;\r\n if (isOpen) {\r\n setNotify(state)(false);\r\n }\r\n };\r\n}\r\n\r\nfunction setNotify (state: IUploadState): TSetIsOpen {\r\n return (notify) => {\r\n state.notify = notify;\r\n };\r\n}\r\n\r\nfunction setRoutedNamespace (state: IUploadState): TSetRoutedNamespace {\r\n return (routedNamespace) => {\r\n state.routedNamespace = routedNamespace;\r\n };\r\n}\r\n\r\nfunction setSubscriptionKey (state: IUploadState): TSetSubscriptionKey {\r\n return (subscriptionKey) => {\r\n state.subscriptionKey = subscriptionKey;\r\n };\r\n}\r\n\r\nfunction upload (state: IUploadState): TUpload {\r\n return async (namespace: string, url: string, files: File[], uploadComplete: TUploadCompleteCallback) => {\r\n const isValid = await validationStore.doValidation({\r\n model: validationModel,\r\n value: state\r\n });\r\n if (isValid) {\r\n if (Batch) {\r\n sendRequest(state, namespace, url, files, uploadComplete);\r\n } else {\r\n files.forEach(f => sendRequest(state, namespace, url, [f], uploadComplete));\r\n }\r\n }\r\n\r\n return isValid;\r\n };\r\n}\r\n\r\nfunction sendRequest (state: IUploadState, namespace: string, url: string, files: File[], uploadComplete: TUploadCompleteCallback) {\r\n if (isNullOrWhitespace(url)) {\r\n console.error('uploadStore: invalid or no URL specified!!');\r\n return;\r\n }\r\n\r\n const cancelTokenSource = Axios.CancelToken.source();\r\n const cancelToken = cancelTokenSource.token;\r\n\r\n const uploads = [] as IUploadInformation[];\r\n files.forEach(f => uploads.push({\r\n id: state.uploadId++,\r\n fileName: f.name,\r\n xhr: null,\r\n cancelToken: cancelTokenSource,\r\n uploadState: UploadState.loading,\r\n cancelled: false\r\n }));\r\n\r\n const setRequestState = (requestState: UploadState) => {\r\n uploads.forEach(u => {\r\n const stateUpload = state.uploads[namespace].find(su => su.id === u.id);\r\n if (!stateUpload) {\r\n return;\r\n }\r\n stateUpload.uploadState = requestState;\r\n });\r\n\r\n if (!state.isOpen) {\r\n setNotify(state)(true);\r\n }\r\n };\r\n\r\n const setStatusDisplay = (): TSetStatusDisplay => {\r\n return (upload: IUploadInformation, statusDisplay?: string) => {\r\n const stateUpload = state.uploads[namespace].find(u => u.id === upload.id);\r\n if (!stateUpload) {\r\n return;\r\n }\r\n stateUpload.statusDisplay = statusDisplay;\r\n };\r\n };\r\n\r\n const setAxiosResponse = (response: AxiosResponse) => {\r\n uploads.forEach(u => {\r\n const stateUpload = state.uploads[namespace].find(su => su.id === u.id);\r\n if (!stateUpload) {\r\n return;\r\n }\r\n stateUpload.xhr = response;\r\n });\r\n };\r\n\r\n if (!state.uploads[namespace]) {\r\n setUploads(state)({ ...state.uploads, [namespace]: [] });\r\n }\r\n\r\n state.uploads[namespace].push(...uploads);\r\n\r\n const blob = new Blob(files);\r\n\r\n const contentType = isNullOrWhitespace(blob.type) ? files[0].type : blob.type;\r\n\r\n Axios.post(url, blob, {\r\n withCredentials: true,\r\n cancelToken: cancelToken,\r\n headers: {\r\n 'Content-Type': contentType,\r\n 'X-PL-Subscription-Key': state.subscriptionKey\r\n }\r\n }).then(async (r) => {\r\n setAxiosResponse(r);\r\n await uploadComplete(uploads, setStatusDisplay());\r\n\r\n // If our first upload is cancelled, they all are. Just get out.\r\n const cancelled = uploads[0].cancelled;\r\n if (cancelled) {\r\n return;\r\n }\r\n\r\n if (state.routedNamespace === namespace) {\r\n const myNamespace = state.uploads[namespace];\r\n uploads.forEach(u => myNamespace.splice(state.uploads[namespace].findIndex(su => su.id === u.id), 1));\r\n setNotify(state)(false);\r\n return;\r\n }\r\n setRequestState(UploadState.success);\r\n }).catch((e) => {\r\n setAxiosResponse(e.response);\r\n setRequestState(UploadState.failed);\r\n });\r\n\r\n if (!state.isOpen) {\r\n setNotify(state)(true);\r\n }\r\n}\r\n\r\nfunction abortUpload (state: IUploadState): TAbortUpload {\r\n return (namespace: string, upload: IUploadInformation) => {\r\n const myNamespace = state.uploads[namespace];\r\n\r\n const index = myNamespace.findIndex(u => u.id === upload.id);\r\n const namespaceUpload = myNamespace[index];\r\n namespaceUpload.cancelToken.cancel();\r\n namespaceUpload.cancelled = true;\r\n myNamespace.splice(index, 1);\r\n };\r\n}\r\n\r\nfunction cleanupSuccess (state: IUploadState): TCleanupSuccess {\r\n return (namespace) => {\r\n const myNamespace = state.uploads[namespace];\r\n if (!myNamespace) {\r\n return;\r\n }\r\n state.uploads[namespace] = myNamespace.filter(u => u.uploadState !== UploadState.success);\r\n };\r\n}\r\n\r\nfunction reset (state: IUploadState): TReset {\r\n return () => {\r\n setUploads(state)({});\r\n setIsOpen(state)(false);\r\n setNotify(state)(false);\r\n setRoutedNamespace(state)('Transcribe');\r\n };\r\n}\r\n\r\nfunction createForState (state: IUploadState): IUploadStore {\r\n return {\r\n state: readonly(state),\r\n upload: upload(state),\r\n abortUpload: abortUpload(state),\r\n setUploads: setUploads(state),\r\n setIsOpen: setIsOpen(state),\r\n setNotify: setNotify(state),\r\n setRoutedNamespace: setRoutedNamespace(state),\r\n setSubscriptionKey: setSubscriptionKey(state),\r\n cleanupSuccess: cleanupSuccess(state),\r\n reset: reset(state),\r\n get noUploads (): boolean {\r\n if (!state || !state.uploads) {\r\n return true;\r\n }\r\n return Object.keys(state.uploads).none(k => state.uploads[k].length > 0);\r\n }\r\n };\r\n}\r\n\r\nexport function provideStore (app?: App): IUploadStore {\r\n const state = createState();\r\n if (app !== undefined) {\r\n app.provide(UploadStoreKey, state);\r\n } else {\r\n provide(UploadStoreKey, state);\r\n }\r\n return createForState(state);\r\n}\r\n\r\nexport function useStore (): IUploadStore {\r\n const state = inject(UploadStoreKey);\r\n if (state === undefined) {\r\n throw new Error('Using UploadStore before providing it!');\r\n }\r\n return createForState(state);\r\n}\r\n","import { RouteLocationNormalized } from 'vue-router';\r\nimport { IIndexable } from '@/utils/indexable';\r\n\r\nexport type ParamTransform = (paramValue: string | undefined | null) => T | undefined | null;\r\n\r\nexport type ParamTransformations = IIndexable>;\r\n\r\nfunction doTransformations (\r\n transforms: ParamTransformations,\r\n query: boolean\r\n): ((route: RouteLocationNormalized) => IIndexable) {\r\n return (route: RouteLocationNormalized) => {\r\n const props: IIndexable = { ...(query ? route.query : route.params) };\r\n Object.keys(transforms).forEach((param) => {\r\n const transform = transforms[param];\r\n props[param] = transform(props[param]);\r\n });\r\n return props;\r\n };\r\n}\r\n\r\nexport function transformRouteParams (transforms: ParamTransformations): ((route: RouteLocationNormalized) => IIndexable) {\r\n return doTransformations(transforms, false);\r\n}\r\n\r\nexport function transformRouteQuery (transforms: ParamTransformations): ((route: RouteLocationNormalized) => IIndexable) {\r\n return doTransformations(transforms, true);\r\n}\r\n\r\n/* Common parameter transformation functions */\r\n\r\nexport const toNumber: ParamTransform = (paramValue: string | undefined | null) => {\r\n if (paramValue !== undefined && paramValue !== null) {\r\n const result = Number(paramValue);\r\n return isNaN(result) ? undefined : result;\r\n } else {\r\n return paramValue;\r\n }\r\n};\r\n\r\nexport const passThrough: ParamTransform = (paramValue: string | undefined | null) => {\r\n if (paramValue !== undefined && paramValue !== null) {\r\n return String(paramValue);\r\n } else {\r\n return paramValue;\r\n }\r\n};\r\n\r\nexport const toBoolean: ParamTransform = (paramValue: string | undefined | null) => {\r\n if (paramValue !== undefined && paramValue !== null) {\r\n return paramValue.trim().toLowerCase() === 'false' ? false : Boolean(paramValue);\r\n } else {\r\n return paramValue;\r\n }\r\n};\r\n","import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';\r\nimport { SubscriptionRoutes } from '@/router/routes/subscriptions';\r\nimport { ImageCategoryRoutes } from '@/router/routes/imageCategories';\r\nimport { passThrough, transformRouteParams } from './paramTransformer';\r\nimport { ApiTestRoutes } from '@/router/routes/apiTest';\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/subscription',\r\n component: () => import(/* webpackChunkName: \"subscriptions\" */ '@/views/Subscriptions.vue'),\r\n children: [\r\n {\r\n path: '',\r\n name: SubscriptionRoutes.base,\r\n redirect: { name: SubscriptionRoutes.list }\r\n },\r\n {\r\n path: 'list',\r\n name: SubscriptionRoutes.list,\r\n component: () => import(/* webpackChunkName: \"subscriptions\" */ '@/views/subscriptions/SubscriptionListPage.vue')\r\n },\r\n {\r\n path: 'view/:subscriptionId',\r\n name: SubscriptionRoutes.view,\r\n component: () => import(/* webpackChunkName: \"subscriptions\" */ '@/views/subscriptions/SubscriptionViewPage.vue'),\r\n props: (route) => {\r\n return {\r\n ...transformRouteParams({\r\n subscriptionId: passThrough\r\n })(route)\r\n };\r\n }\r\n },\r\n {\r\n path: 'generate',\r\n name: SubscriptionRoutes.generate,\r\n component: () => import(/* webpackChunkName: \"subscriptions\" */ '@/views/subscriptions/SubscriptionGeneratePage.vue')\r\n },\r\n {\r\n path: 'transactions/:subscriptionId',\r\n name: SubscriptionRoutes.transactions,\r\n component: () => import(/* webpackChunkName: \"subscriptions\" */ '@/views/subscriptions/SubscriptionTransactionsPage.vue'),\r\n props: (route) => {\r\n return {\r\n ...transformRouteParams({\r\n subscriptionId: passThrough\r\n })(route)\r\n };\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n path: '/image-category',\r\n component: () => import(/* webpackChunkName: \"imageCategories\" */ '@/views/ImageCategories.vue'),\r\n children: [\r\n {\r\n path: '',\r\n name: ImageCategoryRoutes.base,\r\n redirect: { name: ImageCategoryRoutes.list }\r\n },\r\n {\r\n path: 'list',\r\n name: ImageCategoryRoutes.list,\r\n component: () => import(/* webpackChunkName: \"imageCategories\" */ '@/views/imageCategories/ImageCategoryListPage.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/api-test',\r\n component: () => import(/* webpackChunkName: \"apiTest\" */ '@/views/ApiTest.vue'),\r\n children: [\r\n {\r\n path: '',\r\n name: ApiTestRoutes.index,\r\n redirect: { name: ApiTestRoutes.imageAnalysis }\r\n },\r\n {\r\n path: 'image-analysis',\r\n name: ApiTestRoutes.imageAnalysis,\r\n component: () => import(/* webpackChunkName: \"apiTest\" */ '@/views/apiTest/ImageAnalysis.vue')\r\n }\r\n ]\r\n },\r\n {\r\n path: '/',\r\n redirect: { name: SubscriptionRoutes.base }\r\n }\r\n];\r\n\r\nconst router = createRouter({\r\n history: createWebHashHistory(),\r\n routes\r\n});\r\n\r\nexport default router;\r\n","export function nullable (\r\n value: T | null | undefined,\r\n onNotNull: (val: T) => V)\r\n : V | null | undefined {\r\n if (value === null || value === undefined) {\r\n return value as (V | null | undefined);\r\n }\r\n return onNotNull(value);\r\n}\r\n\r\nexport function possiblyUndefined (\r\n value: T | undefined,\r\n onNotUndefined: (val: T) => V)\r\n : V | undefined {\r\n if (value === undefined) {\r\n return value as (V | undefined);\r\n }\r\n return onNotUndefined(value);\r\n}\r\n\r\nexport function possiblyNull (\r\n value: T | null,\r\n onNotNull: (val: T) => V)\r\n : V | null {\r\n if (value === null) {\r\n return value as (V | null);\r\n }\r\n return onNotNull(value);\r\n}\r\n","import { IIndexable } from '@/utils/indexable';\r\nimport { DeepReadonly } from '@vue/reactivity';\r\nimport { AxiosResponse, CancelTokenSource } from 'axios';\r\n\r\nexport enum UploadState {\r\n loading = 'loading',\r\n success = 'success',\r\n failed = 'failed'\r\n}\r\n\r\nexport interface IUploadInformation {\r\n id: number;\r\n fileName: string;\r\n xhr: AxiosResponse | null;\r\n cancelToken: CancelTokenSource;\r\n uploadState: UploadState;\r\n statusDisplay?: string;\r\n cancelled: boolean;\r\n}\r\n\r\nexport interface IUploadState {\r\n uploads: IIndexable;\r\n isOpen: boolean;\r\n notify: boolean;\r\n routedNamespace: string;\r\n uploadId: number;\r\n subscriptionKey: string | null;\r\n}\r\n\r\nexport type TSetStatusDisplay = (upload: IUploadInformation, statusDisplay?: string) => void;\r\nexport type TUploadCompleteCallback = (i: IUploadInformation[], setStatusDisplay: TSetStatusDisplay) => Promise;\r\nexport type TUpload = (namespace: string, url: string, files: File[], uploadComplete: TUploadCompleteCallback) => Promise;\r\nexport type TAbortUpload = (namespace: string, upload: IUploadInformation) => void;\r\nexport type TSetUploads = (uploads: IIndexable) => void;\r\nexport type TSetIsOpen = (isOpen: boolean) => void;\r\nexport type TSetNotify = (notify: boolean) => void;\r\nexport type TSetRoutedNamespace = (routedNamespace: string) => void;\r\nexport type TSetSubscriptionKey = (subscriptionKey: string | null) => void;\r\nexport type TCleanupSuccess = (namespace: string) => void;\r\nexport type TReset = () => void;\r\n\r\nexport interface IUploadStore {\r\n state: DeepReadonly;\r\n upload: TUpload;\r\n abortUpload: TAbortUpload;\r\n setUploads: TSetUploads;\r\n setIsOpen: TSetIsOpen;\r\n setNotify: TSetNotify;\r\n setRoutedNamespace: TSetRoutedNamespace;\r\n setSubscriptionKey: TSetSubscriptionKey;\r\n cleanupSuccess: TCleanupSuccess;\r\n reset: TReset;\r\n readonly noUploads: boolean;\r\n}\r\n","import flatMap from 'array.prototype.flatmap';\r\nimport { impl } from './impl';\r\n\r\nflatMap.shim();\r\n\r\nArray.prototype.distinct = function () {\r\n return this.distinctBy((i) => i);\r\n};\r\n\r\nArray.prototype.distinctBy = function (getter: (value: any) => any) {\r\n const values: Set = new Set();\r\n return this.filter((v) => {\r\n const value = getter(v);\r\n if (!values.has(value)) {\r\n values.add(value);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n });\r\n};\r\n\r\nArray.prototype.none = function (predicate: (item: any) => boolean): boolean {\r\n return !this.some(predicate);\r\n};\r\n\r\nArray.prototype.sortBy = function (\r\n getter: (item: any) => any,\r\n sortFn?: (value1: any, value2: any) => number\r\n) {\r\n const result = [...this];\r\n result.sort((item1, item2) => {\r\n const value1 = getter(item1);\r\n const value2 = getter(item2);\r\n if (sortFn) {\r\n return sortFn(value1, value2);\r\n } else {\r\n // Here, we actually want just double-equals since we are sorting.\r\n // tslint:disable-next-line: triple-equals\r\n // eslint-disable-next-line eqeqeq\r\n return value1 == value2\r\n ? 0\r\n : value1 > value2 ? 1 : -1;\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nArray.prototype.filterNulls = function () {\r\n return this.filter((v) => v !== undefined && v !== null);\r\n};\r\n\r\nArray.prototype.orDefault = function (arr: any[]) {\r\n if (this.length === 0) {\r\n return arr;\r\n } else {\r\n return this;\r\n }\r\n};\r\n\r\nArray.prototype.groupBy = function (getter: (item: any) => string | number) {\r\n return this.reduce((acc, next) => {\r\n const key = getter(next);\r\n acc[key] = [...(acc[key] ?? []), next];\r\n return acc;\r\n }, impl>({}));\r\n};\r\n\r\nArray.prototype.min = function (defaultValue: number) {\r\n return this.reduce((acc, next) => {\r\n if (typeof next !== 'number') {\r\n throw new Error(`${next} is not a number`);\r\n }\r\n\r\n return next < acc ? next : acc;\r\n }, defaultValue);\r\n};\r\n\r\nArray.prototype.max = function (defaultValue: number) {\r\n return this.reduce((acc, next) => {\r\n if (typeof next !== 'number') {\r\n throw new Error(`${next} is not a number`);\r\n }\r\n\r\n return next > acc ? next : acc;\r\n }, defaultValue);\r\n};\r\n","import { isNullOrWhitespace } from './stringUtils';\r\n\r\nString.prototype.capitalize = function () {\r\n if (this.length <= 0) {\r\n return '';\r\n }\r\n return this.charAt(0).toUpperCase() + this.slice(1);\r\n};\r\n\r\nString.prototype.replaceAllInstances = function (searchStr: string | RegExp, replaceWith: string): string {\r\n const parts = this.split(searchStr);\r\n return parts.join(replaceWith);\r\n};\r\n\r\nString.prototype.localeIncludes = function (searchStr: string, options?: Intl.CollatorOptions): boolean {\r\n if (isNullOrWhitespace(searchStr) || isNullOrWhitespace(this?.toString())) {\r\n return false;\r\n }\r\n const thisStr = this;\r\n const opts = options ?? {};\r\n // More performant than using string.localeCompare, since we are potentially doing multiple comparisons.\r\n const collator = new Intl.Collator('en', opts);\r\n return thisStr.split('').filter((_c, idx) =>\r\n collator.compare(thisStr.slice(idx, idx + searchStr.length), searchStr) === 0).length > 0;\r\n};\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./App.vue?vue&type=template&id=515ba14a\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=515ba14a&lang=scss\"\nscript.render = render\n\nexport default script","\r\nimport './styles/quasar.scss';\r\nimport iconSet from 'quasar/icon-set/mdi-v4.js';\r\nimport '@quasar/extras/mdi-v4/mdi-v4.css';\r\nimport Notify from 'quasar/src/plugins/Notify.js';import Loading from 'quasar/src/plugins/Loading.js';import Dialog from 'quasar/src/plugins/Dialog.js';import Mutation from 'quasar/src/directives/Mutation.js';;\r\n\r\n// To be used on app.use(Quasar, { ... })\r\nexport default {\r\n config: {\r\n screen: {\r\n bodyClasses: true\r\n }\r\n },\r\n plugins: {\r\n Notify,\r\n Loading,\r\n Dialog,\r\n Mutation\r\n },\r\n iconSet: iconSet\r\n};\r\n","import Axios, { AxiosInstance } from 'axios';\r\nimport { store as loginStore } from '@/store/login';\r\nimport { Settings } from '@/settings';\r\n\r\nexport interface IAxiosAdminMSALInterceptorOptions {\r\n axios?: AxiosInstance;\r\n}\r\n\r\nexport function registerAdminMsalInterceptor (options?: IAxiosAdminMSALInterceptorOptions): void {\r\n const axios = options?.axios ?? Axios;\r\n\r\n axios.interceptors.request.use(\r\n async (config) => {\r\n const urlstr = config.url ?? config.baseURL;\r\n if (urlstr) {\r\n const url = new URL(urlstr);\r\n const adminUrl = new URL(Settings.adminApiBaseUrl);\r\n if (url.hostname.toLowerCase() === adminUrl.hostname.toLowerCase()) {\r\n const accessToken = await loginStore.getAccessToken();\r\n if (accessToken) {\r\n // This is where the Bearer token is added to the admin requests\r\n config.headers.Authorization = `Bearer ${accessToken}`;\r\n }\r\n }\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n );\r\n}\r\n","import Axios, { AxiosInstance } from 'axios';\r\nimport { Settings } from '@/settings';\r\n\r\nexport interface IAxiosAdminSubscriptionKeyInterceptorOptions {\r\n axios?: AxiosInstance;\r\n}\r\n\r\nexport function registerAdminSubscriptionKeyInterceptor (options?: IAxiosAdminSubscriptionKeyInterceptorOptions): void {\r\n const axios = options?.axios ?? Axios;\r\n\r\n axios.interceptors.request.use(\r\n (config) => {\r\n const urlStr = config.url ?? config.baseURL;\r\n if (urlStr) {\r\n const url = new URL(urlStr);\r\n const adminUrl = new URL(Settings.adminApiBaseUrl);\r\n if (url.hostname.toLowerCase() === adminUrl.hostname.toLowerCase()) {\r\n config.headers['Ocp-Apim-Subscription-Key'] = Settings.adminApiSubscriptionKey;\r\n }\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n );\r\n}\r\n","import Axios, { AxiosInstance } from 'axios';\r\nimport { Settings } from '@/settings';\r\n\r\nexport interface IAxiosClientSubscriptionKeyInterceptorOptions {\r\n axios?: AxiosInstance;\r\n}\r\n\r\nexport function registerClientSubscriptionKeyInterceptor (options?: IAxiosClientSubscriptionKeyInterceptorOptions): void {\r\n const axios = options?.axios ?? Axios;\r\n\r\n axios.interceptors.request.use(\r\n (config) => {\r\n const urlStr = config.url ?? config.baseURL;\r\n if (urlStr) {\r\n const url = new URL(urlStr);\r\n const clientUrl = new URL(Settings.clientApiBaseUrl);\r\n if (url.hostname.toLowerCase() === clientUrl.hostname.toLowerCase()) {\r\n config.headers['Ocp-Apim-Subscription-Key'] = Settings.clientApiSubscriptionKey;\r\n }\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n );\r\n}\r\n","import { createApp } from 'vue';\r\nimport '@/utils/arrayExtensions';\r\nimport '@/utils/stringExtensions';\r\nimport '@/utils/fileListExtensions';\r\nimport App from '@/App.vue';\r\nimport router from '@/router';\r\nimport Quasar from 'quasar/src/vue-plugin.js';;\r\nimport quasarUserOptions from '@/quasar-user-options.js';\r\n\r\nimport { provideStore as provideLeftDrawerStore } from '@/store/leftDrawer';\r\nimport { provideStore as provideLoginStore } from '@/store/login';\r\nimport { provideStore as provideValidationStore } from '@/store/validation';\r\nimport { provideStore as provideUploadStore } from '@/store/apiTest/upload';\r\nimport { registerAdminMsalInterceptor } from '@/store/utils/axiosAdminMsalInterceptor';\r\nimport { registerAdminSubscriptionKeyInterceptor } from '@/store/utils/axiosAdminSubscriptionKeyInterceptor';\r\nimport { registerClientSubscriptionKeyInterceptor } from '@/store/utils/axiosClientSubscriptionKeyInterceptor';\r\nimport VueApexCharts from 'vue3-apexcharts';\r\n\r\nconst app = createApp(App);\r\n\r\napp.use(Quasar, quasarUserOptions);\r\napp.use(router);\r\napp.use(VueApexCharts);\r\n\r\nconst loginStore = provideLoginStore(app);\r\nregisterAdminMsalInterceptor();\r\nregisterAdminSubscriptionKeyInterceptor();\r\nregisterClientSubscriptionKeyInterceptor();\r\n\r\nloginStore.loadStoreState().then(() => {\r\n provideLeftDrawerStore(app);\r\n provideValidationStore(app);\r\n provideUploadStore(app);\r\n\r\n app.mount('#app');\r\n});\r\n","import { IIndexable } from '@/utils/indexable';\r\n\r\nexport interface IFieldValidationContext {\r\n modelName: string;\r\n model: T | null;\r\n value: V;\r\n}\r\n\r\nexport interface IValidationField {\r\n getter: (model: T | null) => V;\r\n rules: Array<(validationContext: IFieldValidationContext) => Promise>;\r\n}\r\n\r\nexport abstract class ValidationModel {\r\n public fields: IIndexable> = {};\r\n\r\n public abstract get modelName(): string;\r\n\r\n public setField (key: string, field: IValidationField): void {\r\n this.fields[key] = field;\r\n }\r\n\r\n public async validateField (key: string, model: T | null): Promise {\r\n const field = this.fields[key];\r\n if (field === undefined) {\r\n return true;\r\n }\r\n const value: V = field.getter(model);\r\n return (await Promise.all(\r\n field.rules\r\n .map((rule) => rule({\r\n modelName: this.modelName,\r\n model,\r\n value\r\n }))\r\n )).filter((result) => result !== true)[0] ?? true;\r\n }\r\n\r\n public async validate (model: T | null): Promise> {\r\n const results: IIndexable = {};\r\n await Promise.all(\r\n Object.keys(this.fields).map(async (key) => {\r\n results[key] = await this.validateField(key, model);\r\n })\r\n );\r\n return results;\r\n }\r\n\r\n public createForUUID (index: string): ValidationModel {\r\n const thisModel = this;\r\n // disabling max class per file since this is anonymous.\r\n // tslint:disable-next-line: max-classes-per-file\r\n return new (class ValueValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n this.fields = thisModel.fields;\r\n }\r\n\r\n public get modelName (): string {\r\n return `${thisModel.modelName}:[${index}]`;\r\n }\r\n })();\r\n }\r\n\r\n public createForIndex (index: number): ValidationModel {\r\n const thisModel = this;\r\n // disabling max class per file since this is anonymous.\r\n // tslint:disable-next-line: max-classes-per-file\r\n return new (class ValueValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n this.fields = thisModel.fields;\r\n }\r\n\r\n public get modelName (): string {\r\n return `${thisModel.modelName}:[${index}]`;\r\n }\r\n })();\r\n }\r\n\r\n public createForParent

(parentModel: ValidationModel

): ValidationModel {\r\n const thisModel = this;\r\n // disabling max class per file since this is anonymous.\r\n // tslint:disable-next-line: max-classes-per-file\r\n return new (class ValueValidationModel extends ValidationModel {\r\n constructor () {\r\n super();\r\n this.fields = thisModel.fields;\r\n }\r\n\r\n public get modelName (): string {\r\n return `${parentModel.modelName}:${thisModel.modelName}`;\r\n }\r\n })();\r\n }\r\n}\r\n\r\nexport function createValidationModel (name: string): ValidationModel {\r\n // disabling max class per file since this is anonymous.\r\n // tslint:disable-next-line:max-classes-per-file\r\n return new (class NamedValidationModel extends ValidationModel {\r\n public get modelName (): string {\r\n return name;\r\n }\r\n })();\r\n}\r\n","export enum ImageCategoryRoutes {\r\n base = 'image-category',\r\n list = 'image-category-list'\r\n}\r\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/vue-cli-plugin-quasar/lib/loader.vue.auto-import-quasar.js?kebab!../node_modules/cache-loader/dist/cjs.js??ref--0-1!../node_modules/@vue/cli-service/node_modules/vue-loader-v16/dist/index.js??ref--0-2!./App.vue?vue&type=style&index=0&id=515ba14a&lang=scss\"","import { Settings } from '@/settings';\r\nimport {\r\n ILoginState,\r\n ILoginStore,\r\n TGetAccessToken,\r\n TIsSignedIn,\r\n TLoadStoreState,\r\n TSignIn,\r\n TSignOut\r\n} from '@/store/contracts/loginStore';\r\nimport { impl } from '@/utils/impl';\r\nimport { AccountInfo, AuthenticationResult, Configuration, EndSessionRequest, PublicClientApplication, RedirectRequest } from '@azure/msal-browser';\r\nimport { reactive, readonly } from '@vue/reactivity';\r\nimport { App, inject, provide } from '@vue/runtime-core';\r\n\r\nconst LoginStoreKey = Symbol('LoginStore');\r\n\r\nconst createState: () => ILoginState = () => {\r\n const msalConfig: Configuration = {\r\n auth: {\r\n clientId: Settings.msalClientId,\r\n authority: `https://login.microsoftonline.us/${Settings.msalTenantId}`\r\n },\r\n cache: {\r\n cacheLocation: 'sessionStorage',\r\n storeAuthStateInCookie: true\r\n }\r\n };\r\n const msal = new PublicClientApplication(msalConfig);\r\n const loginRequest: RedirectRequest = { scopes: [`${Settings.msalAppIdentifier}/user_impersonation`] };\r\n return reactive(impl({\r\n msalConfig,\r\n msal,\r\n loginRequest,\r\n account: null\r\n })) as ILoginState;\r\n};\r\n\r\nfunction setAccount (state: ILoginState): (account: AccountInfo | null) => void {\r\n return (account) => {\r\n state.account = account;\r\n };\r\n}\r\n\r\nconst getAccount: (msal: PublicClientApplication) => AccountInfo | null = (msal) => {\r\n const currentAccounts = msal.getAllAccounts();\r\n if (currentAccounts === null || currentAccounts.length === 0) {\r\n return null;\r\n }\r\n\r\n return currentAccounts[0];\r\n};\r\n\r\nfunction handleAuthResponse (state: ILoginState): (response: AuthenticationResult | null) => void {\r\n return (response) => {\r\n setAccount(state)(response?.account ?? getAccount(state.msal));\r\n };\r\n}\r\n\r\nfunction loadStoreState (state: ILoginState): TLoadStoreState {\r\n return async () => {\r\n const authResult = await state.msal.handleRedirectPromise();\r\n handleAuthResponse(state)(authResult);\r\n if (!isSignedIn(state)()) {\r\n await signIn(state)();\r\n }\r\n };\r\n}\r\n\r\nfunction signIn (state: ILoginState): TSignIn {\r\n return async () => {\r\n await state.msal.loginRedirect(state.loginRequest);\r\n };\r\n}\r\n\r\nfunction signOut (state: ILoginState): TSignOut {\r\n return async () => {\r\n const account = state.account ?? undefined;\r\n const logoutReq: EndSessionRequest = {\r\n account\r\n };\r\n await state.msal.logoutRedirect(logoutReq);\r\n };\r\n}\r\n\r\nfunction isSignedIn (state: ILoginState): TIsSignedIn {\r\n return () => {\r\n return state.account !== null;\r\n };\r\n}\r\n\r\nfunction getAccessToken (state: ILoginState): TGetAccessToken {\r\n return async () => {\r\n const account = state.account;\r\n if (account === null) {\r\n return null;\r\n }\r\n\r\n const response = await state.msal.acquireTokenSilent({\r\n ...state.loginRequest,\r\n account: account\r\n });\r\n\r\n return response.accessToken;\r\n };\r\n}\r\n\r\nconst storeState = createState();\r\n\r\nconst createForState = (state: ILoginState) => impl({\r\n state: readonly(state),\r\n loadStoreState: loadStoreState(state),\r\n signIn: signIn(state),\r\n signOut: signOut(state),\r\n isSignedIn: isSignedIn(state),\r\n getAccessToken: getAccessToken(state)\r\n});\r\n\r\n/**\r\n * Store implementation that can be accessed outside of a component.\r\n */\r\nexport const store: ILoginStore = createForState(storeState);\r\n\r\nexport function provideStore (app?: App): ILoginStore {\r\n if (app !== undefined) {\r\n app.provide(LoginStoreKey, storeState);\r\n } else {\r\n provide(LoginStoreKey, storeState);\r\n }\r\n\r\n return store;\r\n}\r\n\r\nexport function useStore (): ILoginStore {\r\n const state = inject(LoginStoreKey);\r\n if (state === undefined) {\r\n return store;\r\n }\r\n return createForState(state);\r\n}\r\n"],"sourceRoot":""}