@kosdev-code/kos-dispense-sdk 2.1.33 → 2.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{dispense-registration-manager-CcFUS_KM.js → dispense-registration-manager-Cl2UbU1m.js} +161 -158
- package/{dispense-registration-manager-CcFUS_KM.js.map → dispense-registration-manager-Cl2UbU1m.js.map} +1 -1
- package/dispense-registration-manager-DK1ePXkY.cjs +2 -0
- package/{dispense-registration-manager-BkJ1ggtS.cjs.map → dispense-registration-manager-DK1ePXkY.cjs.map} +1 -1
- package/extension-utils-CAqmOmVh.cjs +2 -0
- package/extension-utils-CAqmOmVh.cjs.map +1 -0
- package/{extension-utils-DeLiIgFH.js → extension-utils-CECRZtAt.js} +149 -66
- package/extension-utils-CECRZtAt.js.map +1 -0
- package/index.cjs +1 -1
- package/index.js +3 -3
- package/models/models/nozzle/nozzle-model.d.ts +2 -2
- package/models/models/nozzle/nozzle-model.d.ts.map +1 -1
- package/models/utils/extension-utils.d.ts +90 -18
- package/models/utils/extension-utils.d.ts.map +1 -1
- package/models/utils/service.d.ts +8 -8
- package/models/utils/services/dispense/1.6.5/service.d.ts +8 -8
- package/models/utils/services/dispense/1.8.1/service.d.ts +8 -8
- package/models/utils/services/dispense/daily/service.d.ts +8 -8
- package/models.cjs +1 -1
- package/models.js +2 -2
- package/package.json +2 -2
- package/pump-provider-C-6CuGgY.cjs +2 -0
- package/pump-provider-C-6CuGgY.cjs.map +1 -0
- package/{pump-provider-BTnIydH2.js → pump-provider-DoK4li3d.js} +247 -241
- package/pump-provider-DoK4li3d.js.map +1 -0
- package/ui/hooks/cui-kit/use-beverages.d.ts +1 -1
- package/ui/hooks/cui-kit/use-beverages.d.ts.map +1 -1
- package/ui/hooks/cui-kit/use-brands.d.ts +1 -1
- package/ui/hooks/cui-kit/use-brands.d.ts.map +1 -1
- package/ui/hooks/cui-kit/use-cui-kit.d.ts +1 -1
- package/ui/hooks/cui-kit/use-cui-kit.d.ts.map +1 -1
- package/ui/hooks/cui-kit/use-flavors.d.ts +1 -1
- package/ui/hooks/cui-kit/use-flavors.d.ts.map +1 -1
- package/ui.cjs +1 -1
- package/ui.js +2 -2
- package/dispense-registration-manager-BkJ1ggtS.cjs +0 -2
- package/extension-utils-DUV7OQR1.cjs +0 -2
- package/extension-utils-DUV7OQR1.cjs.map +0 -1
- package/extension-utils-DeLiIgFH.js.map +0 -1
- package/pump-provider-BTnIydH2.js.map +0 -1
- package/pump-provider-BUfMtaXv.cjs +0 -2
- package/pump-provider-BUfMtaXv.cjs.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var st=Object.defineProperty;var nt=(e,t,r)=>t in e?st(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var d=(e,t,r)=>(nt(e,typeof t!="symbol"?t+"":t,r),r);const i=require("@kosdev-code/kos-ui-sdk");require("react");var h=(e=>(e.IngredientLoader="kos.ingredient.loader",e.IngredientMapper="kos.ingredient.mapper",e.IngredientIndex="kos.ingredient.index",e.IngredientTypeMapper="kos.ingredient.type.mapper",e.HolderTypeMapper="kos.holder.type.mapper",e.HolderMapper="kos.holder.mapper",e.HolderIndex="kos.holder.index",e.HolderIngredientMapper="kos.holder.ingredient.mapper",e.AvailabilityMapper="kos.availability.mapper",e.AvailabilityLoader="kos.availability.loader",e.SelectedPourableMapper="kos.selected.pourable.mapper",e.AssemblyMapper="kos.assembly.mapper",e.BoardMapper="kos.board.mapper",e.BoardIndex="kos.board.index",e.PumpIndex="kos.pump.index",e.AssemblyFeatureFlags="kos.assembly.feature.flags",e))(h||{}),E=(e=>(e.Nozzle="nozzle-model",e.Availability="availability-model",e.Holder="holder-model",e.HolderContainer="holder-container-model",e.IngredientContainer="ingredient-container-model",e.Ingredient="ingredient-model",e.Pump="pump-model",e.PumpContainer="pump-container-model",e))(E||{}),at=Object.getOwnPropertyDescriptor,ot=(e,t,r,s)=>{for(var n=s>1?void 0:s?at(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=o(n)||n);return n};const w="ingredient-model";let te=class{constructor(e,{name:t,type:r,data:s,ingredientId:n,...a}){d(this,"id");d(this,"ingredientId");d(this,"name");d(this,"type");d(this,"data");this.id=e,this.ingredientId=n,this.name=t,this.type=r,this.data=s,Object.assign(this,a)}updateModel({name:e,type:t,data:r,ingredientId:s,...n}){this.name=e,this.type=t,this.ingredientId=s,this.data=r,Object.assign(this,n)}};te=ot([i.kosModel(w)],te);const ne={registration:{[w]:{class:te,singleton:!1}},type:w,predicate:i.isKosModel(w),factory:i.Kos.Factory.create(w)},{URL:Ce}=i.resolveServiceUrl("INGREDIENT_SERVICE"),{getOne:dt}=i.ServiceFactory.build({basePath:`${Ce}/api/ext/dispense/ingredients`}),Re=async()=>await dt({urlOverride:`${Ce}/api/ext/dispense/ingredients`});var lt=Object.defineProperty,ct=Object.getOwnPropertyDescriptor,we=(e,t,r,s)=>{for(var n=s>1?void 0:s?ct(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&<(t,r,n),n};const S="ingredient-container-model",pt=i.KosLog.createLogger({name:"ingredient-container-model"});let G=class{constructor(e,t){d(this,"id");d(this,"ingredients");this.id=e,this.ingredients=new i.KosModelContainer({indexMap:{ingredientType:"type"},extensionId:h.IngredientIndex,parentId:e})}updateModel(){}getIngredientsByType(e){return this.ingredients.getIndexByKey("ingredientType",e)}async load(e){var n;pt.debug(`loading ingredient container ${this.id}`);const t=await Re();if((t==null?void 0:t.status)!==200)throw new Error("Failed to load ingredients");const r=await i.KosExtensionUtils.executeLoaderExtension({context:e,extension:h.IngredientLoader}),s=(t==null?void 0:t.data)??{};for(const a of Object.keys(s))for(const o of((n=t==null?void 0:t.data)==null?void 0:n[a])||[]){const c=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.IngredientMapper,data:o,contextData:r}),p=await i.KosExtensionUtils.executePropertyMapperExtension({extension:h.IngredientTypeMapper,data:o,contextData:r}),g={...o,type:p||o.type,...c,data:c},P=ne.factory(o.id)(g);this.ingredients.addModel(P)}}};we([i.kosChild],G.prototype,"ingredients",2);G=we([i.kosModel(S)],G);const ae={registration:{[S]:{class:G,singleton:!0}},type:S,predicate:i.isKosModel(S),factory:i.Kos.Singleton.create(S)},{URL:X}=i.resolveServiceUrl("HOLDER_SERVICE"),{getAll:gt,postModel:Se,deleteModel:ht}=i.ServiceFactory.build({basePath:`${X}/api/kos/holders`}),ut=i.KosLog.createLogger({name:"holder-service",group:"Services"}),Pt=async()=>await gt({}),Ae=async(e,t)=>{if(!e||!t)throw new Error("Missing holderPath or ingredientId");return await Se({model:{holderPath:e,ingredientId:t},urlOverride:`${X}/api/ext/dispense/assignments`})},Te=async e=>{if(!e)throw new Error("Missing holderPath");return await ht({id:e,urlOverride:`${X}/api/ext/dispense/assignments/${e}`})},Ne=async e=>{if(!e)throw new Error("Missing holderPath");return ut.debug(`sending POST request to /api/ext/dispense/pumpEvents/replaceLine/${e}`),await Se({model:{},urlOverride:`${X}/api/ext/dispense/pumpEvents/replaceLine/${e}`})},{URL:k}=i.resolveServiceUrl("ASSIGNMENT_SERVICE"),{getAll:yt,postModel:De,deleteModel:It}=i.ServiceFactory.build({destinationAddress:"",basePath:`${k}/api/ext/dispense/assignments`}),F=window.kosUseFos,mt=async()=>await yt({fos:F}),Le=async(e,t)=>{var n,a,o,c;const r=JSON.stringify(t),s=`${k}/api/ext/dispense/assignments`;try{const p=await De({model:{holderPath:e,factoryJson:r},urlOverride:s});return(p==null?void 0:p.status)===200&&((n=p==null?void 0:p.data)!=null&&n.error)?[p.data.error||"unknownError",p.data]:[void 0,p==null?void 0:p.data]}catch(p){if(p instanceof i.FetchError)return[((o=(a=p.payload)==null?void 0:a.data)==null?void 0:o.error)||"unknownError",(c=p.payload)==null?void 0:c.data]}return["unknownError",void 0]},vt=async e=>{const t=F?`${k}/api/ingredients/assignments/${e.holderPath}`:`${k}/api/ext/dispense/assignments`;return await De({model:{...e,fuelGauge:680},fos:F,urlOverride:t})},ft=async e=>await It({id:e,fos:F});var Et=Object.defineProperty,bt=Object.getOwnPropertyDescriptor,oe=(e,t,r,s)=>{for(var n=s>1?void 0:s?bt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&Et(t,r,n),n};const A=E.Holder,be=i.KosLog.createLogger({name:"holder-model"});i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("holder",async e=>{const t=[];return t.push(...e.data.holderPaths),t});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("pump",async e=>{if(e.data.pumpPath){const{model:t}=i.getKosModelSync(e.data.pumpPath);if(t){const r=t.ingredientId?i.getKosModelSync(t.ingredientId).model:void 0;return{ingredientId:t.ingredientId,ingredientName:(r==null?void 0:r.displayName)??((r==null?void 0:r.name)||""),childPumpName:t.name}}}return{}});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("holder",async e=>e.data.holderNames.length>0?{holderName:e.data.holderNames[0]||""}:{});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("container",async e=>{if(e.data.ingredients.length>0){const t=e.data.ingredients[0],{model:r}=i.getKosModelSync(t);return{ingredientName:(r==null?void 0:r.displayName)??((r==null?void 0:r.name)||""),ingredients:e.data.ingredients?e.data.ingredients:[],unknonwnIngredientId:e.data.unknonwnIngredientId??""}}return{}});class Mt extends Error{constructor(r,s){super(s);d(this,"type");this.name="AssignmentError",this.type=r}}let B=class{constructor(e,{path:t,name:r,ingredientSource:s,ingredientId:n,ingredientType:a,slice:o,group:c,data:p,enjoyByDate:g},P){d(this,"id");d(this,"path");d(this,"name");d(this,"ingredientId");d(this,"ingredientType");d(this,"ingredientSource");d(this,"group");d(this,"slice");d(this,"logger");d(this,"data");d(this,"enjoyByDate");d(this,"pumps");d(this,"ingredientContainer");this.id=e,this.path=t,this.name=r,this.ingredientType=a,this.ingredientSource=s,this.ingredientId=n,this.group=c,this.slice=o,this.enjoyByDate=g,this.data=p,this.pumps=new i.KosModelContainer({parentId:e,sortKey:"path"}),this.logger=P.logger}updateModel({path:e,name:t,ingredientSource:r,ingredientId:s,ingredientType:n,group:a,slice:o,enjoyByDate:c,data:p}){this.path=e,this.name=t,this.ingredientId=s,this.ingredientType=n,this.ingredientSource=r,this.enjoyByDate=c,this.slice=o,this.group=a,this.data=p}get hasEnjoyByDate(){return!!this.enjoyByDate&&!this.unassigned}get hasEnjoyByWarning(){var e;return((e=this.troublesByType.EnjoyByTrouble)==null?void 0:e.length)>0}get nozzlePaths(){return this.pumps.data.map(e=>e.nozzlePath)}async cancelPour(){await Promise.all(this.pumps.data.filter(e=>e.isPouring).map(e=>e.cancelPour()))}get canPour(){return!this.shouldDefer&&this.pumps.data.every(e=>e.canPour)}get isPouring(){const e=this.pumps.data.some(t=>t.isPouring);return this.logger.debug(`isPouring: ${!!e}`),e}async performIntent(e){const t=typeof e=="string"?e:e.intent,r=typeof e=="string"?void 0:e.pumpPath,s=r?this.pumps.getModel(r):this.pumps.data[0];return s==null?void 0:s.performIntent({intent:t})}get pourState(){return this.pumps.data.reduce((t,r)=>r.pouringState?r.pouringState:t,"")}get nozzlePath(){var e;return(e=this.pumps.data[0])==null?void 0:e.nozzlePath}get pumpPaths(){return this.pumps.data.map(e=>e.id)}get sortedPumps(){return this.pumps.data.sort((e,t)=>e.virtual&&!t.virtual?-1:!e.virtual&&t.virtual?1:e.name.localeCompare(t.name))}get ingredient(){var t;return this.ingredientId?(t=this.ingredientContainer)==null?void 0:t.ingredients.getModel(this.ingredientId):void 0}get ingredientName(){return this.ingredient?this.ingredient.displayName??this.ingredient.name:this.ingredientId?"unknown":""}get previousIngredient(){var t;return this.prevIngredientId?(t=this.ingredientContainer)==null?void 0:t.ingredients.getModel(this.prevIngredientId):void 0}get previousIngredientName(){return this.previousIngredient?this.previousIngredient.displayName??this.previousIngredient.name:this.prevIngredientId?"unknown":""}get prevIngredientId(){var e,t;return(t=(e=this.pumps.data)==null?void 0:e[0])==null?void 0:t.prevIngredientId}get unassigned(){return(!this.ingredientId||this.ingredientId==="0")&&(!this.prevIngredientId||this.prevIngredientId==="0")}get removed(){return(!this.ingredientId||this.ingredientId==="0")&&this.prevIngredientId!==void 0&&this.prevIngredientId!=="0"}get maxVolume(){return this.slice.maxVolMl??0}get remainingVolume(){return this.slice.currentVolMl??0}get hasMaxVolume(){return this.slice.maxVolMl!==void 0}get hasRemainingVolume(){return this.slice.currentVolMl!==void 0}get fillPercent(){return this.remainingVolume<=0?0:Math.floor((this.remainingVolume||1)/(this.maxVolume||1)*100)}get hasFuelGuage(){return this.hasMaxVolume&&this.hasRemainingVolume}updateIngredient(e){this.ingredientId!==e&&i.kosAction(()=>{this.ingredientId=e})}async resolveIntentVolume(e){const t=this.pumps.data[0];return t?t.resolveIntentVolume(e):{volume:-1}}async overrideRfidCode(e){if(!e)throw new Error("Invalid override");try{const[t,r]=await Le(this.path,e);if(t)throw new Mt(t,`Failed to perform rfid override on holder ${this.id}`);return i.kosAction(()=>{this.ingredientId=r==null?void 0:r.ingredientId}),r}catch(t){throw be.error(`Failed to perform rfid override on holder ${this.id}`,t),t}}async assignIngredient(e){try{e?await Ae(this.path,e):await Te(this.path),i.kosAction(()=>{this.ingredientId=e})}catch(t){throw be.error(`Failed to perform assign ingredient to holder ${this.id}`,t),t}}get shouldDefer(){return this.troubles.some(e=>e.shouldDefer)}async replaceLine(){await Ne(this.path)}};oe([i.kosChild],B.prototype,"pumps",2);oe([i.kosDependency({modelType:ae.type})],B.prototype,"ingredientContainer",2);B=oe([i.kosModel(A),i.kosTroubleAware()],B);const de={registration:{[A]:{class:B,singleton:!1}},type:A,predicate:i.isKosModel(A),factory:i.Kos.Factory.create(A)},_t=async(e,t)=>{var Ee;const r=i.ExtensionManager.propertyMapper.executeMapper(h.HolderIngredientMapper,t),s=i.ExtensionManager.propertyMapper.executeMapper(h.HolderTypeMapper,t)||t.ingType,n=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.HolderMapper,data:t,contextData:{}}),{name:a,path:o,ingredientId:c,ingType:p,ingSource:g,slice:P,...R}=t,u={...R,...n},v=P||{pos:0},b={name:a,path:o,ingredientId:r||c,ingredientType:s||p,ingredientSource:g,enjoyByDate:(Ee=t.container)!=null&&Ee.enjoyByDate?new Date(t.container.enjoyByDate):void 0,slice:v,group:e,data:u};return de.factory(t.path)(b)},{URL:Ot}=i.resolveServiceUrl("ASSEMBLY_SERVICE"),{getOne:Ct}=i.ServiceFactory.build({basePath:`${Ot}/api/kos/device/assemblies`}),Rt=i.KosLog.createLogger({name:"assembly-service",group:"Services"}),le=async()=>(Rt.debug("sending GET for assembly"),await Ct({}));var wt=Object.defineProperty,St=Object.getOwnPropertyDescriptor,Z=(e,t,r,s)=>{for(var n=s>1?void 0:s?St(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&wt(t,r,n),n};const T="board-container-model",ce="/kos/hardware/board/linked",pe="/kos/hardware/board/unlinked";exports.BoardContainerModel=class{constructor(t,r,s){d(this,"id");d(this,"logger");d(this,"models");this.id=t,this.logger=s.logger,this.models=new i.KosModelContainer({parentId:t,extensionId:h.BoardIndex})}get boardList(){return this.models.data}updateModel(){}addModel(t){this.models.addModel(t)}removeModel(t){this.models.removeModel(t)}updateBoard(t){const r=t.path,s=this.models.getModel(r);if(!s){this.logger.warn(`board ${r} not found`);return}s.updateModel(t)}handleBoardLinkEvent(t){this.logger.debug(`handling ${ce} event ${t}`),t?this.updateBoard(t):this.logger.debug("- boardLinkEvent is undefined")}handleBoardUnlinkEvent(t){this.logger.debug(`handling ${pe} event ${t}`),t?this.updateBoard(t):this.logger.debug("- boardLinkEvent is undefined")}};Z([i.kosChild],exports.BoardContainerModel.prototype,"models",2);Z([i.kosTopicHandler({lifecycle:i.DependencyLifecycle.INIT,topic:ce,websocket:!0})],exports.BoardContainerModel.prototype,"handleBoardLinkEvent",1);Z([i.kosTopicHandler({lifecycle:i.DependencyLifecycle.INIT,topic:pe,websocket:!0})],exports.BoardContainerModel.prototype,"handleBoardUnlinkEvent",1);exports.BoardContainerModel=Z([i.kosModel(T)],exports.BoardContainerModel);const At=async e=>{const t=e.data.boardPath,{model:r}=i.getKosModelSync(t);return{boardName:(r==null?void 0:r.name)||""}};var Tt=Object.defineProperty,Nt=Object.getOwnPropertyDescriptor,$e=(e,t,r,s)=>{for(var n=s>1?void 0:s?Nt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&Tt(t,r,n),n};const N=E.PumpContainer;var ge=(e=>(e.byBoard="byBoard",e.byType="byType",e.byNozzle="byNozzle",e))(ge||{});let j=class{constructor(e,t){d(this,"id");d(this,"pumps");this.id=e,this.pumps=new i.KosModelContainer({indexMap:{byNozzle:r=>r.nozzlePaths,byBoard:r=>r.boardPath,byType:"type"},parentId:e,extensionId:h.PumpIndex})}get pumpModels(){return this.pumps.data}get pumpPaths(){return this.pumpModels.map(e=>e.path)}addModel(e){this.pumps.addModel(e)}removeModel(e){this.pumps.removeModel(e)}getModel(e){return this.pumps.getModel(e)}get models(){return this.pumps}get data(){return this.pumps.data}updateModel(){}async load(){}};$e([i.kosChild],j.prototype,"pumps",2);j=$e([i.kosModel(N)],j);const q={registration:{[N]:{class:j,singleton:!0}},type:N,predicate:i.isKosModel(N),factory:i.Kos.Singleton.create(N)},Ue=async e=>{const t=[],{model:r}=await i.getKosModel(e);return r&&(t.push(r.boardPath),t.push(r.nozzlePath),t.push(r.holderPath)),t},Dt=async e=>{const t=[],r=e.data.pumpPath;t.push(r);const s=await Ue(r);return[...t,...s]},Lt=async e=>{const t=[],r=e.data.boardPath;t.push(e.data.boardPath);const s=await i.getKosModel(q.type);if(s!=null&&s.model){const a=s.model.models.getIndexByKey(ge.byBoard,r).map(c=>Ue(c.path));(await Promise.allSettled(a)).forEach(c=>{c.status==="fulfilled"&&c.value.forEach(p=>t.push(p))})}return Array.from(new Set(t))};var $t=Object.getOwnPropertyDescriptor,Ut=(e,t,r,s)=>{for(var n=s>1?void 0:s?$t(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=o(n)||n);return n};const D="board-model",Me=(e,t)=>{const{type:r,name:s,path:n,linked:a,instanceId:o,link:c,...p}=e;t.type=r,t.name=s,t.path=n,t.linked=a,t.link=Object.freeze(c),t.instanceId=o,Object.assign(t,p)};i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("board",Lt);i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("board",At);let re=class{constructor(e,t,r){d(this,"id");d(this,"type");d(this,"name");d(this,"path");d(this,"linked");d(this,"instanceId");d(this,"logger");this.id=e,this.logger=r.logger,Me(t,this)}updateModel(e){Me(e,this)}async init(){this.logger.debug(`initializing board ${this.id}`)}async load(){this.logger.debug(`loading board ${this.id}`)}};re=Ut([i.kosModel(D)],re);const he={registration:{[D]:{class:re,singleton:!1}},type:D,predicate:i.isKosModel(D),factory:i.Kos.Factory.create(D)},ue={registration:{[T]:{class:exports.BoardContainerModel,singleton:!0},...he.registration},type:T,predicate:i.isKosModel(T),factory:i.Kos.Singleton.create(T)};var xt=Object.defineProperty,zt=Object.getOwnPropertyDescriptor,J=(e,t,r,s)=>{for(var n=s>1?void 0:s?zt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&xt(t,r,n),n};const L=E.HolderContainer,Bt="/kos/insertion/insert/start",Kt="/kos/insertion/insert/complete",Gt="/kos/insertion/insert/update",kt="/kos/insertion/remove",Ft="/kos/pumpEvent/replaceLine",jt="/kos/handle/*";let O=class{constructor(e,t,r){d(this,"id");d(this,"holders");d(this,"logger");this.id=e,this.holders=new i.KosModelContainer({indexMap:{nozzle:s=>s.nozzlePaths,group:"group"},parentId:e,extensionId:h.HolderIndex}),this.logger=r.logger}updateModel(){}handleHolderEvents(e){var r,s,n;i.KosLog.ifDebug(()=>this.logger.debug("Received holder change event",JSON.stringify(e)));const t=this.holders.getModel(e.path);t&&(this.logger.info(`Received change event for holder ${t.path}. Updating fuel gauge data.`),t.slice.currentVolMl=(r=e.slice)==null?void 0:r.currentVolMl,t.slice.maxVolMl=(s=e.slice)==null?void 0:s.maxVolMl,(n=e==null?void 0:e.container)!=null&&n.enjoyByDate?t.enjoyByDate=new Date(e.container.enjoyByDate):t.enjoyByDate=void 0)}handleInsertion(e){i.KosLog.ifDebug(()=>this.logger.debug("Received insertion event",JSON.stringify(e))),(Array.isArray(e)?e:[e]).forEach(r=>{i.kosAction(()=>{var a,o,c;const s=r.ingredientId,n=this.holders.getModel(r.path);n&&(this.logger.info(`Received insertion event for holder ${n.path}`),n.updateIngredient(s),n.slice.currentVolMl=(a=r.slice)==null?void 0:a.currentVolMl,n.slice.maxVolMl=(o=r.slice)==null?void 0:o.maxVolMl,(c=r==null?void 0:r.container)!=null&&c.enjoyByDate?n.enjoyByDate=new Date(r.container.enjoyByDate):n.enjoyByDate=void 0,r.pumps.forEach(p=>{i.kosAction(()=>{const g=n.pumps.getModel(p.path);g&&(g.ingredientId=p.ingredientId,g.inserted=p.inserted,g.prevIngredientId=p.prevIngredientId)})}))})})}};J([i.kosChild],O.prototype,"holders",2);J([i.kosTopicHandler({topic:jt,websocket:!0,condition:(e,t)=>t.holders.getModel(e.path)!==void 0})],O.prototype,"handleHolderEvents",1);J([i.kosTopicHandler({topic:[Bt,Kt,Gt,kt,Ft],websocket:!0})],O.prototype,"handleInsertion",1);O=J([i.kosModel(L)],O);const Pe={registration:{[L]:{class:O,singleton:!0}},type:L,predicate:i.isKosModel(L),factory:i.Kos.Singleton.create(L)},Ht=i.KosLog.createLogger({name:"board-utils"}),Vt=async e=>{const t=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.BoardMapper,data:e,contextData:{}}),{type:r,name:s,path:n,linked:a,instanceId:o,...c}=e,p={...c,...t},g={type:r,name:s,path:n,linked:a,instanceId:o,...p},P=he.factory(e.path)(g);return P.updateModel(g),P},Yt=e=>async t=>{Ht.debug(`adding board ${t.name}`);const r=await Vt(t);e.addModel(r)};var l=(e=>(e.IDLE="IDLE",e.POURING="POURING",e.POUR_STARTING="POUR_STARTING",e.POUR_CANCELING="POUR_CANCELING",e))(l||{});const{URL:ye}=i.resolveServiceUrl("PUMP_SERVICE"),{postModel:Xt,getOne:Zt}=i.ServiceFactory.build({basePath:`${ye}/api/kos/holders`});i.KosLog.createLogger({name:"pump-service",group:"Services"});const xe=async({intent:e,pumpId:t,tracker:r})=>{const s=`${ye}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/pour/${t}/${e}`,n=await Xt({model:{},urlOverride:s,tracker:r});return n!=null&&n.data&&i.FutureManager.initiateFuture(n.data),n},ze=async(e,t)=>{const r=`${ye}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/intent/${e}/${t}/volume`,s=await Zt({urlOverride:r});return s!=null&&s.data?s.data:{volume:-1}};var qt=Object.defineProperty,Jt=Object.getOwnPropertyDescriptor,Be=(e,t,r,s)=>{for(var n=s>1?void 0:s?Jt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&qt(t,r,n),n};const $=E.Pump;i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("pump",Dt);let H=class{constructor(e,t){d(this,"id");d(this,"inserted");d(this,"type");d(this,"virtual");d(this,"ingredientId");d(this,"holderPath");d(this,"boardPath");d(this,"nozzlePath");d(this,"childPump");d(this,"name");d(this,"path");d(this,"prevIngredientId");d(this,"state");d(this,"futureHandler");d(this,"currentState",l.IDLE);this.id=e;const{inserted:r,holderPath:s,boardPath:n,nozzlePath:a,name:o,path:c,childPump:p,virtual:g,prevIngredientId:P,state:R,...u}=t;this.inserted=r,this.type=t.type,this.ingredientId=t.ingredientId,this.holderPath=s,this.boardPath=n,this.nozzlePath=a,this.name=o,this.path=c,this.childPump=!!p,this.virtual=!!g,this.prevIngredientId=P,this.state=R,Object.assign(this,u),this.futureHandler=new i.FutureHandler(this)}updateModel(e){const{inserted:t,holderPath:r,boardPath:s,nozzlePath:n,childPump:a,name:o,path:c,...p}=e;this.inserted=t,this.type=e.type,this.ingredientId=e.ingredientId,this.holderPath=r,this.boardPath=s,this.nozzlePath=n,this.childPump=this.childPump?this.childPump:!!a,this.name=o,this.path=c,this.prevIngredientId=e.prevIngredientId,Object.assign(this,p)}get pouringState(){var e;return((e=this.future)==null?void 0:e.endState)||""}get isPouring(){var e;return!!(this.future&&!((e=this.future)!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING}get canPour(){return!!this.ingredientId&&!this.isPouring}onFutureUpdate(e){e.endState&&i.kosAction(()=>{this.currentState=l.IDLE})}async cancelPour(){var e;this.currentState===l.POURING||this.currentState===l.POUR_STARTING?(this.currentState=l.POUR_CANCELING,await((e=this.future)==null?void 0:e.cancelFuture()),i.kosAction(()=>{this.currentState=l.IDLE})):i.KosLog.warn(`Cannot cancel pour in state ${this.currentState}`)}get future(){return this.futureHandler.future}async resolveIntentVolume(e){return await ze(this.path,e)}async performIntent(e,t){const r=typeof e=="string"?e:e.intent;if(!r)throw new Error("No intent provided");try{if(this.currentState===l.IDLE){if(this.currentState=l.POUR_STARTING,!t)throw new Error("No tracker provided");const s=await xe({tracker:t,intent:r,pumpId:this.path});return this.currentState===l.POUR_STARTING&&i.kosAction(()=>{this.currentState=l.POURING}),s==null?void 0:s.data}else throw new Error(`Cannot pour in state ${this.currentState}`)}catch(s){throw i.KosLog.error(s),this.currentState=l.IDLE,s}}};Be([i.kosFuture()],H.prototype,"performIntent",1);H=Be([i.kosModel($)],H);const Ie={registration:{[$]:{class:H,singleton:!1}},type:$,predicate:i.isKosModel($),factory:i.Kos.Factory.create($)},_e=i.KosLog.createLogger({name:"pump-utils"}),Wt=(e,t)=>{const r=(t.pumps??[]).length>1,s={boardPath:t.boardPath,holderPath:t.holderPath,ingredientId:t.ingredientId,childPump:!!t.childPump,virtual:r,inserted:t.inserted,name:t.name,path:t.path,type:t.type,nozzlePath:e,prevIngredientId:t.prevIngredientId,state:t.state},n=Ie.factory(t.path)(s);return n.updateModel(s),n},Ke=e=>t=>r=>s=>{var n;try{_e.debug(`adding pump ${s.name}`);const a=Wt(r.path,s);e.addModel(a);const o=a.holderPath,c=t.holders.getModel(o);c==null||c.pumps.addModel(a),c!=null&&c.nozzlePaths.includes(r.path)||c==null||c.nozzlePaths.push(r.path),(n=s==null?void 0:s.pumps)==null||n.forEach(p=>{const g=a.holderPath,P={...p,childPump:!0,holderPath:g,ingredientId:a.ingredientId};Ke(e)(t)(r)(P)})}catch(a){throw _e.error(`Error mapping assembly pump: ${a}`),a}};var Qt=Object.defineProperty,er=Object.getOwnPropertyDescriptor,K=(e,t,r,s)=>{for(var n=s>1?void 0:s?er(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&Qt(t,r,n),n};const U="assembly-model",Ge="assembly-data",ke="assembly-raw-data";let M=class{constructor(e,t,r){d(this,"id");d(this,"_nozzlePaths",new Set);d(this,"troubleContainer");d(this,"holderContainer");d(this,"boardContainer");d(this,"pumpContainer");d(this,"logger");this.id=e,this.holderContainer=Pe.factory({}),this.boardContainer=ue.factory({}),this.pumpContainer=q.factory({}),this.logger=r.logger}updateModel(e){}get allHolders(){return this.holderContainer.holders.data}get holderGroups(){return this.holderContainer.holders.getIndexKeys("group")}get nozzlePaths(){return Array.from(this._nozzlePaths)}getHoldersByGroup(e){return this.holderContainer.holders.getIndexByKey("group",e)}getHoldersByNozzle(e){return this.holderContainer.holders.getIndexByKey("nozzle",e)}get pumpsByNozzle(){return this.pumpContainer.models.idx.byNozzle}get pumpPaths(){return this.pumpContainer.models.data.map(e=>e.path)}get boards(){return this.boardContainer.boardList}async init(){this.logger.debug(`initializing assembly ${this.id}`)}async ready(){var e;(e=this.troubleContainer)==null||e.troubles.increment(),i.ExtensionManager[i.EXTENSION_FEATURE_FLAG_RESOLVER].execute(h.AssemblyFeatureFlags,this)}async load(e){this.logger.debug(`loading assembly ${this.id}`);const t=await le();if((t==null?void 0:t.status)===200){const r=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.AssemblyMapper,data:t.data,contextData:{}});e.set(Ge,r),Object.assign(this,r),Object.entries(r).forEach(([s,n])=>{i.isKosDataModel(n)&&(this.logger.debug(`adding child model ${s} from extension data`),this[i.ChildModels][s]=!0)}),e.set(ke,t.data);for await(const s of t.data.assemblies){const{boards:n=[],holders:a={},nozzles:o=[],core:c,name:p,path:g,...P}=s;this.logger.debug(`adding assembly ${p}`),this.logger.warn(`Assembly rest keys: ${Object.keys(P).join(", ")}`),Object.keys(P).forEach(u=>{var v;if(this.logger.warn(`Enabling feature flag: ${u}`),i.KosFeatureFlags.enableFeature(u),e.set(`assembly-feature-${u}`,P[u]),((v=P[u].state)==null?void 0:v.path)!==void 0){const b=P[u].state.path;this.logger.warn(`Feature flag ${u} state path: ${b}`),e.set(`assembly-state-path-${u}`,b)}});for await(const u of n)this.logger.debug(`adding board ${u.name}`),await Yt(this.boardContainer)(u);for await(const[u,v]of Object.entries(a??{}))for await(const b of v){this.logger.debug(`adding holder ${b.name}`);const fe=await _t(u,b);this.holderContainer.holders.addModel(fe)}const R=Ke(this.pumpContainer)(this.holderContainer);o.forEach(u=>{this._nozzlePaths.add(u.path);const v=R(u);u.pumps.forEach(v)})}}}};K([i.kosDependency({modelType:"trouble-container-model"})],M.prototype,"troubleContainer",2);K([i.kosChild],M.prototype,"holderContainer",2);K([i.kosChild],M.prototype,"boardContainer",2);K([i.kosChild],M.prototype,"pumpContainer",2);M=K([i.kosModel(U)],M);const me={registration:{[U]:{class:M,singleton:!0}},type:U,predicate:i.isKosModel(U),factory:i.Kos.Singleton.create(U)};var tr=Object.getOwnPropertyDescriptor,rr=(e,t,r,s)=>{for(var n=s>1?void 0:s?tr(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=o(n)||n);return n};const x=E.Availability;let ie=class{constructor(e,t,r){d(this,"id");d(this,"data");d(this,"properties");d(this,"available");d(this,"visible");d(this,"groupId");d(this,"rawId");d(this,"altId");d(this,"type");d(this,"note");d(this,"taggedIds");d(this,"parentId");d(this,"logger");this.id=e,this.taggedIds=t.taggedIds||[],this.logger=r.logger,this.available=t.available,this.visible=t.visible,this.groupId=t.groupId,this.rawId=t.rawId,this.altId=t.altId,this.type=t.type,this.parentId=t.kosParentId,this.data=t.data,this.note=t.note,this.properties=t.properties||{}}updateModel(e){this.taggedIds=e.taggedIds||[],this.available=e.available,this.visible=e.visible,this.groupId=e.groupId,this.rawId=e.rawId,this.altId=e.altId,this.type=e.type,this.data=e.data}updateAvailability(e){this.available=e}};ie=rr([i.kosParentAware(),i.kosModel(x)],ie);const V={registration:{[x]:{class:ie,singleton:!1}},type:x,predicate:i.isKosModel(x),factory:i.Kos.Factory.create(x)},{URL:C}=i.resolveServiceUrl("NOZZLE_SERVICE"),{postModel:ve,deleteModel:ir,getOne:sr}=i.ServiceFactory.build({basePath:`${C}/api/nozzle`}),Fe=async(e,t)=>{const r=await ve({model:{},urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/pour`,ordered:!0,tracker:t});return r!=null&&r.data&&i.FutureManager.initiateFuture(r.data),r},je=async(e,t,r)=>{const s=await ve({model:{},urlOverride:`${C}/api/ext/dispense/nozzle/${t}/pipeline/beverage/fixed/${e}`,ordered:!0,tracker:r});return s!=null&&s.data&&i.FutureManager.initiateFuture(s.data),s},He=async e=>await sr({urlOverride:`${C}${e}/pipeline/beverage/availability`}),Ve=async(e,t)=>await ve({model:t,urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/select`}),Ye=async e=>await ir({id:e,urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/select`});var nr=Object.defineProperty,ar=Object.getOwnPropertyDescriptor,m=(e,t,r,s)=>{for(var n=s>1?void 0:s?ar(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&nr(t,r,n),n};const z=E.Nozzle,or=i.createPropKey("beverageTopicPrefix"),Q=e=>e.onPourStart!==void 0&&e.onPourCancel!==void 0&&e.onPourProgress!==void 0,Oe="/kos/nozzle/pour/started",dr="/kos/nozzle/pour/progress",lr="/kos/nozzle/pour/cancel";let y=class{constructor(e,t){d(this,"id");d(this,"path");d(this,"name");d(this,"_selectedBeverage");d(this,"_selectedBrand");d(this,"_additionalItems");d(this,"_availabilityItems");d(this,"futureHandler");d(this,"beverageTopicPrefix");d(this,"topicPrefix");d(this,"urlPrefix");this.id=e,this.path=t.path,this.name=t.name,this.beverageTopicPrefix=t.beverageTopicPrefix,this.topicPrefix=t.topicPrefix,this.urlPrefix=t.urlPrefix,this._selectedBeverage=void 0,this._selectedBrand=void 0,this._additionalItems=[],this.futureHandler=new i.MultipleFutureHandler(this),this._availabilityItems=new i.KosModelContainer({indexMap:{byGroup:"groupId",byParent:"parentId"},parentId:e})}get beverages(){return this._availabilityItems.getIndexByKey("byGroup","beverages")}get brands(){return this._availabilityItems.getIndexByKey("byGroup","brands")}get visibleBrands(){return this.brands.filter(e=>e.visible)}get visibleBeverages(){return this.beverages.filter(e=>e.visible)}get isPouring(){var e;return!!(this.futureHandler.getFuture()&&!((e=this.futureHandler.getFuture())!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING||this.currentState===l.POUR_CANCELING}get canPour(){return!!this._selectedBeverage&&this._selectedBeverage.available&&this.currentState===l.IDLE}get selectedPourable(){return{beverage:this._selectedBeverage,additional:this._additionalItems}}get future(){return this.futureHandler.getFuture()}get pourProgress(){var e;return((e=this.future)==null?void 0:e.progress)??0}updateModel(){}setSelectedBrand(e){this._selectedBrand=e,this._selectedBeverage=void 0}get selectedBrand(){return this._selectedBrand}async setSelectedPourable({beverage:e,additional:t,context:r}){if(!e){const c=await Ye(this.name);if((c==null?void 0:c.status)!==200)throw new Error("Failed to clear pourable");this._selectedBeverage=void 0;return}if(e===this._selectedBeverage&&i.arraysEqual(this._additionalItems,t)){this.logger.info("No change in selected pourable");return}this._selectedBeverage=e,this._additionalItems=t;let s=await i.ExtensionManager.dataMapper.executeMapper(h.SelectedPourableMapper,{beverage:e,additional:t,context:r});const n={bevId:e.rawId};(!s||Object.keys(s).length===0)&&(this.logger.info(`No selected pourable mapper defined, using the default payload ${n}`),s=n);const a=s??n,o=await Ve(this.name,a);if((o==null?void 0:o.status)!==200)throw new Error("Failed to select pourable")}getGroupAvailabilityItems(e){return this._availabilityItems.getIndexByKey("byGroup",e)}getAvailabilityByParent(e){return this._availabilityItems.getIndexByKey("byParent",e)}handlePouringStart(){this.logger.info("Pour started"),i.getAllKosCompanionModels(this).forEach(e=>{var t;Q(e)&&((t=e.onPourStart)==null||t.call(e))})}handlePouringEnd(){this.logger.info("Pour ended")}handleCancelStart(){this.logger.info("Pour canceling")}handleCanceled(){this.logger.info("Pour canceled"),i.getAllKosCompanionModels(this).forEach(t=>{var r;Q(t)&&((r=t.onPourCancel)==null||r.call(t))});const e={nozzleId:this.id};i.EventBus.publish(lr,e)}onFutureUpdate(e){i.getAllKosCompanionModels(this).forEach(s=>{Q(s)&&s.onPourProgress(e)});const r={nozzleId:this.id,progress:e.progress,status:e.status,clientData:e.clientData,futureId:e.futureId,remainingTimeMs:e.remainingTimeMs,endState:e.endState,reason:e.reason,timeRemaining:e.timeRemaining};i.EventBus.publish(dr,r),e.endState&&i.kosAction(()=>{this.currentState===l.POURING&&this.transition("POUR_COMPLETED")})}async pour(e){var t;try{if(this.transition("START_POUR"),!e)throw new Error("No tracker provided");const r=await Fe(this.name,e);this.transition("POUR_ACTIVE");const s={nozzleId:this.id,type:"free"};return i.EventBus.publish(Oe,s),(t=r==null?void 0:r.data)!=null&&t.endState&&this.transition("POUR_COMPLETED"),r}catch(r){throw this.logger.error(r),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),r}}async fixedPour(e,t){var r;try{if(this.transition("START_POUR"),!t)throw new Error("No tracker provided");const s=await je(e,this.name,t);this.transition("POUR_ACTIVE");const n={nozzleId:this.id,type:"fixed"};return i.EventBus.publish(Oe,n),(r=s==null?void 0:s.data)!=null&&r.endState&&this.transition("POUR_COMPLETED"),s}catch(s){throw this.logger.error(s),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),s}}async cancelPour(){var e;this.transition("CANCEL_POUR"),await((e=this.futureHandler.getFuture())==null?void 0:e.cancelFuture()),this.transition("POUR_CANCELED")}updateGroupMembers(){this._availabilityItems.data.forEach(e=>{(e.taggedIds||[]).forEach(r=>{const s=this._availabilityItems.data.find(n=>n.rawId===r);s&&s.parentId!==e.id&&(s.parentId=e.id,this._availabilityItems.updateModel(s))})})}async load(e){var s,n;this.logger.debug(`loading nozzle ${this.id}`);const t=await He(this.urlPrefix);if((t==null?void 0:t.status)!==200)throw new Error("Failed to load nozzle availability");const r=await i.ExtensionManager.loader.executeLoader(h.AvailabilityLoader,{});e==null||e.set(h.AvailabilityLoader,r),e==null||e.set(W.type,this);for(const a of Object.keys((s=t.data)==null?void 0:s.groups)||[])for(const o of((n=t.data)==null?void 0:n.groups[a])||[]){const c=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...o,groupId:a},r),p={...o,note:o.note??void 0,kosParentId:this.id,rawId:o.id,groupId:a,data:c,properties:o.properties||{}},g=V.factory(`${this.id}-${a}-${o.id}`)(p);this._availabilityItems.addModel(g)}this.updateGroupMembers()}async updateAvailability(e){const t=i.KosContextManager.getContext(this.id),r=(t==null?void 0:t.get(h.AvailabilityLoader))||{};if(e.rebuild)for(const s of Object.keys(e==null?void 0:e.groups)||[]){this._availabilityItems.getIndexByKey("group",s).filter(a=>!e.groups[s].find(o=>`${this.id}-${s}-${o.id}`===a.id)).forEach(a=>{this._availabilityItems.removeModel(a.id),i.destroyKosModel(a)});for(const a of(e==null?void 0:e.groups[s])||[]){const o=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...a,groupId:s},r),c={...a,note:a.note??void 0,kosParentId:this.id,groupId:s,rawId:a.id,data:o,taggedIds:a.taggedIds,properties:a.properties||{}},p=this._availabilityItems.getModel(`${this.id}-${s}-${a.id}`);if(p)p.updateModel(c);else{const g=V.factory(`${this.id}-${s}-${a.id}`)(c);this._availabilityItems.addModel(g)}}}else for(const s of Object.keys(e==null?void 0:e.groups)||[])for(const n of(e==null?void 0:e.groups[s])||[]){const a=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...n,groupId:s},r),o={...n,note:n.note??void 0,kosParentId:this.id,groupId:s,rawId:n.id,data:a,type:n.type,taggedIds:n.taggedIds,properties:n.properties||{}},c=this._availabilityItems.getModel(`${this.id}-${s}-${n.id}`);c&&c.updateModel(o)}this.updateGroupMembers()}};m([i.kosChild],y.prototype,"_availabilityItems",2);m([i.kosStateEntry(l.POURING)],y.prototype,"handlePouringStart",1);m([i.kosStateExit(l.POURING)],y.prototype,"handlePouringEnd",1);m([i.kosStateEntry(l.POUR_CANCELING)],y.prototype,"handleCancelStart",1);m([i.kosStateExit(l.POUR_CANCELING)],y.prototype,"handleCanceled",1);m([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],y.prototype,"pour",1);m([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],y.prototype,"fixedPour",1);m([i.kosStateGuard({allowedStates:[l.POUR_STARTING,l.POURING]})],y.prototype,"cancelPour",1);m([i.kosTopicHandler({topic:`${or}/availability`,websocket:!0})],y.prototype,"updateAvailability",1);y=m([i.kosModel(z),i.kosLoggerAware(),i.kosStateMachine({initial:l.IDLE,initializeAt:i.DependencyLifecycle.READY,states:{[l.IDLE]:{on:{START_POUR:l.POUR_STARTING}},[l.POUR_STARTING]:{on:{POUR_ACTIVE:l.POURING,CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POURING]:{on:{CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POUR_CANCELING]:{on:{POUR_CANCELED:l.IDLE}}}},{trackHistory:!1,throwOnInvalid:!1})],y);const W={registration:{[z]:{class:y,singleton:!1}},type:z,predicate:i.isKosModel(z),factory:i.Kos.Factory.create(z)};var cr=Object.defineProperty,pr=Object.getOwnPropertyDescriptor,Xe=(e,t,r,s)=>{for(var n=s>1?void 0:s?pr(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&cr(t,r,n),n};const Ze="device-assembly-model";let Y=class{constructor(e,t,r){d(this,"id");d(this,"deviceNozzles");d(this,"logger");this.id=e,this.logger=r.logger,this.deviceNozzles=new i.KosModelContainer}async init(){this.logger.debug(`initializing device-assembly ${this.id}`)}getNozzle(e){return this.deviceNozzles.getModel(e)}get nozzlePaths(){return this.deviceNozzles.data.map(e=>e.path)}async load(){this.logger.debug(`loading device-assembly ${this.id}`);const e=await le();(e==null?void 0:e.status)===200&&e.data.assemblies.map(r=>r.nozzles??[]).flat().forEach(r=>{var o;const s=r.path,n=((o=r.pipelines.find(c=>c.name==="beverage"))==null?void 0:o.topicPrefix)||"",a=W.factory(s)({path:r.path,name:r.name,urlPrefix:r.urlPrefix,topicPrefix:r.topicPrefix,beverageTopicPrefix:n});this.deviceNozzles.addModel(a)})}};Xe([i.kosChild],Y.prototype,"deviceNozzles",2);Y=Xe([i.kosModel(Ze)],Y);const qe=new i.SingletonKosModelRegistrationFactory({class:Y,type:Ze}),{URL:Je}=i.resolveServiceUrl("GENERIC_POUR_SERVICE"),{postModel:gr}=i.ServiceFactory.build({basePath:`${Je}/api/nozzle`}),We=async(e,t)=>{const r=await gr({model:{},urlOverride:`${Je}${e}`,ordered:!0,tracker:t});return r!=null&&r.data&&i.FutureManager.initiateFuture(r.data),r};var hr=Object.defineProperty,ur=Object.getOwnPropertyDescriptor,_=(e,t,r,s)=>{for(var n=s>1?void 0:s?ur(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(n=(s?o(t,r,n):o(n))||n);return s&&n&&hr(t,r,n),n};const Qe="generic-pour-model",et="/kos/generic/pour/started",tt="/kos/generic/pour/progress",rt="/kos/generic/pour/cancel",ee=e=>e.onPourStart!==void 0&&e.onPourCancel!==void 0&&e.onPourProgress!==void 0;let f=class{constructor(e,t){d(this,"id");d(this,"servicePathFactory");d(this,"pourType");d(this,"selectedId");d(this,"state");this.id=e,this.futureHandler=new i.FutureHandler(this),this.servicePathFactory=t.servicePathFactory,this.pourType=t.pourType||"free",this.selectedId=t.selectedId,this.state=i.ObservableData(t.initialData||{})}get servicePath(){return this.selectedId?this.servicePathFactory(this.selectedId,this.state):""}updateContextData(e,t){this.state[e]=t}removeContextData(e){delete this.state[e]}clearContextData(){this.state=i.ObservableData()}updateModel(e){e.pourType&&(this.pourType=e.pourType),e.initialData&&this.state.setValues(e.initialData)}handlePouringStart(){this.logger.info("Pour started"),i.getAllKosCompanionModels(this).forEach(t=>{var r;ee(t)&&((r=t.onPourStart)==null||r.call(t))});const e={pourTarget:this.id,type:this.pourType};i.EventBus.publish(et,e)}handlePouringEnd(){this.logger.info("Pour ended")}handleCancelStart(){this.logger.info("Pour canceling")}handleCanceled(){this.logger.info("Pour canceled"),i.getAllKosCompanionModels(this).forEach(t=>{var r;ee(t)&&((r=t.onPourCancel)==null||r.call(t))});const e={pourTarget:this.id};i.EventBus.publish(rt,e)}async pour(e){var t;try{if(this.transition("START_POUR"),!e)throw new Error("No tracker provided");const r=await We(this.servicePath,e);return this.transition("POUR_ACTIVE"),(t=r==null?void 0:r.data)!=null&&t.endState&&this.transition("POUR_COMPLETED"),r}catch(r){throw this.logger.error(r),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),r}}async cancelPour(){var e;this.transition("CANCEL_POUR"),await((e=this.futureHandler.getFuture())==null?void 0:e.cancelFuture()),this.transition("POUR_CANCELED")}get isPouring(){var e;return!!(this.future&&!((e=this.future)!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING||this.currentState===l.POUR_CANCELING}get canPour(){return this.currentState===l.IDLE}get pourProgress(){return this.progress??0}onFutureUpdate(e){i.getAllKosCompanionModels(this).forEach(r=>{ee(r)&&r.onPourProgress(e)});const t={pourTarget:this.id,progress:e.progress,status:e.status,clientData:e.clientData,futureId:e.futureId,remainingTimeMs:e.remainingTimeMs,endState:e.endState,reason:e.reason,timeRemaining:e.timeRemaining};i.EventBus.publish(tt,t),e.endState&&i.kosAction(()=>{this.currentState===l.POURING&&this.transition("POUR_COMPLETED")})}};_([i.kosStateEntry(l.POURING)],f.prototype,"handlePouringStart",1);_([i.kosStateExit(l.POURING)],f.prototype,"handlePouringEnd",1);_([i.kosStateEntry(l.POUR_CANCELING)],f.prototype,"handleCancelStart",1);_([i.kosStateExit(l.POUR_CANCELING)],f.prototype,"handleCanceled",1);_([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],f.prototype,"pour",1);_([i.kosStateGuard({allowedStates:[l.POUR_STARTING,l.POURING]})],f.prototype,"cancelPour",1);f=_([i.kosModel(Qe),i.kosLoggerAware(),i.kosFutureAware(),i.kosStateMachine({initial:l.IDLE,initializeAt:i.DependencyLifecycle.READY,states:{[l.IDLE]:{on:{START_POUR:l.POUR_STARTING}},[l.POUR_STARTING]:{on:{POUR_ACTIVE:l.POURING,CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POURING]:{on:{CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POUR_CANCELING]:{on:{POUR_CANCELED:l.IDLE}}}},{trackHistory:!1,throwOnInvalid:!1})],f);const Pr=new i.KosModelRegistrationFactory({class:f,type:Qe}),se={...ae.registration,...ne.registration,...Pe.registration,...de.registration,...W.registration,...Ie.registration,...q.registration,...V.registration,...me.registration,...ue.registration},it=e=>()=>(i.registerCoreModels(e)(),qe.register(),Object.keys(se).forEach(t=>{const r=se[t];i.registerLegacyModel(e)(t,r)}),i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("FirmwareUpdateInProgressTrouble",async t=>{var r;if((r=t.data)!=null&&r.deviceId){const{model:s}=i.getKosModelSync(me.type);if(s){const n=s.boards.find(a=>a.id===t.data.deviceId)?i.getKosModelSync(t.data.deviceId).model:void 0;return{devices:n?n.name:""}}}return{}}),{preload:i.RegistrationManager.model.preloadModel(e),model:i.RegistrationManager.model.register(e),companion:i.RegistrationManager.companion.register(e),legacy:i.RegistrationManager.model.registerLegacyModel(e)}),I={...i.KosModelRegistry};I.dispense={models:it(I)};I.preload=i.RegistrationManager.model.preloadModel(I);I.model=i.RegistrationManager.model.register(I);I.companion=i.RegistrationManager.companion.register(I);I.legacy=i.RegistrationManager.model.registerLegacyModel(I);const yr=I;exports.Assembly=me;exports.Availability=V;exports.Board=he;exports.BoardContainer=ue;exports.CONTEXT_ASSEMBLY_DATA=Ge;exports.CONTEXT_ASSEMBLY_RAW_DATA=ke;exports.DeviceAssembly=qe;exports.DispenseModelType=E;exports.ExtensionType=h;exports.GenericPour=Pr;exports.Holder=de;exports.HolderContainer=Pe;exports.Ingredient=ne;exports.IngredientContainer=ae;exports.KosModelRegistry=yr;exports.Nozzle=W;exports.PourState=l;exports.Pump=Ie;exports.PumpContainer=q;exports.PumpIndex=ge;exports.TOPIC_BOARD_LINKED=ce;exports.TOPIC_BOARD_UNLINKED=pe;exports.TOPIC_GENERIC_POUR_CANCEL=rt;exports.TOPIC_GENERIC_POUR_PROGRESS=tt;exports.TOPIC_GENERIC_POUR_STARTED=et;exports.addAssignment=vt;exports.assignHolderIngredient=Ae;exports.clearPourable=Ye;exports.deleteAssignment=ft;exports.getAssembly=le;exports.getAssignments=mt;exports.getAvailability=He;exports.getHolders=Pt;exports.getIngredients=Re;exports.getIntentVolume=ze;exports.kosModels=se;exports.pourNamedPourable=je;exports.pourOnTarget=We;exports.pourPourable=Fe;exports.registerDispenseModels=it;exports.replaceLine=Ne;exports.selectPourable=Ve;exports.sendIntent=xe;exports.sendRfidOverride=Le;exports.unassignHolderIngredient=Te;
|
|
2
|
-
//# sourceMappingURL=dispense-registration-manager-BkJ1ggtS.cjs.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var V=Object.defineProperty;var v=(t,e,a)=>e in t?V(t,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[e]=a;var o=(t,e,a)=>(v(t,typeof e!="symbol"?e+"":e,a),a);const n=require("./dispense-registration-manager-BkJ1ggtS.cjs"),r=require("@kosdev-code/kos-ui-sdk"),s=require("react"),O=Object.freeze(Object.defineProperty({__proto__:null,getIngredients:n.getIngredients},Symbol.toStringTag,{value:"Module"})),H=Object.freeze(Object.defineProperty({__proto__:null,addAssignment:n.addAssignment,assignHolderIngredient:n.assignHolderIngredient,deleteAssignment:n.deleteAssignment,getAssignments:n.getAssignments,getHolders:n.getHolders,replaceLine:n.replaceLine,sendRfidOverride:n.sendRfidOverride,unassignHolderIngredient:n.unassignHolderIngredient},Symbol.toStringTag,{value:"Module"})),j=Object.freeze(Object.defineProperty({__proto__:null,getAssembly:n.getAssembly},Symbol.toStringTag,{value:"Module"})),D=Object.freeze(Object.defineProperty({__proto__:null,getIntentVolume:n.getIntentVolume,sendIntent:n.sendIntent},Symbol.toStringTag,{value:"Module"})),F=Object.freeze(Object.defineProperty({__proto__:null,clearPourable:n.clearPourable,getAvailability:n.getAvailability,pourNamedPourable:n.pourNamedPourable,pourPourable:n.pourPourable,selectPourable:n.selectPourable},Symbol.toStringTag,{value:"Module"})),R=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),L=Object.freeze(Object.defineProperty({__proto__:null,pourOnTarget:n.pourOnTarget},Symbol.toStringTag,{value:"Module"})),$=t=>{var l,u,M,x;const[e,a]=s.useState(((l=t==null?void 0:t.slice)==null?void 0:l.maxVolMl)??0),[i,m]=s.useState(((u=t==null?void 0:t.slice)==null?void 0:u.currentVolMl)??0),[p,T]=s.useState(((M=t==null?void 0:t.slice)==null?void 0:M.maxVolMl)!==void 0),[g,_]=s.useState(((x=t==null?void 0:t.slice)==null?void 0:x.currentVolMl)!==void 0),[I,S]=s.useState(i<=0?0:Math.floor((i||1)/(e||1)*100)),[f,P]=s.useState(p&&g);return s.useEffect(()=>{const A=r.kosAutoEffect(()=>{var d,c,y,E;a(((d=t==null?void 0:t.slice)==null?void 0:d.maxVolMl)??0),m(((c=t==null?void 0:t.slice)==null?void 0:c.currentVolMl)??0),T(((y=t==null?void 0:t.slice)==null?void 0:y.maxVolMl)!==void 0),_(((E=t==null?void 0:t.slice)==null?void 0:E.currentVolMl)!==void 0),S(i<=0?0:Math.floor((i||1)/(e||1)*100)),P(p&&g)});return()=>{A()}},[t]),{maxVolume:e,remainingVolume:i,fillPercent:I,hasFuelGuage:f}};class b{constructor(){o(this,"core",new r.CoreExtensionManager)}registerIngredientDataMapper(e){return r.ExtensionManager.dataMapper.registerDataMapper(n.ExtensionType.IngredientMapper,e),this}registerIngredientLoader(e){return r.ExtensionManager.loader.registerLoader(n.ExtensionType.IngredientLoader,e),this}registerIngredientIndex(e){return r.ExtensionManager.indexExtension.registerIndexExtension(n.ExtensionType.IngredientIndex,e),this}registerIngredientTypeMapper(e){return r.ExtensionManager.propertyMapper.registerPropertyMapper(n.ExtensionType.IngredientTypeMapper,e),this}registerHolderDataMapper(e){return r.ExtensionManager.dataMapper.registerDataMapper(n.ExtensionType.HolderMapper,e),this}registerHolderTypeMapper(e){return r.ExtensionManager.propertyMapper.registerPropertyMapper(n.ExtensionType.HolderTypeMapper,e),this}registerHolderIngredientMapper(e){return r.ExtensionManager.propertyMapper.registerPropertyMapper(n.ExtensionType.HolderTypeMapper,e),this}registerHolderIndex(e){return r.ExtensionManager.indexExtension.registerIndexExtension(n.ExtensionType.HolderIndex,e),this}registerAvailabilityDataMapper(e){return r.ExtensionManager.dataMapper.registerDataMapper(n.ExtensionType.AvailabilityMapper,e),this}registerAvailabilityLoader(e){return r.ExtensionManager.loader.registerLoader(n.ExtensionType.AvailabilityLoader,e),this}registerSelectedPourableDataMapper(e){return r.ExtensionManager.dataMapper.registerDataMapper(n.ExtensionType.SelectedPourableMapper,e),this}registerAssemblyDataMapper(e){return r.ExtensionManager.dataMapper.registerDataMapper(n.ExtensionType.AssemblyMapper,e),this}registerBoardIndex(e){return r.ExtensionManager.indexExtension.registerIndexExtension(n.ExtensionType.BoardIndex,e),this}registerBoardDataMapper(e){return r.ExtensionManager.dataMapper.registerDataMapper(n.ExtensionType.BoardMapper,e),this}registerAssemblyFeatureFlagResolver(e){var a;return(a=r.ExtensionManager[r.EXTENSION_FEATURE_FLAG_RESOLVER])==null||a.register(n.ExtensionType.AssemblyFeatureFlags,e),this}}class z{constructor(){o(this,"dispense");o(this,"core");this.dispense=new b,this.core=new r.CoreExtensionManager}}exports.DispenseExtensionManager=b;exports.KosExtensionManager=z;exports.assembly=R;exports.getFuelGaugeValue=$;exports.index=j;exports.index$1=L;exports.index$2=H;exports.index$3=O;exports.index$4=F;exports.index$5=D;
|
|
2
|
-
//# sourceMappingURL=extension-utils-DUV7OQR1.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension-utils-DUV7OQR1.cjs","sources":["../../../../packages/sdk/kos-dispense-sdk/src/models/models/holder/utils/holder-utils.ts","../../../../packages/sdk/kos-dispense-sdk/src/models/utils/extension-utils.ts"],"sourcesContent":["import { kosAutoEffect } from \"@kosdev-code/kos-ui-sdk\";\nimport { useEffect, useState } from \"react\";\nimport type { HolderModel } from \"../types\";\n\nexport const getFuelGaugeValue = (holder: HolderModel) => {\n const [maxVolume, setMaxVolume] = useState<number>(\n holder?.slice?.maxVolMl ?? 0\n );\n const [remainingVolume, setRemainingVolume] = useState<number>(\n holder?.slice?.currentVolMl ?? 0\n );\n\n const [hasMaxVolume, setHasMaxVolume] = useState<boolean>(\n holder?.slice?.maxVolMl !== undefined\n );\n\n const [hasRemainingVolume, setHasRemainingVolume] = useState<boolean>(\n holder?.slice?.currentVolMl !== undefined\n );\n\n const [fillPercent, setFillPercent] = useState<number>(\n remainingVolume <= 0\n ? 0\n : Math.floor(((remainingVolume || 1) / (maxVolume || 1)) * 100)\n );\n\n const [hasFuelGuage, setHasFuelGuage] = useState<boolean>(\n hasMaxVolume && hasRemainingVolume\n );\n\n useEffect(() => {\n const disposer = kosAutoEffect(() => {\n setMaxVolume(holder?.slice?.maxVolMl ?? 0);\n setRemainingVolume(holder?.slice?.currentVolMl ?? 0);\n setHasMaxVolume(holder?.slice?.maxVolMl !== undefined);\n setHasRemainingVolume(holder?.slice?.currentVolMl !== undefined);\n setFillPercent(\n remainingVolume <= 0\n ? 0\n : Math.floor(((remainingVolume || 1) / (maxVolume || 1)) * 100)\n );\n setHasFuelGuage(hasMaxVolume && hasRemainingVolume);\n });\n\n return () => {\n disposer();\n };\n }, [holder]);\n\n return { maxVolume, remainingVolume, fillPercent, hasFuelGuage };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n CoreExtensionManager,\n DataLoader,\n DataMapper,\n EXTENSION_FEATURE_FLAG_RESOLVER,\n ExtensionManager,\n IndexExtension,\n PropertyMapper,\n type FlagResolver,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { ExtensionType } from \"../constants\";\nimport { AssemblyTypes, type AssemblyModel } from \"../models\";\nimport type { HolderResponse } from \"../models/holder/services\";\nimport type { HolderModel } from \"../models/holder/types\";\nimport type { IngredientResponse } from \"../models/ingredient/services\";\nimport type { BeverageResponse } from \"../models/nozzle/services\";\nimport type { SelectedPourable } from \"../models/nozzle/types\";\n\nexport type IngredientDataMapper<\n AdditionalData extends object = Record<string, any>\n> = DataMapper<IngredientResponse, AdditionalData, any>;\n\n/**\n * Mapping function that maps an ingredient response into the type property of\n * the {@link IngredientModel}.\n */\nexport type IngredientTypeMapper<\n T extends IngredientResponse = IngredientResponse\n> = PropertyMapper<T, string>;\n\n/**\n * Mapping function that maps additional data from holder service response\n * into the {@link HolderModel} data.\n */\nexport type HolderTypeMapper<T extends HolderResponse = HolderResponse> =\n PropertyMapper<T, string>;\n\n/**\n * Mapping function that maps additional data from holder service response\n * into the {@link HolderModel} data.\n */\nexport type HolderDataMapper<\n AdditionalData extends object = Record<string, any>,\n HolderData extends HolderResponse = HolderResponse\n> = DataMapper<HolderData, AdditionalData, any>;\n\nexport type GroupBeverageResponse = BeverageResponse & { groupId: string };\nexport type AvailabilityDataMapper<\n AdditionalData extends object = Record<string, any>,\n AvailabilityData extends GroupBeverageResponse = GroupBeverageResponse\n> = DataMapper<AvailabilityData, AdditionalData, any>;\n\nexport type SelectedPourableMapper = DataMapper<SelectedPourable, any>;\n\nexport type BoardDataMapper<\n AdditionalData extends object = Record<string, any>,\n BoardData extends AssemblyTypes.AssemblyBoard<any> = AssemblyTypes.AssemblyBoard<any>\n> = DataMapper<BoardData, AdditionalData, any>;\n\nexport type AssemblyMapper<\n AdditionalData extends object = Record<string, any>,\n AssemblyResponseData extends AssemblyTypes.AssemblyResponse<any> = AssemblyTypes.AssemblyResponse<any>\n> = DataMapper<AssemblyResponseData, AdditionalData, any>;\n/**\n * The DispenseExtensionManager is responsible for managing the extension points that are specific to the Dispense application.\n */\nexport class DispenseExtensionManager {\n core: CoreExtensionManager = new CoreExtensionManager();\n /**\n * Maps data into the {@link IngredientModel}\n *\n * It is common for the ingredient data provided by the ingredient service to be augmented with additional properties that are\n * not provided by the base KOS Ingredient model. The {@link IngredientMapper} extension point allows for the data to be mapped\n * into the {@link IngredientModel} and the {@link IngredientModel.data} property to be augmented with additional properties.\n *\n * @example\n * The following example shows how to map the data from the service response into the {@link IngredientModel}.\n * The context is provided by the {@link IngredientLoader} extension point with its data being used to optionally augment the\n * ingredient data.\n *\n * The result of the mapping will be available in the `data` property of the {@link IngredientModel}.\n *\n * In this case the `IngedientReponseData` interface represents the data being returned by the ingredient service and the\n * `IngredientData` interface represents the data that will be available in the {@link IngredientModel.data} property. The `ingredientDataMapper`\n * is responsible for mapping from one format to the other.\n *\n * ```typescript\n *\n * interface IngredientResponseData extends NozzleServices.IngredientResponse {\n * chilled: boolean;\n * carbonated: boolean;\n * highYield: boolean;\n * }\n *\n * interface IngredientData {\n * chilled: boolean;\n * carbonated: boolean;\n * highYield: boolean;\n * }\n *\n * export const ingredientDataMapper = async (\n * data: IngredientResponseData,\n * context: IngredientContext\n * ): Promise<IngredientData> => {\n * return {\n * chilled: data.chilled,\n * carbonated: data.carbonated,\n * highYield: data.highYield,\n * }\n * }\n * ```\n * */\n registerIngredientDataMapper(ingredientDataMapper: IngredientDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.IngredientMapper,\n ingredientDataMapper\n );\n\n return this;\n }\n\n /**\n * Loads data that will be provided as context into the {@link IngredientMapper}\n *\n * @example\n * The following example shows how to load the brandset data, normalize it into a map and then provide it back to the framework\n * where it can be used by the other extension points.\n *\n * In the ingredient container model, the data is provided to the {@link IngredientMapper} extension point in order to augment ingredient data\n * and also loaded into the ingredient container model context in order to make the data available throughout the code.\n *\n * ```typescript\n * export const ingredientContextLoader = async (): Promise<BeverageContext> => {\n * const response = await kosFetch('kos:/system/some/ingredient/endpoint.json');\n *\n * if (response.status !== 200) {\n * KosLog.error('Failed to load ingredient data');\n * return {};\n * }\n * const json = await response.json();\n * return json;\n * };\n * ```\n * */\n registerIngredientLoader(ingredientLoader: DataLoader) {\n ExtensionManager.loader.registerLoader(\n ExtensionType.IngredientLoader,\n ingredientLoader\n );\n return this;\n }\n\n registerIngredientIndex(ingredientIndex: IndexExtension) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.IngredientIndex,\n ingredientIndex\n );\n return this;\n }\n\n /**\n * Registers a data mapper for the {@link IngredientModel}\n * */\n registerIngredientTypeMapper(ingredientTypeMapper: IngredientTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.IngredientTypeMapper,\n ingredientTypeMapper\n );\n return this;\n }\n\n /**\n * Registers a data mapper for the {@link HolderModel} model.\n * @param holderDataMapper - Mapping function that maps additional data from holder service response\n * @returns\n */\n registerHolderDataMapper(holderDataMapper: HolderDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.HolderMapper,\n holderDataMapper\n );\n return this;\n }\n\n registerHolderTypeMapper(holderTypeMapper: HolderTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.HolderTypeMapper,\n holderTypeMapper\n );\n return this;\n }\n\n /**\n * Maps the ingredientId property of the holder into the {@link HolderModel}.\n * If not provided, the ingredientId will assume that the value is mapped from the\n * ingredientId property of the service response.\n * */\n registerHolderIngredientMapper(holderTypeMapper: HolderTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.HolderTypeMapper,\n holderTypeMapper\n );\n return this;\n }\n\n registerHolderIndex<T extends HolderModel = HolderModel>(\n holderIndex: IndexExtension<T>\n ) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.HolderIndex,\n holderIndex\n );\n return this;\n }\n\n /**\n * Maps data into the {@link AvailabilityModel}\n *\n * @example\n * The following example shows how to map the data from the service response into the {@link AvailabilityModel}.\n * The context is provided by the {@link AvailabilityLoader} extension point with its data being used to augment the\n * availability data.\n *\n * The result of the mapping will be available in the `data` property of the {@link AvailabilityModel}.\n *\n * ```typescript\n * export const beverageDataMapper = async (\n * data: NozzleServices.BeverageResponse,\n * context: BeverageContext\n * ): Promise<BeverageData> => {\n * const id = data.altId;\n * const iconUrl = encodeURI(\n * `http://localhost:8081/system/brandset/${context?.[id]?.icon}`\n * );\n * const cuiColorCode = context?.[id]?.cuiColorCode\n * ? context?.[id]?.cuiColorCode\n * : '';\n * return { iconUrl, cuiColorCode };\n * };\n * ```\n * */\n registerAvailabilityDataMapper(availabilityMapper: AvailabilityDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.AvailabilityMapper,\n availabilityMapper\n );\n return this;\n }\n\n /**\n * Loads data that will be provided as context into the {@link AvailabilityMapper}\n *\n * @example\n * A common use case is to load brandset data that is UI specific and not provided directly by the Java service.\n *\n * The following example shows how to load the brandset data, normalize it into a map and then provide it back to the framework\n * where it can be used by the other extension points.\n *\n * In the nozzle model, the data is provided to the {@link AvailabilityMapper} extension point in order to augment availability data\n * and also loaded into the nozzle model context in order to make the data available throughout the code.\n *\n * ```typescript\n * export const beverageContextLoader = async (): Promise<BeverageContext> => {\n * const response = await kosFetch('kos:/system/brandset/brandset.json');\n *\n * if (response.status !== 200) {\n * KosLog.error('Failed to load beverage data');\n * return {};\n * }\n * const json: BrandsetResponse | null = await response.json();\n * const initialBeverages: Record<string, BrandsetIngredient> = {};\n * const beverages = json?.ingredients?.reduce((acc, beverage) => {\n * acc[beverage.ingredientId] = beverage;\n * return acc;\n * }, initialBeverages);\n * return beverages;\n * };\n * ```\n * */\n registerAvailabilityLoader(availabilityLoader: DataLoader) {\n ExtensionManager.loader.registerLoader(\n ExtensionType.AvailabilityLoader,\n availabilityLoader\n );\n return this;\n }\n\n /**\n * Maps the abstract {@link SelectedPourable} data into a format that is specific to the nozzle.\n * */\n registerSelectedPourableDataMapper(\n selectedPourableMapper: SelectedPourableMapper\n ) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.SelectedPourableMapper,\n selectedPourableMapper\n );\n return this;\n }\n\n /**\n * Maps data into the {@link AssemblyModel} data.\n * Used in cases where the base assembly has been extended with additional properties in the backend. This extension\n * point allows for the data to be mapped into the {@link AssemblyModel} and augmented with additional properties.\n *\n * @example\n *\n * In this example of an implementation of a {@link AssemblyMapper}, the {@link AssemblyResponse} data is mapped into\n * a {@link FreestyleAssembly} object.\n *\n * The {@link FreestyleAssemblyResponse} interface represents the additional data being returned by the assembly service and is\n * merged into the {@link AssemblyResponse} interface.\n *\n * The {@link FreestyleAssembly} interface represents the additional data, beyond the base data set, that will be merged into the {@link AssemblyModel}.\n *\n * The mapper is responsible for mapping from the {@link FreestyleAssemblyResponse} format to the {@link FreestyleAssembly} format.\n * ```typescript\n * import { AssemblyTypes } from \"@kosdev-code/kos-dispense-sdk\";\n * import { DataMapper } from \"@kosdev-code/kos-ui-sdk\";\n *\n * // define the additional data being returned by the assembly service\n * export interface FreestyleAssemblyResponse {\n * iceAgitator?: {\n * name: \"iceAgitator\";\n * path: string;\n * };\n * }\n *\n * // define the additional data structure that will be merged into the assembly model\n * export interface FreestyleAssembly {\n * iceAgitator: {\n * path: string;\n * };\n * carbAgitator: {\n * path: string;\n * };\n * }\n *\n *\n * // define the mapper that will map the data from the service response into the additional data structure\n * // that will be merged into the assembly model.\n * // In this case the mapper is responsible for mapping from the {@link FreestyleAssemblyResponse} format to the {@link FreestyleAssembly} format.\n * export const assemblyDataMapper: DataMapper<\n * AssemblyTypes.AssemblyResponse<FreestyleAssemblyResponse>,\n * FreestyleAssembly\n * > = async (data) => {\n * const response = data.assemblies.reduce((acc, assembly) => {\n * const agitatorKeys = [\"iceAgitator\", \"carbAgitator\"];\n * agitatorKeys.forEach((key) => {\n * const agitator = assembly[key];\n * if (agitator) {\n * acc[key] = agitator;\n * }\n * });\n *\n * return acc;\n * }, {} as FreestyleAssembly);\n * return response;\n * };\n *```\n */\n registerAssemblyDataMapper(assemblyDataMapper: AssemblyMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.AssemblyMapper,\n assemblyDataMapper\n );\n return this;\n }\n\n registerBoardIndex(boardIndex: IndexExtension) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.BoardIndex,\n boardIndex\n );\n return this;\n }\n\n registerBoardDataMapper(boardDataMapper: BoardDataMapper<any, any>) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.BoardMapper,\n boardDataMapper\n );\n return this;\n }\n\n registerAssemblyFeatureFlagResolver(\n assemblyFeatureFlagResolver: FlagResolver<AssemblyModel>\n ) {\n ExtensionManager[EXTENSION_FEATURE_FLAG_RESOLVER]?.register(\n ExtensionType.AssemblyFeatureFlags,\n assemblyFeatureFlagResolver\n );\n return this;\n }\n}\n\n/**\n * The KosExtensionManager provides access to the extension points that are provided in the SDK for Dispense applications.\n *\n * The extension points are divided into two categories:\n *\n * @param core - The core extension {@link CoreExtensionManager} points are used to extend the base models that are provided by the SDK.\n * @param dispense - The dispense extension {@link DispenseExtensionManager} points are used to extend the models that are specific to the Dispense SDK.\n */\nexport class KosExtensionManager {\n dispense: DispenseExtensionManager;\n core: CoreExtensionManager;\n constructor() {\n this.dispense = new DispenseExtensionManager();\n this.core = new CoreExtensionManager();\n }\n}\n"],"names":["getFuelGaugeValue","holder","maxVolume","setMaxVolume","useState","_a","remainingVolume","setRemainingVolume","_b","hasMaxVolume","setHasMaxVolume","_c","hasRemainingVolume","setHasRemainingVolume","_d","fillPercent","setFillPercent","hasFuelGuage","setHasFuelGuage","useEffect","disposer","kosAutoEffect","DispenseExtensionManager","__publicField","CoreExtensionManager","ingredientDataMapper","ExtensionManager","ExtensionType","ingredientLoader","ingredientIndex","ingredientTypeMapper","holderDataMapper","holderTypeMapper","holderIndex","availabilityMapper","availabilityLoader","selectedPourableMapper","assemblyDataMapper","boardIndex","boardDataMapper","assemblyFeatureFlagResolver","EXTENSION_FEATURE_FLAG_RESOLVER","KosExtensionManager"],"mappings":"sgDAIaA,EAAqBC,GAAwB,aACxD,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,WAChCC,EAAAJ,GAAA,YAAAA,EAAQ,QAAR,YAAAI,EAAe,WAAY,CAAA,EAEvB,CAACC,EAAiBC,CAAkB,EAAIH,EAAAA,WAC5CI,EAAAP,GAAA,YAAAA,EAAQ,QAAR,YAAAO,EAAe,eAAgB,CAAA,EAG3B,CAACC,EAAcC,CAAe,EAAIN,EAAAA,WACtCO,EAAAV,GAAA,YAAAA,EAAQ,QAAR,YAAAU,EAAe,YAAa,MAAA,EAGxB,CAACC,EAAoBC,CAAqB,EAAIT,EAAAA,WAClDU,EAAAb,GAAA,YAAAA,EAAQ,QAAR,YAAAa,EAAe,gBAAiB,MAAA,EAG5B,CAACC,EAAaC,CAAc,EAAIZ,EAAAA,SACpCE,GAAmB,EACf,EACA,KAAK,OAAQA,GAAmB,IAAMJ,GAAa,GAAM,GAAG,CAAA,EAG5D,CAACe,EAAcC,CAAe,EAAId,EAAAA,SACtCK,GAAgBG,CAAA,EAGlBO,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAWC,EAAAA,cAAc,IAAM,aACnClB,IAAaE,EAAAJ,GAAA,YAAAA,EAAQ,QAAR,YAAAI,EAAe,WAAY,CAAC,EACzCE,IAAmBC,EAAAP,GAAA,YAAAA,EAAQ,QAAR,YAAAO,EAAe,eAAgB,CAAC,EACnDE,IAAgBC,EAAAV,GAAA,YAAAA,EAAQ,QAAR,YAAAU,EAAe,YAAa,MAAS,EACrDE,IAAsBC,EAAAb,GAAA,YAAAA,EAAQ,QAAR,YAAAa,EAAe,gBAAiB,MAAS,EAC/DE,EACEV,GAAmB,EACf,EACA,KAAK,OAAQA,GAAmB,IAAMJ,GAAa,GAAM,GAAG,CAAA,EAElEgB,EAAgBT,GAAgBG,CAAkB,CACpD,CAAC,EAED,MAAO,IAAM,CACXQ,EAAA,CACF,CACF,EAAG,CAACnB,CAAM,CAAC,EAEJ,CAAE,UAAAC,EAAW,gBAAAI,EAAiB,YAAAS,EAAa,aAAAE,CAAA,CACpD,ECiBO,MAAMK,CAAyB,CAA/B,cACLC,EAAA,YAA6B,IAAIC,EAAAA,sBA6CjC,6BAA6BC,EAA4C,CACvEC,OAAAA,EAAAA,iBAAiB,WAAW,mBAC1BC,EAAAA,cAAc,iBACdF,CAAA,EAGK,IACT,CAyBA,yBAAyBG,EAA8B,CACrDF,OAAAA,EAAAA,iBAAiB,OAAO,eACtBC,EAAAA,cAAc,iBACdC,CAAA,EAEK,IACT,CAEA,wBAAwBC,EAAiC,CACvDH,OAAAA,EAAAA,iBAAiB,eAAe,uBAC9BC,EAAAA,cAAc,gBACdE,CAAA,EAEK,IACT,CAKA,6BAA6BC,EAA4C,CACvEJ,OAAAA,EAAAA,iBAAiB,eAAe,uBAC9BC,EAAAA,cAAc,qBACdG,CAAA,EAEK,IACT,CAOA,yBAAyBC,EAAoC,CAC3DL,OAAAA,EAAAA,iBAAiB,WAAW,mBAC1BC,EAAAA,cAAc,aACdI,CAAA,EAEK,IACT,CAEA,yBAAyBC,EAAoC,CAC3DN,OAAAA,EAAAA,iBAAiB,eAAe,uBAC9BC,EAAAA,cAAc,iBACdK,CAAA,EAEK,IACT,CAOA,+BAA+BA,EAAoC,CACjEN,OAAAA,EAAAA,iBAAiB,eAAe,uBAC9BC,EAAAA,cAAc,iBACdK,CAAA,EAEK,IACT,CAEA,oBACEC,EACA,CACAP,OAAAA,EAAAA,iBAAiB,eAAe,uBAC9BC,EAAAA,cAAc,YACdM,CAAA,EAEK,IACT,CA4BA,+BAA+BC,EAA4C,CACzER,OAAAA,EAAAA,iBAAiB,WAAW,mBAC1BC,EAAAA,cAAc,mBACdO,CAAA,EAEK,IACT,CAgCA,2BAA2BC,EAAgC,CACzDT,OAAAA,EAAAA,iBAAiB,OAAO,eACtBC,EAAAA,cAAc,mBACdQ,CAAA,EAEK,IACT,CAKA,mCACEC,EACA,CACAV,OAAAA,EAAAA,iBAAiB,WAAW,mBAC1BC,EAAAA,cAAc,uBACdS,CAAA,EAEK,IACT,CA+DA,2BAA2BC,EAAoC,CAC7DX,OAAAA,EAAAA,iBAAiB,WAAW,mBAC1BC,EAAAA,cAAc,eACdU,CAAA,EAEK,IACT,CAEA,mBAAmBC,EAA4B,CAC7CZ,OAAAA,EAAAA,iBAAiB,eAAe,uBAC9BC,EAAAA,cAAc,WACdW,CAAA,EAEK,IACT,CAEA,wBAAwBC,EAA4C,CAClEb,OAAAA,EAAAA,iBAAiB,WAAW,mBAC1BC,EAAAA,cAAc,YACdY,CAAA,EAEK,IACT,CAEA,oCACEC,EACA,OACAd,OAAAA,EAAAA,EAAAA,iBAAiBe,EAAAA,+BAA+B,IAAhDf,MAAAA,EAAmD,SACjDC,EAAAA,cAAc,qBACda,GAEK,IACT,CACF,CAUO,MAAME,CAAoB,CAG/B,aAAc,CAFdnB,EAAA,iBACAA,EAAA,aAEE,KAAK,SAAW,IAAID,EACpB,KAAK,KAAO,IAAIE,sBAClB,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension-utils-DeLiIgFH.js","sources":["../../../../packages/sdk/kos-dispense-sdk/src/models/models/holder/utils/holder-utils.ts","../../../../packages/sdk/kos-dispense-sdk/src/models/utils/extension-utils.ts"],"sourcesContent":["import { kosAutoEffect } from \"@kosdev-code/kos-ui-sdk\";\nimport { useEffect, useState } from \"react\";\nimport type { HolderModel } from \"../types\";\n\nexport const getFuelGaugeValue = (holder: HolderModel) => {\n const [maxVolume, setMaxVolume] = useState<number>(\n holder?.slice?.maxVolMl ?? 0\n );\n const [remainingVolume, setRemainingVolume] = useState<number>(\n holder?.slice?.currentVolMl ?? 0\n );\n\n const [hasMaxVolume, setHasMaxVolume] = useState<boolean>(\n holder?.slice?.maxVolMl !== undefined\n );\n\n const [hasRemainingVolume, setHasRemainingVolume] = useState<boolean>(\n holder?.slice?.currentVolMl !== undefined\n );\n\n const [fillPercent, setFillPercent] = useState<number>(\n remainingVolume <= 0\n ? 0\n : Math.floor(((remainingVolume || 1) / (maxVolume || 1)) * 100)\n );\n\n const [hasFuelGuage, setHasFuelGuage] = useState<boolean>(\n hasMaxVolume && hasRemainingVolume\n );\n\n useEffect(() => {\n const disposer = kosAutoEffect(() => {\n setMaxVolume(holder?.slice?.maxVolMl ?? 0);\n setRemainingVolume(holder?.slice?.currentVolMl ?? 0);\n setHasMaxVolume(holder?.slice?.maxVolMl !== undefined);\n setHasRemainingVolume(holder?.slice?.currentVolMl !== undefined);\n setFillPercent(\n remainingVolume <= 0\n ? 0\n : Math.floor(((remainingVolume || 1) / (maxVolume || 1)) * 100)\n );\n setHasFuelGuage(hasMaxVolume && hasRemainingVolume);\n });\n\n return () => {\n disposer();\n };\n }, [holder]);\n\n return { maxVolume, remainingVolume, fillPercent, hasFuelGuage };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n CoreExtensionManager,\n DataLoader,\n DataMapper,\n EXTENSION_FEATURE_FLAG_RESOLVER,\n ExtensionManager,\n IndexExtension,\n PropertyMapper,\n type FlagResolver,\n} from \"@kosdev-code/kos-ui-sdk\";\nimport { ExtensionType } from \"../constants\";\nimport { AssemblyTypes, type AssemblyModel } from \"../models\";\nimport type { HolderResponse } from \"../models/holder/services\";\nimport type { HolderModel } from \"../models/holder/types\";\nimport type { IngredientResponse } from \"../models/ingredient/services\";\nimport type { BeverageResponse } from \"../models/nozzle/services\";\nimport type { SelectedPourable } from \"../models/nozzle/types\";\n\nexport type IngredientDataMapper<\n AdditionalData extends object = Record<string, any>\n> = DataMapper<IngredientResponse, AdditionalData, any>;\n\n/**\n * Mapping function that maps an ingredient response into the type property of\n * the {@link IngredientModel}.\n */\nexport type IngredientTypeMapper<\n T extends IngredientResponse = IngredientResponse\n> = PropertyMapper<T, string>;\n\n/**\n * Mapping function that maps additional data from holder service response\n * into the {@link HolderModel} data.\n */\nexport type HolderTypeMapper<T extends HolderResponse = HolderResponse> =\n PropertyMapper<T, string>;\n\n/**\n * Mapping function that maps additional data from holder service response\n * into the {@link HolderModel} data.\n */\nexport type HolderDataMapper<\n AdditionalData extends object = Record<string, any>,\n HolderData extends HolderResponse = HolderResponse\n> = DataMapper<HolderData, AdditionalData, any>;\n\nexport type GroupBeverageResponse = BeverageResponse & { groupId: string };\nexport type AvailabilityDataMapper<\n AdditionalData extends object = Record<string, any>,\n AvailabilityData extends GroupBeverageResponse = GroupBeverageResponse\n> = DataMapper<AvailabilityData, AdditionalData, any>;\n\nexport type SelectedPourableMapper = DataMapper<SelectedPourable, any>;\n\nexport type BoardDataMapper<\n AdditionalData extends object = Record<string, any>,\n BoardData extends AssemblyTypes.AssemblyBoard<any> = AssemblyTypes.AssemblyBoard<any>\n> = DataMapper<BoardData, AdditionalData, any>;\n\nexport type AssemblyMapper<\n AdditionalData extends object = Record<string, any>,\n AssemblyResponseData extends AssemblyTypes.AssemblyResponse<any> = AssemblyTypes.AssemblyResponse<any>\n> = DataMapper<AssemblyResponseData, AdditionalData, any>;\n/**\n * The DispenseExtensionManager is responsible for managing the extension points that are specific to the Dispense application.\n */\nexport class DispenseExtensionManager {\n core: CoreExtensionManager = new CoreExtensionManager();\n /**\n * Maps data into the {@link IngredientModel}\n *\n * It is common for the ingredient data provided by the ingredient service to be augmented with additional properties that are\n * not provided by the base KOS Ingredient model. The {@link IngredientMapper} extension point allows for the data to be mapped\n * into the {@link IngredientModel} and the {@link IngredientModel.data} property to be augmented with additional properties.\n *\n * @example\n * The following example shows how to map the data from the service response into the {@link IngredientModel}.\n * The context is provided by the {@link IngredientLoader} extension point with its data being used to optionally augment the\n * ingredient data.\n *\n * The result of the mapping will be available in the `data` property of the {@link IngredientModel}.\n *\n * In this case the `IngedientReponseData` interface represents the data being returned by the ingredient service and the\n * `IngredientData` interface represents the data that will be available in the {@link IngredientModel.data} property. The `ingredientDataMapper`\n * is responsible for mapping from one format to the other.\n *\n * ```typescript\n *\n * interface IngredientResponseData extends NozzleServices.IngredientResponse {\n * chilled: boolean;\n * carbonated: boolean;\n * highYield: boolean;\n * }\n *\n * interface IngredientData {\n * chilled: boolean;\n * carbonated: boolean;\n * highYield: boolean;\n * }\n *\n * export const ingredientDataMapper = async (\n * data: IngredientResponseData,\n * context: IngredientContext\n * ): Promise<IngredientData> => {\n * return {\n * chilled: data.chilled,\n * carbonated: data.carbonated,\n * highYield: data.highYield,\n * }\n * }\n * ```\n * */\n registerIngredientDataMapper(ingredientDataMapper: IngredientDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.IngredientMapper,\n ingredientDataMapper\n );\n\n return this;\n }\n\n /**\n * Loads data that will be provided as context into the {@link IngredientMapper}\n *\n * @example\n * The following example shows how to load the brandset data, normalize it into a map and then provide it back to the framework\n * where it can be used by the other extension points.\n *\n * In the ingredient container model, the data is provided to the {@link IngredientMapper} extension point in order to augment ingredient data\n * and also loaded into the ingredient container model context in order to make the data available throughout the code.\n *\n * ```typescript\n * export const ingredientContextLoader = async (): Promise<BeverageContext> => {\n * const response = await kosFetch('kos:/system/some/ingredient/endpoint.json');\n *\n * if (response.status !== 200) {\n * KosLog.error('Failed to load ingredient data');\n * return {};\n * }\n * const json = await response.json();\n * return json;\n * };\n * ```\n * */\n registerIngredientLoader(ingredientLoader: DataLoader) {\n ExtensionManager.loader.registerLoader(\n ExtensionType.IngredientLoader,\n ingredientLoader\n );\n return this;\n }\n\n registerIngredientIndex(ingredientIndex: IndexExtension) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.IngredientIndex,\n ingredientIndex\n );\n return this;\n }\n\n /**\n * Registers a data mapper for the {@link IngredientModel}\n * */\n registerIngredientTypeMapper(ingredientTypeMapper: IngredientTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.IngredientTypeMapper,\n ingredientTypeMapper\n );\n return this;\n }\n\n /**\n * Registers a data mapper for the {@link HolderModel} model.\n * @param holderDataMapper - Mapping function that maps additional data from holder service response\n * @returns\n */\n registerHolderDataMapper(holderDataMapper: HolderDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.HolderMapper,\n holderDataMapper\n );\n return this;\n }\n\n registerHolderTypeMapper(holderTypeMapper: HolderTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.HolderTypeMapper,\n holderTypeMapper\n );\n return this;\n }\n\n /**\n * Maps the ingredientId property of the holder into the {@link HolderModel}.\n * If not provided, the ingredientId will assume that the value is mapped from the\n * ingredientId property of the service response.\n * */\n registerHolderIngredientMapper(holderTypeMapper: HolderTypeMapper) {\n ExtensionManager.propertyMapper.registerPropertyMapper(\n ExtensionType.HolderTypeMapper,\n holderTypeMapper\n );\n return this;\n }\n\n registerHolderIndex<T extends HolderModel = HolderModel>(\n holderIndex: IndexExtension<T>\n ) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.HolderIndex,\n holderIndex\n );\n return this;\n }\n\n /**\n * Maps data into the {@link AvailabilityModel}\n *\n * @example\n * The following example shows how to map the data from the service response into the {@link AvailabilityModel}.\n * The context is provided by the {@link AvailabilityLoader} extension point with its data being used to augment the\n * availability data.\n *\n * The result of the mapping will be available in the `data` property of the {@link AvailabilityModel}.\n *\n * ```typescript\n * export const beverageDataMapper = async (\n * data: NozzleServices.BeverageResponse,\n * context: BeverageContext\n * ): Promise<BeverageData> => {\n * const id = data.altId;\n * const iconUrl = encodeURI(\n * `http://localhost:8081/system/brandset/${context?.[id]?.icon}`\n * );\n * const cuiColorCode = context?.[id]?.cuiColorCode\n * ? context?.[id]?.cuiColorCode\n * : '';\n * return { iconUrl, cuiColorCode };\n * };\n * ```\n * */\n registerAvailabilityDataMapper(availabilityMapper: AvailabilityDataMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.AvailabilityMapper,\n availabilityMapper\n );\n return this;\n }\n\n /**\n * Loads data that will be provided as context into the {@link AvailabilityMapper}\n *\n * @example\n * A common use case is to load brandset data that is UI specific and not provided directly by the Java service.\n *\n * The following example shows how to load the brandset data, normalize it into a map and then provide it back to the framework\n * where it can be used by the other extension points.\n *\n * In the nozzle model, the data is provided to the {@link AvailabilityMapper} extension point in order to augment availability data\n * and also loaded into the nozzle model context in order to make the data available throughout the code.\n *\n * ```typescript\n * export const beverageContextLoader = async (): Promise<BeverageContext> => {\n * const response = await kosFetch('kos:/system/brandset/brandset.json');\n *\n * if (response.status !== 200) {\n * KosLog.error('Failed to load beverage data');\n * return {};\n * }\n * const json: BrandsetResponse | null = await response.json();\n * const initialBeverages: Record<string, BrandsetIngredient> = {};\n * const beverages = json?.ingredients?.reduce((acc, beverage) => {\n * acc[beverage.ingredientId] = beverage;\n * return acc;\n * }, initialBeverages);\n * return beverages;\n * };\n * ```\n * */\n registerAvailabilityLoader(availabilityLoader: DataLoader) {\n ExtensionManager.loader.registerLoader(\n ExtensionType.AvailabilityLoader,\n availabilityLoader\n );\n return this;\n }\n\n /**\n * Maps the abstract {@link SelectedPourable} data into a format that is specific to the nozzle.\n * */\n registerSelectedPourableDataMapper(\n selectedPourableMapper: SelectedPourableMapper\n ) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.SelectedPourableMapper,\n selectedPourableMapper\n );\n return this;\n }\n\n /**\n * Maps data into the {@link AssemblyModel} data.\n * Used in cases where the base assembly has been extended with additional properties in the backend. This extension\n * point allows for the data to be mapped into the {@link AssemblyModel} and augmented with additional properties.\n *\n * @example\n *\n * In this example of an implementation of a {@link AssemblyMapper}, the {@link AssemblyResponse} data is mapped into\n * a {@link FreestyleAssembly} object.\n *\n * The {@link FreestyleAssemblyResponse} interface represents the additional data being returned by the assembly service and is\n * merged into the {@link AssemblyResponse} interface.\n *\n * The {@link FreestyleAssembly} interface represents the additional data, beyond the base data set, that will be merged into the {@link AssemblyModel}.\n *\n * The mapper is responsible for mapping from the {@link FreestyleAssemblyResponse} format to the {@link FreestyleAssembly} format.\n * ```typescript\n * import { AssemblyTypes } from \"@kosdev-code/kos-dispense-sdk\";\n * import { DataMapper } from \"@kosdev-code/kos-ui-sdk\";\n *\n * // define the additional data being returned by the assembly service\n * export interface FreestyleAssemblyResponse {\n * iceAgitator?: {\n * name: \"iceAgitator\";\n * path: string;\n * };\n * }\n *\n * // define the additional data structure that will be merged into the assembly model\n * export interface FreestyleAssembly {\n * iceAgitator: {\n * path: string;\n * };\n * carbAgitator: {\n * path: string;\n * };\n * }\n *\n *\n * // define the mapper that will map the data from the service response into the additional data structure\n * // that will be merged into the assembly model.\n * // In this case the mapper is responsible for mapping from the {@link FreestyleAssemblyResponse} format to the {@link FreestyleAssembly} format.\n * export const assemblyDataMapper: DataMapper<\n * AssemblyTypes.AssemblyResponse<FreestyleAssemblyResponse>,\n * FreestyleAssembly\n * > = async (data) => {\n * const response = data.assemblies.reduce((acc, assembly) => {\n * const agitatorKeys = [\"iceAgitator\", \"carbAgitator\"];\n * agitatorKeys.forEach((key) => {\n * const agitator = assembly[key];\n * if (agitator) {\n * acc[key] = agitator;\n * }\n * });\n *\n * return acc;\n * }, {} as FreestyleAssembly);\n * return response;\n * };\n *```\n */\n registerAssemblyDataMapper(assemblyDataMapper: AssemblyMapper) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.AssemblyMapper,\n assemblyDataMapper\n );\n return this;\n }\n\n registerBoardIndex(boardIndex: IndexExtension) {\n ExtensionManager.indexExtension.registerIndexExtension(\n ExtensionType.BoardIndex,\n boardIndex\n );\n return this;\n }\n\n registerBoardDataMapper(boardDataMapper: BoardDataMapper<any, any>) {\n ExtensionManager.dataMapper.registerDataMapper(\n ExtensionType.BoardMapper,\n boardDataMapper\n );\n return this;\n }\n\n registerAssemblyFeatureFlagResolver(\n assemblyFeatureFlagResolver: FlagResolver<AssemblyModel>\n ) {\n ExtensionManager[EXTENSION_FEATURE_FLAG_RESOLVER]?.register(\n ExtensionType.AssemblyFeatureFlags,\n assemblyFeatureFlagResolver\n );\n return this;\n }\n}\n\n/**\n * The KosExtensionManager provides access to the extension points that are provided in the SDK for Dispense applications.\n *\n * The extension points are divided into two categories:\n *\n * @param core - The core extension {@link CoreExtensionManager} points are used to extend the base models that are provided by the SDK.\n * @param dispense - The dispense extension {@link DispenseExtensionManager} points are used to extend the models that are specific to the Dispense SDK.\n */\nexport class KosExtensionManager {\n dispense: DispenseExtensionManager;\n core: CoreExtensionManager;\n constructor() {\n this.dispense = new DispenseExtensionManager();\n this.core = new CoreExtensionManager();\n }\n}\n"],"names":["getFuelGaugeValue","holder","maxVolume","setMaxVolume","useState","_a","remainingVolume","setRemainingVolume","_b","hasMaxVolume","setHasMaxVolume","_c","hasRemainingVolume","setHasRemainingVolume","_d","fillPercent","setFillPercent","hasFuelGuage","setHasFuelGuage","useEffect","disposer","kosAutoEffect","DispenseExtensionManager","__publicField","CoreExtensionManager","ingredientDataMapper","ExtensionManager","ExtensionType","ingredientLoader","ingredientIndex","ingredientTypeMapper","holderDataMapper","holderTypeMapper","holderIndex","availabilityMapper","availabilityLoader","selectedPourableMapper","assemblyDataMapper","boardIndex","boardDataMapper","assemblyFeatureFlagResolver","EXTENSION_FEATURE_FLAG_RESOLVER","KosExtensionManager"],"mappings":"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"}
|