/usr/share/grafana/public/build
{"version":3,"file":"5198.2cd64d4e16a385dd9b91.js","mappings":"8IAGA,MAAMA,EAAa,CAAC,CAAE,SAAAC,CAAS,IACN,gBAA6B,IAAa,CAAE,IAAK,GAAK,UAAW,QAAS,EAAGA,CAAQ,C,qFCC9G,MAAMC,EAAe,CAAC,CAAE,SAAAD,CAAS,IAAM,CACrC,MAAME,KAAS,MAAWC,CAAS,EACnC,OAAuB,gBAA6B,MAAO,CAAE,UAAWD,EAAO,IAAK,EAAGF,CAAQ,CACjG,EACMG,EAAaC,IAAW,CAC5B,QAAM,OAAI,CACR,QAAS,OACT,SAAU,OACV,WAAY,SACZ,IAAKA,EAAM,QAAQ,CAAC,EACpB,UAAWA,EAAM,QAAQ,CAAC,CAC5B,CAAC,CACH,E,iGCZA,MAAMC,EAAkB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAM,IAAM,CACnD,MAAML,KAAS,MAAWM,CAAe,EACzC,OAAuB,gBAA6B,KAAQ,CAAE,GAAGD,EAAO,aAAW,MAAGD,EAAWJ,EAAO,MAAM,CAAE,CAAC,CACnH,EACMM,EAAmBJ,IAAW,CAClC,UAAQ,OAAI,CACV,YAAaA,EAAM,QAAQ,EAAI,CAAC,EAChC,aAAcA,EAAM,QAAQ,EAAI,CAAC,CACnC,CAAC,CACH,E,kuCCLO,MAAMK,EAAM,MACNC,EAAM,MACNC,EAAM,MACNC,EAAK,KACLC,EAAM,MACNC,EAAU,UACVC,EAAK,KACLC,EAAO,OACPC,EAAO,OACPC,EAAO,OACPC,EAAW,WACXC,EAAO,OACPC,EAAM,MACNC,EAAS,SACTC,EAAS,SACTC,EAAQ,QACRC,GAAS,SACTC,GAAQ,QACRC,GAAO,OACPC,GAAQ,QACRC,GAAW,WACXC,GAAS,SACTC,GAAQ,QACRC,GAAK,KACLC,GAAQ,QACRC,GAAK,KACLC,GAAO,OACPC,GAAO,OACPC,GAAO,OACPC,GAAO,OACPC,GAAQ,QACRC,GAAM,MACNC,GAAO,OACPC,GAAK,KACLC,GAAK,KACLC,GAAQ,QACRC,GAAQ,QACRC,GAAS,SACTC,GAAS,SACTC,GAAO,OACPC,GAAO,OACPC,GAAO,OACPC,GAAO,OACPC,GAAQ,QACRC,GAAO,OACPC,GAAQ,QACRC,GAAO,OAEPC,GAAW,CACtB/C,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,EACaE,GAAwB,CAAChD,EAAKU,CAAQ,EAEtCuC,GAAe,CAAC,GAAGF,GAAU,GAAGC,EAAqB,EAGrDE,GAAsB,CACjC,MACA,YACA,wBACA,oBACA,YACA,MACA,UACA,SACA,UACA,uBACA,gBACA,WACA,UACA,eACA,cACA,QACA,WACA,mBACA,YACA,aACA,QACA,QACA,cACA,WACA,cACA,oBACA,iBACA,gBACA,WACA,OACA,aACA,MACA,SACA,OACA,SACA,MACA,SACA,OACA,aACA,oBACA,YACA,YACA,aACA,iBACA,UACA,aACA,WACA,WACA,WACA,WACA,OACA,MACA,SACA,aACA,cACA,MACA,UACA,UACA,UACA,WACA,UACF,EACaC,GAAkB,CAC7B,QACA,eACA,gBACA,iBACA,iBACA,eACA,eACA,kBACA,aACA,YACA,YACA,iBACA,gBACA,eACA,eACA,cACA,iBACA,aACA,UACA,MACA,WACA,UACA,QACA,YACF,EACaC,GAAwB,CAAC,WAAY,KAAM,SAAU,QAAS,SAAU,MAAO,MAAM,EACrFC,GAAuB,CAClC,SACA,SACA,UACA,OACA,OACA,UACA,SACA,QACA,MACA,WACA,SACA,YACA,SACF,EACaC,GAA+B,CAC1C,aACA,mBACA,UACA,eACA,oBACA,mBACA,WACA,YACA,cACA,sBACA,YACA,WACA,aACA,UACA,WACA,WACA,MACA,aACA,YACA,YACA,UACA,gBACA,qBACA,OACA,WACA,iBACA,iBACA,YACA,mBACA,gBACA,iBACA,qBACA,qBACA,mBACA,SACA,QACA,iBACA,WACA,MACA,UACA,SACA,iBACA,mBACA,mBACA,oBACA,UACA,eACA,mBACA,mBACA,oBACA,mBACA,QACA,mBACA,YACA,cACA,cACA,eACA,iBACA,UACA,aACA,SACA,cACA,MACF,EACaC,GAAiB,CAC5B,YACA,kBACA,oBACA,mBACA,aACA,iBACA,SACF,EACaC,GAAyB,CACpC,MACA,OACA,QACA,OACA,QACA,OACA,QACA,QACA,MACA,SACA,OACA,OACA,UACA,OACA,MACA,OACA,MACA,MACA,UACA,IACA,MACA,QACA,YACA,QACA,WACA,MACA,QACA,QACA,KACA,MACA,QACA,QACA,OACA,WACA,KACA,OACA,WACA,MACA,QACA,UACA,OACA,QACA,SACA,OACA,QACA,MACA,YACA,OACA,SACA,MACA,OACA,OACA,MACA,OACA,UACA,aACA,eACA,eACA,QACA,cACF,EACaC,GAAsB,CAAC,QAAS,YAAa,SAAU,SAAU,cAAe,OAAO,EACvFC,GAAmB,CAC9B,QACA,SACA,aACA,QACA,OACA,cACA,mBACA,MACA,YACA,WACA,SACA,MACA,SACA,WACA,cACA,gBACA,gBACA,UACA,QACA,QACA,OACA,MACA,SACA,cACA,SACA,QACA,OACA,QACA,aACA,OACA,eACA,UACA,WACA,SACA,eACA,iBACA,qBACA,eACA,iBACA,gBACA,SACA,UACA,QACA,OACA,QACA,YACA,UACA,QACA,QACA,aACA,aACA,SACA,YACA,kBACA,YACA,UACA,YACA,aACA,YACA,OACA,gBACA,gBACA,QACA,WACA,OACF,EACaC,GAAmB,CAC9B,YACA,aACA,MACA,OACA,YACA,QACA,eACA,OACA,YACF,EAEaC,GAAgB,CAC3B,GAAGV,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,GACH,GAAGC,EACL,EAGaE,GAAQ,IACRC,GAAgB,KAChBC,GAAkB,MAClBC,GAAY,KACZC,GAAe,IACfC,GAAqB,KACrBC,GAAY,IACZC,GAAkB,KAElBC,GAAoB,CAACnC,GAAIjC,C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M,CAClE,MAAM0e,EAAOD,EAAO,SAAS,EAC7Bn4B,EAASo4B,CAAI,CACf,CAAC,EAKD,MAAM0B,EAAsB,IAAM,CAChC,MAAMF,EAAeD,EAAa,QAClC,GAAIC,IAAiB,KAAM,CACzB,MAAMG,EAAiB,KAAK,IAAI,IAAK5B,EAAO,iBAAiB,CAAC,EACxD6B,EAAc,KAAK,IAAI,GAAID,CAAc,EAC/CH,EAAa,MAAM,OAAS,GAAGI,CAAW,KAC1CJ,EAAa,MAAM,MAAQ,OAC3B,MAAMK,EAAaL,EAAa,YAChCzB,EAAO,OAAO,CAAE,MAAO8B,EAAY,OAAQD,CAAY,CAAC,CAC1D,CACF,EAEA7B,EAAO,uBAAuB2B,CAAmB,EACjDA,EAAoB,CACtB,EACA,CAAC95B,CAAQ,CACX,EAEA,SACE,OAAC,OAAI,IAAK25B,EACR,mBAACrB,GAAA,GACC,cAAe,CAEb,qBAAsB,GAGtB,SAAU,GACV,YAAa,MACb,oBAAqB,OACrB,UAAW,CACT,SAAU,SACV,WAAY,QACd,EACA,gBAAiB,GACjB,SAAU,KACV,QAAS,CACP,IAAK,CACP,CACF,EACA,SAAU,GAAS,GACnB,MAAOv0B,EACP,OAASxB,GAAU,CACbA,IAAUwB,GACZ/D,EAASuC,CAAK,CAElB,EACA,oBAAsBmX,GACpB0d,GAAiB1d,EAAQ,GAAUjV,EAAW,gCAAgC,EAEhF,iBAAkByzB,CAAA,CACpB,EACF,CAEJ,C,eCjFO,MAAMgC,GAA2B,CACtC,QACA,eACA,MACA,WACA,SACA,aACA,cACA,UACA,OACA,QACA,SACA,MACA,aACA,QACA,QACA,YACA,QACA,MACA,WACA,QACA,QACA,WACA,MACA,UACA,UACA,MACA,WACA,MACA,MACA,QACA,YACA,eACA,wBACA,KACA,MACA,aACA,OACA,QACA,YACA,YACA,UACA,aACA,KACA,OACA,QACA,QACA,SACA,QACA,gBACA,MACA,YACA,MACA,UACA,MACA,SACA,SACA,QACA,cACA,kBACA,UACA,SACA,SACA,MACA,OACA,UACA,OACA,UACA,QACA,SACA,KACA,aACA,OACA,MACA,KACA,OACA,UACA,QACA,OACA,SACA,UACA,cACA,UACA,WACA,OACA,eACA,SACA,OACA,UACA,QACA,KACA,OACA,UACA,SACA,OACA,cACA,YACA,aACA,mBACA,QACA,cACA,QACA,aACA,QACA,aACA,OACA,QACA,QACA,UACA,YACA,KACA,WACA,UACA,YACA,UACA,aACA,SACA,SACA,eACA,UACA,SACA,aACA,WACA,UACA,SACA,eACA,YACA,UACA,aACA,aACA,cACA,cACA,WACA,gBACA,UACA,WACA,UACA,uBACA,OACA,OACA,gBACA,MACA,OACA,QACA,YACA,aACA,SACA,QACA,KACA,OACA,KACA,OACA,YACA,UACA,kBACA,eACA,kCACA,mBACA,eACA,eACA,cACA,iBACA,iBACA,eACA,oBACA,mBACA,mCACA,eACA,UACA,SACA,KACA,QACA,OACA,WACA,YACA,gBACA,OACA,WACA,MACA,OACA,WACA,kBACA,aACA,aACA,OACA,SACA,aACA,MACA,WACA,UACA,UACA,UACA,aACA,WACA,SACA,UACA,MACA,UACA,SACA,aACA,OACA,QACA,QACA,OACA,WACA,aACA,UACA,aACA,gBACA,aACA,cACA,aACA,UACA,WACA,WACA,aACA,OACA,WACA,cACA,cACA,MACA,KACA,WACA,SACA,SACA,OACA,SACA,OACA,OACA,UACA,OACA,OACA,WACA,UACA,OACA,SACA,QACA,UACA,WACA,WACA,aACA,MACA,WACA,SACA,YACA,gBACA,KACA,SACA,QACA,SACA,QACA,aACA,cACA,SACA,UACA,KACA,QACA,SACA,YACA,YACA,OACA,UACA,SACA,OACA,MACA,UACA,WACA,UACA,WACA,QACA,aACA,SACA,QACA,YACA,OACA,aACA,SACA,QACA,QACA,cACA,QACA,SACA,SACA,QACA,MACA,QACA,UACA,SACA,QACA,YACA,OACA,YACA,WACA,gBACA,SACA,OACA,OACA,WACA,WACA,SACA,KACA,UACA,YACA,MACA,OACA,SACA,KACA,OACA,QACA,UACA,QACA,WACA,SACA,KACA,UACA,OACA,UACA,aACA,aACA,UACA,SACA,OACA,gBACA,OACA,WACA,OACA,QACA,mBACA,cACA,cACA,aACA,WACA,cACA,kBACA,KACA,SACA,QACA,YACA,KACA,YACA,eACA,YACA,QACA,YACA,SACA,UACA,UACA,aACA,YACA,WACA,QACA,QACA,QACA,MACA,cACA,SACA,UACA,MACA,OACA,OACA,OACA,OACA,OACA,UACA,cACA,YACA,eACA,WACA,OACA,iBACA,kBACA,KACA,SACA,SACA,YACA,UACA,MACA,OACA,UACA,aACA,gBACA,cACA,cACA,iBACA,aACA,aACA,uBACA,aACA,OACA,MACA,OACA,OACA,WACA,QACA,MACA,WACA,QACA,OACA,aACA,UACA,WACA,KACA,OACA,UACA,QACA,OACA,OACA,QACA,OACA,aACA,QACA,SACA,SACA,QACA,UACA,KACA,OACA,UACA,QACA,SACA,YACA,iBACA,UACA,WACA,OACA,UACA,UACA,WACA,MACA,QACA,UACA,QACA,OACA,WACA,WACA,OACA,QACA,eACA,KACA,QACA,aACA,MACA,cACA,gCACA,QACA,UACA,eACA,kBACA,eACA,OACA,MACA,aACA,UACA,WACA,cACA,QACA,aACA,YACA,aACA,SACA,QACA,SACA,cACA,eACA,YACA,MACA,SACA,UACA,QACA,SACA,UACA,qBACA,gBACA,UACA,QACA,WACA,MACA,OACA,WACA,SACA,SACA,UACA,cACA,aACA,QACA,SACA,UACA,OACA,WACA,QACA,QACA,WACA,UACA,QACA,QACA,KACA,kBACA,MACA,YACA,OACA,UACA,KACA,UACA,UACA,aACA,eACA,OACA,YACA,MACA,UACA,SACA,qBACA,YACA,QACA,OACA,SACA,aACA,QACA,SACA,UACA,WACA,OACA,SACA,UACA,oBACA,eACA,KACA,MACA,UACA,SACA,UACA,MACA,YACA,OACA,KACA,MACA,SACA,OACA,OACA,iBACA,YACA,aACA,UACA,YACA,eACA,WACA,kBACA,SACA,aACA,KACA,QACA,aACA,eACA,MACA,QACA,UACA,SACA,OACA,WACA,UACA,WACA,UACA,MACA,SACA,YACA,aACA,OACA,UACA,YACA,cACA,eACA,WACA,OACA,UACA,UACA,MACA,UACA,aACA,kBACA,kBACA,eACA,SACA,OACA,YACA,YACA,QACA,UACA,OACA,UACA,WACA,iBACA,UACA,QACA,WACA,YACA,SACA,WACA,UACA,WACA,UACA,UACA,QACA,QACA,SACA,UACA,aACA,OACA,YACA,UACA,UACA,eACA,aACA,OACA,MACA,SACA,QACA,YACA,UACA,WACA,QACA,UACA,UACA,YACA,SACA,QACA,UACA,OACA,MACA,OACA,QACA,WACA,aACA,OACA,cACA,YACA,MACA,aACA,cACA,UACA,SACA,YACA,YACA,aACA,iBACA,UACA,aACA,WACA,WACA,WACA,WACA,UACA,SACA,SACA,UACA,cACA,cACA,UACA,UACA,WACA,WACA,UACA,UACA,WACA,SACA,qBACA,SACA,MACA,WACA,SACA,YACA,UACA,aACA,SACA,SACA,QACA,SACA,QACA,OACA,WACA,cACA,SACA,gBACA,aACA,cACA,kBACA,kBACA,gBACA,WACA,UACA,MACA,WACA,aACA,QACA,SACA,OACA,SACA,aACA,OACA,MACA,UACA,SACA,WACA,OACA,YACA,SACA,UACA,QACA,aACA,SACA,SACA,SACA,UACA,qBACA,SACA,UACA,WACA,gBACA,OACA,MACA,SACA,yBACA,iCACA,0BACA,YACA,YACA,WACA,UACA,eACA,MACA,aACA,OACA,cACA,UACA,QACA,OACA,WACA,SACA,UACA,SACA,MACA,OACA,OACA,OACA,OACA,WACA,OACA,UACA,SACA,QACA,UACA,WACA,eACA,QACA,MACA,eACA,WACA,UACA,aACA,iBACA,sBACA,mBACA,OACA,KACA,MACA,WACA,QACA,WACA,UACA,OACA,QACA,YACA,SACA,aACA,OACA,aACA,cACA,WACA,WACA,SACA,SACA,gBACA,YACA,YACA,QACA,cACA,aACA,SACA,SACA,YACA,kBACA,WACA,aACA,MACA,UACA,UACA,YACA,UACA,UACA,SACA,cACA,cACA,eACA,QACA,cACA,aACA,MACA,OACA,SACA,YACA,YACA,aACA,WACA,OACA,OACA,YACA,OACA,YACA,gBACA,kBACA,WACA,UACA,WACA,QACA,KACA,MACA,QACA,WACA,OACA,cACA,YACA,gBACA,kBACA,cACA,QACA,UACA,OACA,aACA,OACA,WACA,cACA,UACA,OACA,KACA,UACA,MACA,YACA,QACA,OACA,QACA,SACA,UACA,SACA,SACA,UACA,WACA,QACA,MACA,SACA,aACA,QACA,YACA,QACA,MACA,OACA,QACA,WACA,WACA,gBACA,WACA,YACA,QACA,SACA,WACA,YACA,UACA,UACA,WACA,eACA,aACA,WACA,WACA,UACA,UACA,UACA,WACA,OACA,UACA,aACA,OACA,UACA,WACA,UACA,OACA,UACA,OACA,WACA,QACA,QACA,eACA,SACA,OACA,SACA,eACA,UACA,MACA,OACA,QACA,YACA,UACA,YACA,gBACA,MACA,OACA,QACA,aACA,WACA,aACA,MACF,ECx4BMC,GAAsBvrB,GAA2C,CAAC,EAAEA,GAAaA,IAAc,OAEtF,MAAMwrB,EAAa,CAChC,YAAoBrlB,KAA2B,MAAe,EAAG,CAA7C,iBAAAA,CAA8C,CAElE,qBACE,CAAE,OAAAslB,EAAQ,KAAArV,EAAM,MAAAsV,EAAO,QAAAC,EAAS,QAAAC,EAAS,iBAAAC,EAAkB,MAAAnV,CAAM,EACjE1W,EACoB,CACpB,GAAI,CAACoW,GAAQ,CAACqV,GAAQ,MAAQ,CAACA,GAAQ,YAAY,OACjD,OAGF,IAAIK,EAAkB,CAAC,EACvB,YAAK,aAAaL,EAAQK,CAAK,EAC/B,KAAK,WAAW1V,EAAM0V,CAAK,EAC3B,KAAK,gBAAgBA,EAAO9rB,CAAS,EACrC,KAAK,YAAY0rB,EAAOI,EAAO,GAAMJ,GAAO,aAAa,QAAU,EAAG1rB,CAAS,EAC/E,KAAK,cAAc2rB,EAASG,CAAK,EACjC,KAAK,cAAcF,EAASC,EAAkBC,CAAK,E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","sources":["webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorRows.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorHeader.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/AccessoryButton.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs-sql/language.ts","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorList.js","webpack://grafana/./node_modules/rxjs/dist/esm5/internal/operators/repeat.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorRow.js","webpack://grafana/./node_modules/rxjs/dist/esm5/internal/util/argsOrArgArray.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/FlexItem.js","webpack://grafana/./node_modules/rxjs/dist/esm5/internal/observable/zip.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/logs/language.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/guards.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/migrations/metricQueryMigrations.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/utils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/tracking.ts","webpack://grafana/./node_modules/common-tags/es/TemplateTag/TemplateTag.js","webpack://grafana/./node_modules/common-tags/es/inlineArrayTransformer/inlineArrayTransformer.js","webpack://grafana/./node_modules/common-tags/es/stripIndentTransformer/stripIndentTransformer.js","webpack://grafana/./node_modules/common-tags/es/trimResultTransformer/trimResultTransformer.js","webpack://grafana/./node_modules/common-tags/es/commaLists/commaLists.js","webpack://grafana/./node_modules/common-tags/es/commaListsAnd/commaListsAnd.js","webpack://grafana/./node_modules/common-tags/es/commaListsOr/commaListsOr.js","webpack://grafana/./node_modules/common-tags/es/splitStringTransformer/splitStringTransformer.js","webpack://grafana/./node_modules/common-tags/es/removeNonPrintingValuesTransformer/removeNonPrintingValuesTransformer.js","webpack://grafana/./node_modules/common-tags/es/html/html.js","webpack://grafana/./node_modules/common-tags/es/replaceSubstitutionTransformer/replaceSubstitutionTransformer.js","webpack://grafana/./node_modules/common-tags/es/safeHtml/safeHtml.js","webpack://grafana/./node_modules/common-tags/es/replaceResultTransformer/replaceResultTransformer.js","webpack://grafana/./node_modules/common-tags/es/oneLine/oneLine.js","webpack://grafana/./node_modules/common-tags/es/oneLineTrim/oneLineTrim.js","webpack://grafana/./node_modules/common-tags/es/oneLineCommaLists/oneLineCommaLists.js","webpack://grafana/./node_modules/common-tags/es/oneLineCommaListsOr/oneLineCommaListsOr.js","webpack://grafana/./node_modules/common-tags/es/oneLineCommaListsAnd/oneLineCommaListsAnd.js","webpack://grafana/./node_modules/common-tags/es/inlineLists/inlineLists.js","webpack://grafana/./node_modules/common-tags/es/oneLineInlineLists/oneLineInlineLists.js","webpack://grafana/./node_modules/common-tags/es/stripIndent/stripIndent.js","webpack://grafana/./node_modules/common-tags/es/stripIndents/stripIndents.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/CheatSheet/sampleQueries.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs/syntax.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/CheatSheet/tokenizer.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/CheatSheet/LogsCheatSheet.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/hooks.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/standardStatistics.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/Account.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/defaultQueries.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/annotationSupport.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/templateVariableUtils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/utils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs/CloudWatchLogsLanguageProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/monarch/LinkedToken.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/monarch/linkedTokenBuilder.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/monarch/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/monarch/CompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/monarch/commands.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs-sql/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs-sql/completion/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs-sql/completion/statementPosition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs-sql/completion/suggestionKind.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-logs-sql/completion/CompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-ppl/tokenTypes.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-ppl/completion/statementPosition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-ppl/completion/suggestionKinds.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-ppl/completion/PPLCompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/completion/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/completion/statementPosition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/completion/suggestionKind.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/completion/tokenUtils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/completion/CompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/logs/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/logs/completion/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/logs/completion/statementPosition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/logs/completion/suggestionKinds.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/logs/completion/CompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/metric-math/completion/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/metric-math/completion/statementPosition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/metric-math/completion/suggestionKind.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/metric-math/completion/CompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/memoizedDebounce.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchRequest.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchAnnotationQueryRunner.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/aws_url.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/datalinks.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/logsRetry.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/rxjs/increasingInterval.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchLogsQueryRunner.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/Errors/ThrottlingErrorMessage.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/resources/ResourcesAPI.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/styles.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableTextField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/variables.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/datasource.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupSelector.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupNamesSelection.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ConfigEditor/SecureSocksProxySettingsNewStyling.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ConfigEditor/XrayLinkConfig.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetaInspector/MetaInspector.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/migrations/useMigratedQuery.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsAnomaliesQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/monarch/register.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/query/getStatsGroups.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-ppl/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/code-editors/PPLQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/code-editors/LogsQLCodeEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/code-editors/SQLCodeEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/migrations/useMigratedMetricsQuery.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/dynamic-labels/CompletionItemProvider.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/dynamic-labels/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/DynamicLabelsField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/metric-math/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MathExpressionQueryField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/consts.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/utils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLFilter.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLOrderByGroup.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLCodeEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/module.tsx","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorStack.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/metric-math/language.ts","webpack://grafana/./node_modules/jsurl/index.js","webpack://grafana/./node_modules/jsurl/lib/jsurl.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/language.ts","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/InputGroup.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorFieldGroup.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/InlineSelect.js","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/QueryEditor/EditorSwitch.js","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/dynamic-labels/language.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/language/cloudwatch-ppl/language.ts"],"sourcesContent":["import React__default from 'react';\nimport { EditorStack } from './EditorStack.js';\n\nconst EditorRows = ({ children }) => {\n return /* @__PURE__ */ React__default.createElement(EditorStack, { gap: 0.5, direction: \"column\" }, children);\n};\n\nexport { EditorRows };\n//# sourceMappingURL=EditorRows.js.map\n","import { css } from '@emotion/css';\nimport React__default from 'react';\nimport '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nconst EditorHeader = ({ children }) => {\n const styles = useStyles2(getStyles);\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.root }, children);\n};\nconst getStyles = (theme) => ({\n root: css({\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: theme.spacing(3),\n minHeight: theme.spacing(4)\n })\n});\n\nexport { EditorHeader };\n//# sourceMappingURL=EditorHeader.js.map\n","import { cx, css } from '@emotion/css';\nimport React__default from 'react';\nimport '@grafana/data';\nimport { useStyles2, Button } from '@grafana/ui';\n\nconst AccessoryButton = ({ className, ...props }) => {\n const styles = useStyles2(getButtonStyles);\n return /* @__PURE__ */ React__default.createElement(Button, { ...props, className: cx(className, styles.button) });\n};\nconst getButtonStyles = (theme) => ({\n button: css({\n paddingLeft: theme.spacing(3 / 2),\n paddingRight: theme.spacing(3 / 2)\n })\n});\n\nexport { AccessoryButton };\n//# sourceMappingURL=AccessoryButton.js.map\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\ninterface CloudWatchLanguage extends monacoType.languages.IMonarchLanguage {\n keywords: string[];\n operators: string[];\n builtinFunctions: string[];\n}\n\n/* KEYWORDS */\nexport const ALL = 'ALL';\nexport const AND = 'AND';\nexport const ANY = 'ANY';\nexport const AS = 'AS';\nexport const ASC = 'ASC';\nexport const BETWEEN = 'BETWEEN';\nexport const BY = 'BY';\nexport const CASE = 'CASE';\nexport const CUBE = 'CUBE';\nexport const DESC = 'DESC';\nexport const DISTINCT = 'DISTINCT';\nexport const ELSE = 'ELSE';\nexport const END = 'END';\nexport const ESCAPE = 'ESCAPE';\nexport const EXISTS = 'EXISTS';\nexport const FALSE = 'FALSE';\nexport const FILTER = 'FILTER';\nexport const FIRST = 'FIRST';\nexport const FROM = 'FROM';\nexport const GROUP = 'GROUP';\nexport const GROUPING = 'GROUPING';\nexport const HAVING = 'HAVING';\nexport const ILIKE = 'ILIKE';\nexport const IN = 'IN';\nexport const INNER = 'INNER';\nexport const IS = 'IS';\nexport const JOIN = 'JOIN';\nexport const LAST = 'LAST';\nexport const LEFT = 'LEFT';\nexport const LIKE = 'LIKE';\nexport const LIMIT = 'LIMIT';\nexport const NOT = 'NOT';\nexport const NULL = 'NULL';\nexport const ON = 'ON';\nexport const OR = 'OR';\nexport const ORDER = 'ORDER';\nexport const OUTER = 'OUTER';\nexport const ROLLUP = 'ROLLUP';\nexport const SELECT = 'SELECT';\nexport const SETS = 'SETS';\nexport const SOME = 'SOME';\nexport const THEN = 'THEN';\nexport const TRUE = 'TRUE';\nexport const USING = 'USING';\nexport const WHEN = 'WHEN';\nexport const WHERE = 'WHERE';\nexport const WITH = 'WITH';\n\nexport const KEYWORDS = [\n ALL,\n AND,\n ANY,\n AS,\n ASC,\n BETWEEN,\n BY,\n CASE,\n CUBE,\n DESC,\n DISTINCT,\n ELSE,\n END,\n ESCAPE,\n EXISTS,\n FALSE,\n FILTER,\n FIRST,\n FROM,\n GROUP,\n GROUPING,\n HAVING,\n ILIKE,\n IN,\n INNER,\n IS,\n JOIN,\n LAST,\n LEFT,\n LIKE,\n LIMIT,\n NOT,\n NULL,\n ON,\n OR,\n ORDER,\n OUTER,\n ROLLUP,\n SELECT,\n SETS,\n SOME,\n THEN,\n TRUE,\n USING,\n WHEN,\n WHERE,\n WITH,\n];\nexport const AFTER_SELECT_KEYWORDS = [ALL, DISTINCT];\n\nexport const ALL_KEYWORDS = [...KEYWORDS, ...AFTER_SELECT_KEYWORDS];\n\n/* FUNCTIONS */\nexport const AGGREGATE_FUNCTIONS = [\n 'any',\n 'any_value',\n 'approx_count_distinct',\n 'approx_percentile',\n 'array_agg',\n 'avg',\n 'bit_and',\n 'bit_or',\n 'bit_xor',\n 'bitmap_construct_agg',\n 'bitmap_or_agg',\n 'bool_and',\n 'bool_or',\n 'collect_list',\n 'collect_set',\n 'count',\n 'count_if',\n 'count_min_sketch',\n 'covar_pop',\n 'covar_samp',\n 'every',\n 'first',\n 'first_value',\n 'grouping',\n 'grouping_id',\n 'histogram_numeric',\n 'hll_sketch_agg',\n 'hll_union_agg',\n 'kurtosis',\n 'last',\n 'last_value',\n 'max',\n 'max_by',\n 'mean',\n 'median',\n 'min',\n 'min_by',\n 'mode',\n 'percentile',\n 'percentile_approx',\n 'regr_avgx',\n 'regr_avgy',\n 'regr_count',\n 'regr_intercept',\n 'regr_r2',\n 'regr_slope',\n 'regr_sxx',\n 'regr_sxy',\n 'regr_syy',\n 'skewness',\n 'some',\n 'std',\n 'stddev',\n 'stddev_pop',\n 'stddev_samp',\n 'sum',\n 'try_avg',\n 'try_sum',\n 'var_pop',\n 'var_samp',\n 'variance',\n];\nexport const ARRAY_FUNCTIONS = [\n 'array',\n 'array_append',\n 'array_compact',\n 'array_contains',\n 'array_distinct',\n 'array_except',\n 'array_insert',\n 'array_intersect',\n 'array_join',\n 'array_max',\n 'array_min',\n 'array_position',\n 'array_prepend',\n 'array_remove',\n 'array_repeat',\n 'array_union',\n 'arrays_overlap',\n 'arrays_zip',\n 'flatten',\n 'get',\n 'sequence',\n 'shuffle',\n 'slice',\n 'sort_array',\n];\nexport const CONDITIONAL_FUNCTIONS = ['coalesce', 'if', 'ifnull', 'nanvl', 'nullif', 'nvl', 'nvl2'];\nexport const CONVERSION_FUNCTIONS = [\n 'bigint',\n 'binary',\n 'boolean',\n 'cast',\n 'date',\n 'decimal',\n 'double',\n 'float',\n 'int',\n 'smallint',\n 'string',\n 'timestamp',\n 'tinyint',\n];\nexport const DATE_AND_TIMESTAMP_FUNCTIONS = [\n 'add_months',\n 'convert_timezone',\n 'curdate',\n 'current_date',\n 'current_timestamp',\n 'current_timezone',\n 'date_add',\n 'date_diff',\n 'date_format',\n 'date_from_unix_date',\n 'date_part',\n 'date_sub',\n 'date_trunc',\n 'dateadd',\n 'datediff',\n 'datepart',\n 'day',\n 'dayofmonth',\n 'dayofweek',\n 'dayofyear',\n 'extract',\n 'from_unixtime',\n 'from_utc_timestamp',\n 'hour',\n 'last_day',\n 'localtimestamp',\n 'localtimestamp',\n 'make_date',\n 'make_dt_interval',\n 'make_interval',\n 'make_timestamp',\n 'make_timestamp_ltz',\n 'make_timestamp_ntz',\n 'make_ym_interval',\n 'minute',\n 'month',\n 'months_between',\n 'next_day',\n 'now',\n 'quarter',\n 'second',\n 'session_window',\n 'timestamp_micros',\n 'timestamp_millis',\n 'timestamp_seconds',\n 'to_date',\n 'to_timestamp',\n 'to_timestamp_ltz',\n 'to_timestamp_ntz',\n 'to_unix_timestamp',\n 'to_utc_timestamp',\n 'trunc',\n 'try_to_timestamp',\n 'unix_date',\n 'unix_micros',\n 'unix_millis',\n 'unix_seconds',\n 'unix_timestamp',\n 'weekday',\n 'weekofyear',\n 'window',\n 'window_time',\n 'year',\n];\nexport const JSON_FUNCTIONS = [\n 'from_json',\n 'get_json_object',\n 'json_array_length',\n 'json_object_keys',\n 'json_tuple',\n 'schema_of_json',\n 'to_json',\n];\nexport const MATHEMATICAL_FUNCTIONS = [\n 'abs',\n 'acos',\n 'acosh',\n 'asin',\n 'asinh',\n 'atan',\n 'atan2',\n 'atanh',\n 'bin',\n 'bround',\n 'cbrt',\n 'ceil',\n 'ceiling',\n 'conv',\n 'cos',\n 'cosh',\n 'cot',\n 'csc',\n 'degrees',\n 'e',\n 'exp',\n 'expm1',\n 'factorial',\n 'floor',\n 'greatest',\n 'hex',\n 'hypot',\n 'least',\n 'ln',\n 'log',\n 'log10',\n 'log1p',\n 'log2',\n 'negative',\n 'pi',\n 'pmod',\n 'positive',\n 'pow',\n 'power',\n 'radians',\n 'rand',\n 'randn',\n 'random',\n 'rint',\n 'round',\n 'sec',\n 'shiftleft',\n 'sign',\n 'signum',\n 'sin',\n 'sinh',\n 'sqrt',\n 'tan',\n 'tanh',\n 'try_add',\n 'try_divide',\n 'try_multiply',\n 'try_subtract',\n 'unhex',\n 'width_bucket',\n];\nexport const PREDICATE_FUNCTIONS = ['isnan', 'isnotnull', 'isnull', 'regexp', 'regexp_like', 'rlike'];\nexport const STRING_FUNCTIONS = [\n 'ascii',\n 'base64',\n 'bit_length',\n 'btrim',\n 'char',\n 'char_length',\n 'character_length',\n 'chr',\n 'concat_ws',\n 'contains',\n 'decode',\n 'elt',\n 'encode',\n 'endswith',\n 'find_in_set',\n 'format_number',\n 'format_string',\n 'initcap',\n 'instr',\n 'lcase',\n 'left',\n 'len',\n 'length',\n 'levenshtein',\n 'locate',\n 'lower',\n 'lpad',\n 'ltrim',\n 'luhn_check',\n 'mask',\n 'octet_length',\n 'overlay',\n 'position',\n 'printf',\n 'regexp_count',\n 'regexp_extract',\n 'regexp_extract_all',\n 'regexp_instr',\n 'regexp_replace',\n 'regexp_substr',\n 'repeat',\n 'replace',\n 'right',\n 'rpad',\n 'rtrim',\n 'sentences',\n 'soundex',\n 'space',\n 'split',\n 'split_part',\n 'startswith',\n 'substr',\n 'substring',\n 'substring_index',\n 'to_binary',\n 'to_char',\n 'to_number',\n 'to_varchar',\n 'translate',\n 'trim',\n 'try_to_binary',\n 'try_to_number',\n 'ucase',\n 'unbase64',\n 'upper',\n];\nexport const WINDOW_FUNCTIONS = [\n 'cume_dist',\n 'dense_rank',\n 'lag',\n 'lead',\n 'nth_value',\n 'ntile',\n 'percent_rank',\n 'rank',\n 'row_number',\n];\n\nexport const ALL_FUNCTIONS = [\n ...AGGREGATE_FUNCTIONS,\n ...ARRAY_FUNCTIONS,\n ...CONDITIONAL_FUNCTIONS,\n ...CONVERSION_FUNCTIONS,\n ...DATE_AND_TIMESTAMP_FUNCTIONS,\n ...JSON_FUNCTIONS,\n ...MATHEMATICAL_FUNCTIONS,\n ...PREDICATE_FUNCTIONS,\n ...STRING_FUNCTIONS,\n ...WINDOW_FUNCTIONS,\n];\n\n/* OPERATORS */\nexport const EQUAL = '=';\nexport const DOUBLE_EQUALS = '==';\nexport const NULL_SAFE_EQUAL = '<=>';\nexport const NOT_EQUAL = '!=';\nexport const GREATER_THAN = '>';\nexport const GREATER_THAN_EQUAL = '>=';\nexport const LESS_THAN = '<';\nexport const LESS_THAN_EQUAL = '<=';\n\nexport const LOGICAL_OPERATORS = [OR, AND];\nexport const MATH_OPERATORS = ['*', '/', '+', '-', '%', 'div', 'mod'];\nexport const PREDICATE_OPERATORS = [\n NOT,\n IS,\n EQUAL,\n DOUBLE_EQUALS,\n NULL_SAFE_EQUAL,\n NOT_EQUAL,\n GREATER_THAN,\n GREATER_THAN_EQUAL,\n LESS_THAN,\n LESS_THAN_EQUAL,\n LIKE,\n ILIKE,\n IN,\n];\n\nexport const ALL_OPERATORS = [...MATH_OPERATORS, ...LOGICAL_OPERATORS, ...PREDICATE_OPERATORS];\n\nexport const language: CloudWatchLanguage = {\n defaultToken: '',\n ignoreCase: true,\n brackets: [\n { open: '[', close: ']', token: 'delimiter.square' },\n { open: '(', close: ')', token: 'delimiter.parenthesis' },\n { open: '{', close: '}', token: 'delimiter.curly' },\n ],\n keywords: ALL_KEYWORDS,\n operators: ALL_OPERATORS,\n builtinFunctions: ALL_FUNCTIONS,\n tokenizer: {\n root: [\n { include: '@comments' },\n { include: '@whitespace' },\n { include: '@customParams' },\n { include: '@numbers' },\n { include: '@binaries' },\n { include: '@strings' },\n { include: '@strings' },\n { include: '@complexIdentifiers' },\n [/[;,.]/, 'delimiter'],\n [/[\\(\\)\\[\\]\\{\\}]/, '@brackets'],\n [\n /[\\w@#$]+/,\n {\n cases: {\n '@operators': 'operator',\n '@builtinFunctions': 'predefined',\n '@keywords': 'keyword',\n '@default': 'identifier',\n },\n },\n ],\n [/[<>=!%&+\\-*/|~^]/, 'operator'],\n ],\n whitespace: [[/[\\s\\t\\r\\n]+/, 'white']],\n comments: [\n [/--+.*/, 'comment'],\n [/\\/\\*/, { token: 'comment.quote', next: '@comment' }],\n ],\n comment: [\n [/[^*/]+/, 'comment'],\n [/\\*\\//, { token: 'comment.quote', next: '@pop' }],\n [/./, 'comment'],\n ],\n customParams: [\n [/\\${[A-Za-z0-9._-]*}/, 'variable'],\n [/\\@\\@{[A-Za-z0-9._-]*}/, 'variable'],\n ],\n numbers: [\n [/0[xX][0-9a-fA-F]*/, 'number'],\n [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n ],\n binaries: [\n [/X'/i, { token: 'binary', next: '@binarySingle' }],\n [/X\"/i, { token: 'binary', next: '@binaryDouble' }],\n ],\n binarySingle: [\n [/\\d+/, 'binary.escape'],\n [/''/, 'binary'],\n [/'/, { token: 'binary', next: '@pop' }],\n ],\n binaryDouble: [\n [/\\d+/, 'binary.escape'],\n [/\"\"/, 'binary'],\n [/\"/, { token: 'binary', next: '@pop' }],\n ],\n strings: [\n [/'/, { token: 'string', next: '@stringSingle' }],\n [/R'/i, { token: 'string', next: '@stringSingle' }],\n [/\"/, { token: 'string', next: '@stringDouble' }],\n [/R\"/i, { token: 'string', next: '@stringDouble' }],\n ],\n stringSingle: [\n [/[^']+/, 'string.escape'],\n [/''/, 'string'],\n [/'/, { token: 'string', next: '@pop' }],\n ],\n stringDouble: [\n [/[^\"]+/, 'string.escape'],\n [/\"\"/, 'string'],\n [/\"/, { token: 'string', next: '@pop' }],\n ],\n complexIdentifiers: [[/`/, { token: 'identifier', next: '@quotedIdentifier' }]],\n quotedIdentifier: [\n [/[^`]+/, 'identifier'],\n [/``/, 'identifier'],\n [/`/, { token: 'identifier', next: '@pop' }],\n ],\n },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {\n comments: {\n lineComment: '--',\n blockComment: ['/*', '*/'],\n },\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n};\n","import { Button } from '@grafana/ui';\nimport React__default from 'react';\nimport { EditorStack } from './EditorStack.js';\n\nconst EditorList = React__default.forwardRef(function EditorList2({ items, renderItem, onChange }, ref) {\n const onAddItem = () => {\n const newItems = [...items, {}];\n onChange(newItems);\n };\n const onChangeItem = (itemIndex, newItem) => {\n const newItems = [...items];\n newItems[itemIndex] = newItem;\n onChange(newItems);\n };\n const onDeleteItem = (itemIndex) => {\n const newItems = [...items];\n newItems.splice(itemIndex, 1);\n onChange(newItems);\n };\n return /* @__PURE__ */ React__default.createElement(EditorStack, null, items.map((item, index) => /* @__PURE__ */ React__default.createElement(\"div\", { key: index }, renderItem(\n item,\n (newItem) => onChangeItem(index, newItem),\n () => onDeleteItem(index)\n ))), /* @__PURE__ */ React__default.createElement(Button, { ref, onClick: onAddItem, variant: \"secondary\", size: \"md\", icon: \"plus\", \"aria-label\": \"Add\", type: \"button\" }));\n});\n\nexport { EditorList };\n//# sourceMappingURL=EditorList.js.map\n","import { EMPTY } from '../observable/empty';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { innerFrom } from '../observable/innerFrom';\nimport { timer } from '../observable/timer';\nexport function repeat(countOrConfig) {\n var _a;\n var count = Infinity;\n var delay;\n if (countOrConfig != null) {\n if (typeof countOrConfig === 'object') {\n (_a = countOrConfig.count, count = _a === void 0 ? Infinity : _a, delay = countOrConfig.delay);\n }\n else {\n count = countOrConfig;\n }\n }\n return count <= 0\n ? function () { return EMPTY; }\n : operate(function (source, subscriber) {\n var soFar = 0;\n var sourceSub;\n var resubscribe = function () {\n sourceSub === null || sourceSub === void 0 ? void 0 : sourceSub.unsubscribe();\n sourceSub = null;\n if (delay != null) {\n var notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(soFar));\n var notifierSubscriber_1 = createOperatorSubscriber(subscriber, function () {\n notifierSubscriber_1.unsubscribe();\n subscribeToSource();\n });\n notifier.subscribe(notifierSubscriber_1);\n }\n else {\n subscribeToSource();\n }\n };\n var subscribeToSource = function () {\n var syncUnsub = false;\n sourceSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, function () {\n if (++soFar < count) {\n if (sourceSub) {\n resubscribe();\n }\n else {\n syncUnsub = true;\n }\n }\n else {\n subscriber.complete();\n }\n }));\n if (syncUnsub) {\n resubscribe();\n }\n };\n subscribeToSource();\n });\n}\n//# sourceMappingURL=repeat.js.map","import { css } from '@emotion/css';\nimport React__default from 'react';\nimport '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { EditorStack } from './EditorStack.js';\n\nconst EditorRow = ({ children }) => {\n const styles = useStyles2(getStyles);\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.root }, /* @__PURE__ */ React__default.createElement(EditorStack, { gap: 2 }, children));\n};\nconst getStyles = (theme) => {\n return {\n root: css({\n padding: theme.spacing(1),\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default\n })\n };\n};\n\nexport { EditorRow };\n//# sourceMappingURL=EditorRow.js.map\n","var isArray = Array.isArray;\nexport function argsOrArgArray(args) {\n return args.length === 1 && isArray(args[0]) ? args[0] : args;\n}\n//# sourceMappingURL=argsOrArgArray.js.map","import React__default from 'react';\n\nconst FlexItem = ({ grow, shrink }) => {\n return /* @__PURE__ */ React__default.createElement(\"div\", { style: { display: \"block\", flexGrow: grow, flexShrink: shrink } });\n};\n\nexport { FlexItem };\n//# sourceMappingURL=FlexItem.js.map\n","import { __read, __spreadArray } from \"tslib\";\nimport { Observable } from '../Observable';\nimport { innerFrom } from './innerFrom';\nimport { argsOrArgArray } from '../util/argsOrArgArray';\nimport { EMPTY } from './empty';\nimport { createOperatorSubscriber } from '../operators/OperatorSubscriber';\nimport { popResultSelector } from '../util/args';\nexport function zip() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var resultSelector = popResultSelector(args);\n var sources = argsOrArgArray(args);\n return sources.length\n ? new Observable(function (subscriber) {\n var buffers = sources.map(function () { return []; });\n var completed = sources.map(function () { return false; });\n subscriber.add(function () {\n buffers = completed = null;\n });\n var _loop_1 = function (sourceIndex) {\n innerFrom(sources[sourceIndex]).subscribe(createOperatorSubscriber(subscriber, function (value) {\n buffers[sourceIndex].push(value);\n if (buffers.every(function (buffer) { return buffer.length; })) {\n var result = buffers.map(function (buffer) { return buffer.shift(); });\n subscriber.next(resultSelector ? resultSelector.apply(void 0, __spreadArray([], __read(result))) : result);\n if (buffers.some(function (buffer, i) { return !buffer.length && completed[i]; })) {\n subscriber.complete();\n }\n }\n }, function () {\n completed[sourceIndex] = true;\n !buffers[sourceIndex].length && subscriber.complete();\n }));\n };\n for (var sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {\n _loop_1(sourceIndex);\n }\n return function () {\n buffers = completed = null;\n };\n })\n : EMPTY;\n}\n//# sourceMappingURL=zip.js.map","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\n// CloudWatch Logs: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html\ninterface CloudWatchLogsLanguage extends monacoType.languages.IMonarchLanguage {\n commands: string[];\n operators: string[];\n builtinFunctions: string[];\n}\n\nexport const DIFF = 'diff';\nexport const DISPLAY = 'display';\nexport const FIELDS = 'fields';\nexport const FILTER = 'filter';\nexport const PATTERN = 'pattern';\nexport const STATS = 'stats';\nexport const SORT = 'sort';\nexport const LIMIT = 'limit';\nexport const PARSE = 'parse';\nexport const DEDUP = 'dedup';\nexport const LOGS_COMMANDS = [DISPLAY, FIELDS, FILTER, PATTERN, STATS, SORT, LIMIT, PARSE, DEDUP, DIFF];\n\nexport const LOGS_LOGIC_OPERATORS = ['and', 'or', 'not'];\n\nexport const LOGS_FUNCTION_OPERATORS = [\n // math\n 'abs',\n 'ceil',\n 'floor',\n 'greatest',\n 'least',\n 'log',\n 'sqrt',\n // datetime\n 'bin',\n 'datefloor',\n 'dateceil',\n 'fromMillis',\n 'toMillis',\n // general\n 'ispresent',\n 'coalesce',\n // ip\n 'isValidIp',\n 'isValidIpV4',\n 'isValidIpV6',\n 'isIpInSubnet',\n 'isIpv4InSubnet',\n 'isIpv6InSubnet',\n // stats aggregation\n 'avg',\n 'count',\n 'count_distinct',\n 'max',\n 'min',\n 'pct',\n 'stddev',\n 'sum',\n // stats non-aggregation\n 'earliest',\n 'latest',\n 'sortsFirst',\n 'sortsLast',\n // strings\n 'isempty',\n 'isblank',\n 'concat',\n 'ltrim',\n 'rtrim',\n 'trim',\n 'strlen',\n 'toupper',\n 'tolower',\n 'substr',\n 'replace',\n 'strcontains',\n // field\n 'unmask',\n];\n\nexport const SORT_DIRECTION_KEYWORDS = ['asc', 'desc'];\nexport const DIFF_MODIFIERS = ['previousDay', 'previousWeek', 'previousMonth'];\nexport const LOGS_KEYWORDS = ['like', 'by', 'in', 'as', ...SORT_DIRECTION_KEYWORDS, ...DIFF_MODIFIERS];\n\nexport const language: CloudWatchLogsLanguage = {\n defaultToken: 'invalid',\n id: 'logs',\n ignoreCase: true,\n brackets: [\n { open: '[', close: ']', token: 'delimiter.square' },\n { open: '(', close: ')', token: 'delimiter.parenthesis' },\n ],\n commands: [...LOGS_COMMANDS, ...LOGS_KEYWORDS],\n operators: LOGS_LOGIC_OPERATORS,\n builtinFunctions: LOGS_FUNCTION_OPERATORS,\n tokenizer: {\n root: [\n { include: '@comments' },\n { include: '@regexes' },\n { include: '@whitespace' },\n { include: '@fieldNames' },\n { include: '@variables' },\n { include: '@strings' },\n { include: '@numbers' },\n\n [/\\|\\|/, 'operator'],\n [/[,.:\\|]/, 'delimiter'],\n [/[()\\[\\]]/, 'delimiter.parenthesis'],\n [\n /[\\w@#$]+/,\n {\n cases: {\n '@commands': 'keyword',\n '@builtinFunctions': 'predefined',\n '@operators': 'operator',\n '@default': 'identifier',\n },\n },\n ],\n [/[+\\-*/^%=!<>]/, 'operator'], // handles the math operators\n ],\n variables: [\n [/\\${/, { token: 'variable', next: '@variable_bracket' }],\n [/\\$[a-zA-Z0-9-_]+/, 'variable'],\n ],\n variable_bracket: [\n [/[a-zA-Z0-9-_:]+/, 'variable'],\n [/}/, { token: 'variable', next: '@pop' }],\n ],\n fieldNames: [[/(@[_a-zA-Z]+[_.0-9a-zA-Z]*)|(`((\\\\`)|([^`]))*?`)/, 'identifier']],\n whitespace: [[/\\s+/, 'white']],\n comments: [\n [/^#.*/, 'comment'],\n [/\\s+#.*/, 'comment'],\n ],\n numbers: [\n [/0[xX][0-9a-fA-F]*/, 'number'],\n [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n ],\n strings: [\n [/'/, { token: 'string', next: '@string' }],\n [/\"/, { token: 'string', next: '@string_double' }],\n [/`/, { token: 'identifier', next: '@string_backtick' }],\n ],\n string: [\n [/[^']+/, 'string'],\n [/''/, 'string'],\n [/'/, { token: 'string', next: '@pop' }],\n ],\n string_double: [\n [/[^\\\\\"]+/, 'string'],\n [/\"/, 'string', '@pop'],\n ],\n string_backtick: [\n [/[^\\\\`]+/, 'identifier'],\n [/`/, 'identifier', '@pop'],\n ],\n regexes: [[/\\/.*?\\/(?=\\s*\\||\\s*$|,)/, 'regexp']],\n },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {\n comments: {\n lineComment: '#',\n },\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n};\n","import { AnnotationQuery } from '@grafana/data';\n\nimport {\n CloudWatchAnnotationQuery,\n CloudWatchLogsAnomaliesQuery,\n CloudWatchLogsQuery,\n CloudWatchMetricsQuery,\n CloudWatchQuery,\n LogsMode,\n} from './types';\n\nexport const isCloudWatchLogsQuery = (cloudwatchQuery: CloudWatchQuery): cloudwatchQuery is CloudWatchLogsQuery =>\n cloudwatchQuery.queryMode === 'Logs';\n\nexport const isLogsAnomaliesQuery = (\n cloudwatchQuery: CloudWatchQuery\n): cloudwatchQuery is CloudWatchLogsAnomaliesQuery => {\n if (isCloudWatchLogsQuery(cloudwatchQuery)) {\n return cloudwatchQuery.logsMode === LogsMode.Anomalies;\n }\n return false;\n};\n\nexport const isCloudWatchMetricsQuery = (cloudwatchQuery: CloudWatchQuery): cloudwatchQuery is CloudWatchMetricsQuery =>\n cloudwatchQuery.queryMode === 'Metrics' || !cloudwatchQuery.hasOwnProperty('queryMode'); // in early versions of this plugin, queryMode wasn't defined in a CloudWatchMetricsQuery\n\nexport const isCloudWatchAnnotationQuery = (\n cloudwatchQuery: CloudWatchQuery\n): cloudwatchQuery is CloudWatchAnnotationQuery => cloudwatchQuery.queryMode === 'Annotations';\n\nexport const isCloudWatchAnnotation = (query: unknown): query is AnnotationQuery<CloudWatchAnnotationQuery> =>\n (query as AnnotationQuery<CloudWatchAnnotationQuery>).target?.queryMode === 'Annotations';\n","import deepEqual from 'fast-deep-equal';\n\nimport { CloudWatchMetricsQuery } from '../types';\n\nimport { migrateCloudWatchQuery } from './dashboardMigrations';\n\n// Call this function to migrate queries from within the plugin.\nexport function migrateMetricQuery(query: CloudWatchMetricsQuery): CloudWatchMetricsQuery {\n const newQuery = { ...query };\n migrateCloudWatchQuery(newQuery);\n //add metric query migrations here\n const migratedQuery = migrateAliasPatterns(newQuery);\n return deepEqual(migratedQuery, query) ? query : migratedQuery;\n}\n\nconst aliasPatterns: Record<string, string> = {\n metric: `PROP('MetricName')`,\n namespace: `PROP('Namespace')`,\n period: `PROP('Period')`,\n region: `PROP('Region')`,\n stat: `PROP('Stat')`,\n label: `LABEL`,\n};\n\n// migrateAliasPatterns in the context of https://github.com/grafana/grafana/issues/48434\nexport function migrateAliasPatterns(query: CloudWatchMetricsQuery): CloudWatchMetricsQuery {\n if (!query.hasOwnProperty('label')) {\n const newQuery = { ...query };\n if (!query.hasOwnProperty('label')) {\n const regex = /{{\\s*(.+?)\\s*}}/g;\n newQuery.label =\n query.alias?.replace(regex, (_, value) => {\n if (aliasPatterns.hasOwnProperty(value)) {\n return `\\${${aliasPatterns[value]}}`;\n }\n\n return `\\${PROP('Dim.${value}')}`;\n }) ?? '';\n }\n return newQuery;\n }\n return query;\n}\n","import { SelectableValue } from '@grafana/data';\n\nimport { CloudWatchMetricsQuery, MetricQueryType, MetricEditorMode } from '../types';\n\nimport { CloudWatchDatasource } from './../datasource';\n\nexport const toOption = (value: string) => ({ label: value, value });\n\nexport const appendTemplateVariables = (datasource: CloudWatchDatasource, values: SelectableValue[]) => [\n ...values,\n { label: 'Template Variables', options: datasource.getVariables().map(toOption) },\n];\n\nexport const filterMetricsQuery = (query: CloudWatchMetricsQuery): boolean => {\n const { region, metricQueryType, metricEditorMode, expression, metricName, namespace, sqlExpression, statistic } =\n query;\n if (!region) {\n return false;\n }\n if (metricQueryType === MetricQueryType.Search && metricEditorMode === MetricEditorMode.Builder) {\n return !!namespace && !!metricName && !!statistic;\n } else if (metricQueryType === MetricQueryType.Search && metricEditorMode === MetricEditorMode.Code) {\n return !!expression;\n } else if (metricQueryType === MetricQueryType.Insights) {\n // still TBD how to validate the visual query builder for SQL\n return !!sqlExpression;\n }\n\n return false;\n};\n","import { DashboardLoadedEvent } from '@grafana/data';\nimport { config, reportInteraction } from '@grafana/runtime';\n\nimport { isCloudWatchLogsQuery, isCloudWatchMetricsQuery, isLogsAnomaliesQuery } from './guards';\nimport { migrateMetricQuery } from './migrations/metricQueryMigrations';\nimport pluginJson from './plugin.json';\nimport {\n CloudWatchLogsAnomaliesQuery,\n CloudWatchLogsQuery,\n CloudWatchMetricsQuery,\n CloudWatchQuery,\n LogsMode,\n LogsQueryLanguage,\n MetricEditorMode,\n MetricQueryType,\n} from './types';\nimport { filterMetricsQuery } from './utils/utils';\n\ntype CloudWatchOnDashboardLoadedTrackingEvent = {\n grafana_version?: string;\n dashboard_id?: string;\n org_id?: number;\n\n /* The number of CloudWatch logs queries present in the dashboard*/\n logs_queries_count: number;\n\n /* The number of Logs queries that use Logs Insights query language */\n logs_cwli_queries_count: number;\n\n /* The number of Logs queries that use SQL language */\n logs_sql_queries_count: number;\n\n /* The number of Logs queries that use PPL language */\n logs_ppl_queries_count: number;\n\n /* The number of log anomalies queries */\n log_anomalies_queries_count: number;\n\n /* The number of CloudWatch metrics queries present in the dashboard*/\n metrics_queries_count: number;\n\n /* The number of queries using the \"Search\" mode. \n Should be measured in relation to metrics_queries_count, e.g metrics_search_count + metrics_query_count = metrics_queries_count */\n metrics_search_count: number;\n\n /* The number of search queries that are using the builder mode. \n Should be measured in relation to metrics_search_count, e.g metrics_search_builder_count + metrics_search_code_count = metrics_search_count */\n metrics_search_builder_count: number;\n\n /* The number of search queries that are using the code mode. \n Should be measured in relation to metrics_search_count, e.g metrics_search_builder_count + metrics_search_code_count = metrics_search_count */\n metrics_search_code_count: number;\n\n /* The number of search queries that have enabled the `match exact` toggle in the builder mode. \n Should be measured in relation to metrics_search_builder_count. \n E.g 'Out of 5 metric seach queries (metrics_search_builder_count), 2 had match exact toggle (metrics_search_match_exact_count) enabled */\n metrics_search_match_exact_count: number;\n\n /* The number of queries using the \"Query\" mode (AKA Metric Insights). \n Should be measured in relation to metrics_queries_count, e.g metrics_search_count + metrics_query_count = metrics_queries_count */\n metrics_query_count: number;\n\n /* The number of \"Insights\" queries that are using the builder mode. \n Should be measured in relation to metrics_query_count, e.g metrics_query_builder_count + metrics_query_code_count = metrics_query_count */\n metrics_query_builder_count: number;\n\n /* The number of \"Insights\" queries that are using the code mode. \n Should be measured in relation to metrics_query_count, e.g metrics_query_builder_count + metrics_query_code_count = metrics_query_count */\n metrics_query_code_count: number;\n\n /* The number of CloudWatch metrics queries that have specified an account in its cross account metric stat query */\n metrics_queries_with_account_count: number;\n};\n\nexport const onDashboardLoadedHandler = ({\n payload: { dashboardId, orgId, grafanaVersion, queries },\n}: DashboardLoadedEvent<CloudWatchQuery>) => {\n try {\n const cloudWatchQueries = queries[pluginJson.id];\n\n if (!cloudWatchQueries?.length) {\n return;\n }\n\n let logsInsightsQueries: CloudWatchLogsQuery[] = [];\n let logAnomaliesQueries: CloudWatchLogsAnomaliesQuery[] = [];\n let metricsQueries: CloudWatchMetricsQuery[] = [];\n\n for (const query of cloudWatchQueries) {\n if (query.hide) {\n continue;\n }\n\n const isLogsInsightsQuery =\n isCloudWatchLogsQuery(query) && (!query.logsMode || query.logsMode === LogsMode.Insights);\n if (isLogsInsightsQuery) {\n (query.logGroupNames?.length || query.logGroups?.length) && logsInsightsQueries.push(query);\n } else if (isLogsAnomaliesQuery(query)) {\n logAnomaliesQueries.push(query);\n } else if (isCloudWatchMetricsQuery(query)) {\n const migratedQuery = migrateMetricQuery(query);\n filterMetricsQuery(migratedQuery) && metricsQueries.push(query);\n }\n }\n\n const e: CloudWatchOnDashboardLoadedTrackingEvent = {\n grafana_version: grafanaVersion,\n dashboard_id: dashboardId,\n org_id: orgId,\n logs_queries_count: logsInsightsQueries?.length + logAnomaliesQueries.length,\n logs_cwli_queries_count: logsInsightsQueries?.filter(\n (q) => !q.queryLanguage || q.queryLanguage === LogsQueryLanguage.CWLI\n ).length,\n logs_sql_queries_count: logsInsightsQueries?.filter((q) => q.queryLanguage === LogsQueryLanguage.SQL).length,\n logs_ppl_queries_count: logsInsightsQueries?.filter((q) => q.queryLanguage === LogsQueryLanguage.PPL).length,\n log_anomalies_queries_count: logAnomaliesQueries.length,\n metrics_queries_count: metricsQueries?.length,\n metrics_search_count: 0,\n metrics_search_builder_count: 0,\n metrics_search_code_count: 0,\n metrics_search_match_exact_count: 0,\n metrics_query_count: 0,\n metrics_query_builder_count: 0,\n metrics_query_code_count: 0,\n metrics_queries_with_account_count: 0,\n };\n\n for (const q of metricsQueries) {\n e.metrics_search_count += +Boolean(q.metricQueryType === MetricQueryType.Search);\n e.metrics_search_builder_count += +isMetricSearchBuilder(q);\n e.metrics_search_code_count += +Boolean(\n q.metricQueryType === MetricQueryType.Search && q.metricEditorMode === MetricEditorMode.Code\n );\n e.metrics_search_match_exact_count += +Boolean(isMetricSearchBuilder(q) && q.matchExact);\n e.metrics_query_count += +Boolean(q.metricQueryType === MetricQueryType.Insights);\n e.metrics_query_builder_count += +Boolean(\n q.metricQueryType === MetricQueryType.Insights && q.metricEditorMode === MetricEditorMode.Builder\n );\n e.metrics_query_code_count += +Boolean(\n q.metricQueryType === MetricQueryType.Insights && q.metricEditorMode === MetricEditorMode.Code\n );\n e.metrics_queries_with_account_count += +Boolean(\n config.featureToggles.cloudWatchCrossAccountQuerying && isMetricSearchBuilder(q) && q.accountId\n );\n }\n\n reportInteraction('grafana_ds_cloudwatch_dashboard_loaded', e);\n } catch (error) {\n console.error('error in cloudwatch tracking handler', error);\n }\n};\n\ntype SampleQueryTrackingEvent = {\n queryLanguage: LogsQueryLanguage;\n queryCategory: string;\n};\n\nexport const trackSampleQuerySelection = (props: SampleQueryTrackingEvent) => {\n const { queryLanguage, queryCategory } = props;\n reportInteraction('cloudwatch-logs-cheat-sheet-query-clicked', { queryLanguage, queryCategory });\n};\n\nconst isMetricSearchBuilder = (q: CloudWatchMetricsQuery) =>\n Boolean(q.metricQueryType === MetricQueryType.Search && q.metricEditorMode === MetricEditorMode.Builder);\n","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['', ''], ['', '']);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class TemplateTag\n * @classdesc Consumes a pipeline of composable transformer plugins and produces a template tag.\n */\nvar TemplateTag = function () {\n /**\n * constructs a template tag\n * @constructs TemplateTag\n * @param {...Object} [...transformers] - an array or arguments list of transformers\n * @return {Function} - a template tag\n */\n function TemplateTag() {\n var _this = this;\n\n for (var _len = arguments.length, transformers = Array(_len), _key = 0; _key < _len; _key++) {\n transformers[_key] = arguments[_key];\n }\n\n _classCallCheck(this, TemplateTag);\n\n this.tag = function (strings) {\n for (var _len2 = arguments.length, expressions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n expressions[_key2 - 1] = arguments[_key2];\n }\n\n if (typeof strings === 'function') {\n // if the first argument passed is a function, assume it is a template tag and return\n // an intermediary tag that processes the template using the aforementioned tag, passing the\n // result to our tag\n return _this.interimTag.bind(_this, strings);\n }\n\n if (typeof strings === 'string') {\n // if the first argument passed is a string, just transform it\n return _this.transformEndResult(strings);\n }\n\n // else, return a transformed end result of processing the template with our tag\n strings = strings.map(_this.transformString.bind(_this));\n return _this.transformEndResult(strings.reduce(_this.processSubstitutions.bind(_this, expressions)));\n };\n\n // if first argument is an array, extrude it as a list of transformers\n if (transformers.length > 0 && Array.isArray(transformers[0])) {\n transformers = transformers[0];\n }\n\n // if any transformers are functions, this means they are not initiated - automatically initiate them\n this.transformers = transformers.map(function (transformer) {\n return typeof transformer === 'function' ? transformer() : transformer;\n });\n\n // return an ES2015 template tag\n return this.tag;\n }\n\n /**\n * Applies all transformers to a template literal tagged with this method.\n * If a function is passed as the first argument, assumes the function is a template tag\n * and applies it to the template, returning a template tag.\n * @param {(Function|String|Array<String>)} strings - Either a template tag or an array containing template strings separated by identifier\n * @param {...*} ...expressions - Optional list of substitution values.\n * @return {(String|Function)} - Either an intermediary tag function or the results of processing the template.\n */\n\n\n _createClass(TemplateTag, [{\n key: 'interimTag',\n\n\n /**\n * An intermediary template tag that receives a template tag and passes the result of calling the template with the received\n * template tag to our own template tag.\n * @param {Function} nextTag - the received template tag\n * @param {Array<String>} template - the template to process\n * @param {...*} ...substitutions - `substitutions` is an array of all substitutions in the template\n * @return {*} - the final processed value\n */\n value: function interimTag(previousTag, template) {\n for (var _len3 = arguments.length, substitutions = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n substitutions[_key3 - 2] = arguments[_key3];\n }\n\n return this.tag(_templateObject, previousTag.apply(undefined, [template].concat(substitutions)));\n }\n\n /**\n * Performs bulk processing on the tagged template, transforming each substitution and then\n * concatenating the resulting values into a string.\n * @param {Array<*>} substitutions - an array of all remaining substitutions present in this template\n * @param {String} resultSoFar - this iteration's result string so far\n * @param {String} remainingPart - the template chunk after the current substitution\n * @return {String} - the result of joining this iteration's processed substitution with the result\n */\n\n }, {\n key: 'processSubstitutions',\n value: function processSubstitutions(substitutions, resultSoFar, remainingPart) {\n var substitution = this.transformSubstitution(substitutions.shift(), resultSoFar);\n return ''.concat(resultSoFar, substitution, remainingPart);\n }\n\n /**\n * Iterate through each transformer, applying the transformer's `onString` method to the template\n * strings before all substitutions are processed.\n * @param {String} str - The input string\n * @return {String} - The final results of processing each transformer\n */\n\n }, {\n key: 'transformString',\n value: function transformString(str) {\n var cb = function cb(res, transform) {\n return transform.onString ? transform.onString(res) : res;\n };\n return this.transformers.reduce(cb, str);\n }\n\n /**\n * When a substitution is encountered, iterates through each transformer and applies the transformer's\n * `onSubstitution` method to the substitution.\n * @param {*} substitution - The current substitution\n * @param {String} resultSoFar - The result up to and excluding this substitution.\n * @return {*} - The final result of applying all substitution transformations.\n */\n\n }, {\n key: 'transformSubstitution',\n value: function transformSubstitution(substitution, resultSoFar) {\n var cb = function cb(res, transform) {\n return transform.onSubstitution ? transform.onSubstitution(res, resultSoFar) : res;\n };\n return this.transformers.reduce(cb, substitution);\n }\n\n /**\n * Iterates through each transformer, applying the transformer's `onEndResult` method to the\n * template literal after all substitutions have finished processing.\n * @param {String} endResult - The processed template, just before it is returned from the tag\n * @return {String} - The final results of processing each transformer\n */\n\n }, {\n key: 'transformEndResult',\n value: function transformEndResult(endResult) {\n var cb = function cb(res, transform) {\n return transform.onEndResult ? transform.onEndResult(res) : res;\n };\n return this.transformers.reduce(cb, endResult);\n }\n }]);\n\n return TemplateTag;\n}();\n\nexport default TemplateTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UZW1wbGF0ZVRhZy9UZW1wbGF0ZVRhZy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyYW5zZm9ybWVycyIsInRhZyIsInN0cmluZ3MiLCJleHByZXNzaW9ucyIsImludGVyaW1UYWciLCJiaW5kIiwidHJhbnNmb3JtRW5kUmVzdWx0IiwibWFwIiwidHJhbnNmb3JtU3RyaW5nIiwicmVkdWNlIiwicHJvY2Vzc1N1YnN0aXR1dGlvbnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJ0cmFuc2Zvcm1lciIsInByZXZpb3VzVGFnIiwidGVtcGxhdGUiLCJzdWJzdGl0dXRpb25zIiwicmVzdWx0U29GYXIiLCJyZW1haW5pbmdQYXJ0Iiwic3Vic3RpdHV0aW9uIiwidHJhbnNmb3JtU3Vic3RpdHV0aW9uIiwic2hpZnQiLCJjb25jYXQiLCJzdHIiLCJjYiIsInJlcyIsInRyYW5zZm9ybSIsIm9uU3RyaW5nIiwib25TdWJzdGl0dXRpb24iLCJlbmRSZXN1bHQiLCJvbkVuZFJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztJQUlxQkEsVztBQUNuQjs7Ozs7O0FBTUEseUJBQTZCO0FBQUE7O0FBQUEsc0NBQWRDLFlBQWM7QUFBZEEsa0JBQWM7QUFBQTs7QUFBQTs7QUFBQSxTQXVCN0JDLEdBdkI2QixHQXVCdkIsVUFBQ0MsT0FBRCxFQUE2QjtBQUFBLHlDQUFoQkMsV0FBZ0I7QUFBaEJBLG1CQUFnQjtBQUFBOztBQUNqQyxVQUFJLE9BQU9ELE9BQVAsS0FBbUIsVUFBdkIsRUFBbUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsZUFBTyxNQUFLRSxVQUFMLENBQWdCQyxJQUFoQixDQUFxQixLQUFyQixFQUEyQkgsT0FBM0IsQ0FBUDtBQUNEOztBQUVELFVBQUksT0FBT0EsT0FBUCxLQUFtQixRQUF2QixFQUFpQztBQUMvQjtBQUNBLGVBQU8sTUFBS0ksa0JBQUwsQ0FBd0JKLE9BQXhCLENBQVA7QUFDRDs7QUFFRDtBQUNBQSxnQkFBVUEsUUFBUUssR0FBUixDQUFZLE1BQUtDLGVBQUwsQ0FBcUJILElBQXJCLENBQTBCLEtBQTFCLENBQVosQ0FBVjtBQUNBLGFBQU8sTUFBS0Msa0JBQUwsQ0FDTEosUUFBUU8sTUFBUixDQUFlLE1BQUtDLG9CQUFMLENBQTBCTCxJQUExQixDQUErQixLQUEvQixFQUFxQ0YsV0FBckMsQ0FBZixDQURLLENBQVA7QUFHRCxLQXpDNEI7O0FBQzNCO0FBQ0EsUUFBSUgsYUFBYVcsTUFBYixHQUFzQixDQUF0QixJQUEyQkMsTUFBTUMsT0FBTixDQUFjYixhQUFhLENBQWIsQ0FBZCxDQUEvQixFQUErRDtBQUM3REEscUJBQWVBLGFBQWEsQ0FBYixDQUFmO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFLQSxZQUFMLEdBQW9CQSxhQUFhTyxHQUFiLENBQWlCLHVCQUFlO0FBQ2xELGFBQU8sT0FBT08sV0FBUCxLQUF1QixVQUF2QixHQUFvQ0EsYUFBcEMsR0FBb0RBLFdBQTNEO0FBQ0QsS0FGbUIsQ0FBcEI7O0FBSUE7QUFDQSxXQUFPLEtBQUtiLEdBQVo7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7QUE0QkE7Ozs7Ozs7OytCQVFXYyxXLEVBQWFDLFEsRUFBNEI7QUFBQSx5Q0FBZkMsYUFBZTtBQUFmQSxxQkFBZTtBQUFBOztBQUNsRCxhQUFPLEtBQUtoQixHQUFaLGtCQUFrQmMsOEJBQVlDLFFBQVosU0FBeUJDLGFBQXpCLEVBQWxCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7O3lDQVFxQkEsYSxFQUFlQyxXLEVBQWFDLGEsRUFBZTtBQUM5RCxVQUFNQyxlQUFlLEtBQUtDLHFCQUFMLENBQ25CSixjQUFjSyxLQUFkLEVBRG1CLEVBRW5CSixXQUZtQixDQUFyQjtBQUlBLGFBQU8sR0FBR0ssTUFBSCxDQUFVTCxXQUFWLEVBQXVCRSxZQUF2QixFQUFxQ0QsYUFBckMsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7b0NBTWdCSyxHLEVBQUs7QUFDbkIsVUFBTUMsS0FBSyxTQUFMQSxFQUFLLENBQUNDLEdBQUQsRUFBTUMsU0FBTjtBQUFBLGVBQ1RBLFVBQVVDLFFBQVYsR0FBcUJELFVBQVVDLFFBQVYsQ0FBbUJGLEdBQW5CLENBQXJCLEdBQStDQSxHQUR0QztBQUFBLE9BQVg7QUFFQSxhQUFPLEtBQUsxQixZQUFMLENBQWtCUyxNQUFsQixDQUF5QmdCLEVBQXpCLEVBQTZCRCxHQUE3QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7MENBT3NCSixZLEVBQWNGLFcsRUFBYTtBQUMvQyxVQUFNTyxLQUFLLFNBQUxBLEVBQUssQ0FBQ0MsR0FBRCxFQUFNQyxTQUFOO0FBQUEsZUFDVEEsVUFBVUUsY0FBVixHQUNJRixVQUFVRSxjQUFWLENBQXlCSCxHQUF6QixFQUE4QlIsV0FBOUIsQ0FESixHQUVJUSxHQUhLO0FBQUEsT0FBWDtBQUlBLGFBQU8sS0FBSzFCLFlBQUwsQ0FBa0JTLE1BQWxCLENBQXlCZ0IsRUFBekIsRUFBNkJMLFlBQTdCLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O3VDQU1tQlUsUyxFQUFXO0FBQzVCLFVBQU1MLEtBQUssU0FBTEEsRUFBSyxDQUFDQyxHQUFELEVBQU1DLFNBQU47QUFBQSxlQUNUQSxVQUFVSSxXQUFWLEdBQXdCSixVQUFVSSxXQUFWLENBQXNCTCxHQUF0QixDQUF4QixHQUFxREEsR0FENUM7QUFBQSxPQUFYO0FBRUEsYUFBTyxLQUFLMUIsWUFBTCxDQUFrQlMsTUFBbEIsQ0FBeUJnQixFQUF6QixFQUE2QkssU0FBN0IsQ0FBUDtBQUNEOzs7Ozs7ZUFuSGtCL0IsVyIsImZpbGUiOiJUZW1wbGF0ZVRhZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGNsYXNzIFRlbXBsYXRlVGFnXG4gKiBAY2xhc3NkZXNjIENvbnN1bWVzIGEgcGlwZWxpbmUgb2YgY29tcG9zYWJsZSB0cmFuc2Zvcm1lciBwbHVnaW5zIGFuZCBwcm9kdWNlcyBhIHRlbXBsYXRlIHRhZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtcGxhdGVUYWcge1xuICAvKipcbiAgICogY29uc3RydWN0cyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBAY29uc3RydWN0cyBUZW1wbGF0ZVRhZ1xuICAgKiBAcGFyYW0gIHsuLi5PYmplY3R9IFsuLi50cmFuc2Zvcm1lcnNdIC0gYW4gYXJyYXkgb3IgYXJndW1lbnRzIGxpc3Qgb2YgdHJhbnNmb3JtZXJzXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAgICAgICAgICAgICAgLSBhIHRlbXBsYXRlIHRhZ1xuICAgKi9cbiAgY29uc3RydWN0b3IoLi4udHJhbnNmb3JtZXJzKSB7XG4gICAgLy8gaWYgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIGV4dHJ1ZGUgaXQgYXMgYSBsaXN0IG9mIHRyYW5zZm9ybWVyc1xuICAgIGlmICh0cmFuc2Zvcm1lcnMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVyc1swXSkpIHtcbiAgICAgIHRyYW5zZm9ybWVycyA9IHRyYW5zZm9ybWVyc1swXTtcbiAgICB9XG5cbiAgICAvLyBpZiBhbnkgdHJhbnNmb3JtZXJzIGFyZSBmdW5jdGlvbnMsIHRoaXMgbWVhbnMgdGhleSBhcmUgbm90IGluaXRpYXRlZCAtIGF1dG9tYXRpY2FsbHkgaW5pdGlhdGUgdGhlbVxuICAgIHRoaXMudHJhbnNmb3JtZXJzID0gdHJhbnNmb3JtZXJzLm1hcCh0cmFuc2Zvcm1lciA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRyYW5zZm9ybWVyID09PSAnZnVuY3Rpb24nID8gdHJhbnNmb3JtZXIoKSA6IHRyYW5zZm9ybWVyO1xuICAgIH0pO1xuXG4gICAgLy8gcmV0dXJuIGFuIEVTMjAxNSB0ZW1wbGF0ZSB0YWdcbiAgICByZXR1cm4gdGhpcy50YWc7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbGwgdHJhbnNmb3JtZXJzIHRvIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWdnZWQgd2l0aCB0aGlzIG1ldGhvZC5cbiAgICogSWYgYSBmdW5jdGlvbiBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCBhc3N1bWVzIHRoZSBmdW5jdGlvbiBpcyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBhbmQgYXBwbGllcyBpdCB0byB0aGUgdGVtcGxhdGUsIHJldHVybmluZyBhIHRlbXBsYXRlIHRhZy5cbiAgICogQHBhcmFtICB7KEZ1bmN0aW9ufFN0cmluZ3xBcnJheTxTdHJpbmc+KX0gc3RyaW5ncyAgICAgICAgLSBFaXRoZXIgYSB0ZW1wbGF0ZSB0YWcgb3IgYW4gYXJyYXkgY29udGFpbmluZyB0ZW1wbGF0ZSBzdHJpbmdzIHNlcGFyYXRlZCBieSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4cHJlc3Npb25zIC0gT3B0aW9uYWwgbGlzdCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICAgKiBAcmV0dXJuIHsoU3RyaW5nfEZ1bmN0aW9uKX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEVpdGhlciBhbiBpbnRlcm1lZGlhcnkgdGFnIGZ1bmN0aW9uIG9yIHRoZSByZXN1bHRzIG9mIHByb2Nlc3NpbmcgdGhlIHRlbXBsYXRlLlxuICAgKi9cbiAgdGFnID0gKHN0cmluZ3MsIC4uLmV4cHJlc3Npb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdCBpcyBhIHRlbXBsYXRlIHRhZyBhbmQgcmV0dXJuXG4gICAgICAvLyBhbiBpbnRlcm1lZGlhcnkgdGFnIHRoYXQgcHJvY2Vzc2VzIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgYWZvcmVtZW50aW9uZWQgdGFnLCBwYXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0IHRvIG91ciB0YWdcbiAgICAgIHJldHVybiB0aGlzLmludGVyaW1UYWcuYmluZCh0aGlzLCBzdHJpbmdzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHN0cmluZ3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgc3RyaW5nLCBqdXN0IHRyYW5zZm9ybSBpdFxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRW5kUmVzdWx0KHN0cmluZ3MpO1xuICAgIH1cblxuICAgIC8vIGVsc2UsIHJldHVybiBhIHRyYW5zZm9ybWVkIGVuZCByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgdGVtcGxhdGUgd2l0aCBvdXIgdGFnXG4gICAgc3RyaW5ncyA9IHN0cmluZ3MubWFwKHRoaXMudHJhbnNmb3JtU3RyaW5nLmJpbmQodGhpcykpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUVuZFJlc3VsdChcbiAgICAgIHN0cmluZ3MucmVkdWNlKHRoaXMucHJvY2Vzc1N1YnN0aXR1dGlvbnMuYmluZCh0aGlzLCBleHByZXNzaW9ucykpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFuIGludGVybWVkaWFyeSB0ZW1wbGF0ZSB0YWcgdGhhdCByZWNlaXZlcyBhIHRlbXBsYXRlIHRhZyBhbmQgcGFzc2VzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgcmVjZWl2ZWRcbiAgICogdGVtcGxhdGUgdGFnIHRvIG91ciBvd24gdGVtcGxhdGUgdGFnLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgICAgIG5leHRUYWcgICAgICAgICAgLSB0aGUgcmVjZWl2ZWQgdGVtcGxhdGUgdGFnXG4gICAqIEBwYXJhbSAge0FycmF5PFN0cmluZz59ICAgdGVtcGxhdGUgICAgICAgICAtIHRoZSB0ZW1wbGF0ZSB0byBwcm9jZXNzXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgLi4uc3Vic3RpdHV0aW9ucyAtIGBzdWJzdGl0dXRpb25zYCBpcyBhbiBhcnJheSBvZiBhbGwgc3Vic3RpdHV0aW9ucyBpbiB0aGUgdGVtcGxhdGVcbiAgICogQHJldHVybiB7Kn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIGZpbmFsIHByb2Nlc3NlZCB2YWx1ZVxuICAgKi9cbiAgaW50ZXJpbVRhZyhwcmV2aW91c1RhZywgdGVtcGxhdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy50YWdgJHtwcmV2aW91c1RhZyh0ZW1wbGF0ZSwgLi4uc3Vic3RpdHV0aW9ucyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBidWxrIHByb2Nlc3Npbmcgb24gdGhlIHRhZ2dlZCB0ZW1wbGF0ZSwgdHJhbnNmb3JtaW5nIGVhY2ggc3Vic3RpdHV0aW9uIGFuZCB0aGVuXG4gICAqIGNvbmNhdGVuYXRpbmcgdGhlIHJlc3VsdGluZyB2YWx1ZXMgaW50byBhIHN0cmluZy5cbiAgICogQHBhcmFtICB7QXJyYXk8Kj59IHN1YnN0aXR1dGlvbnMgLSBhbiBhcnJheSBvZiBhbGwgcmVtYWluaW5nIHN1YnN0aXR1dGlvbnMgcHJlc2VudCBpbiB0aGlzIHRlbXBsYXRlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gICByZXN1bHRTb0ZhciAgIC0gdGhpcyBpdGVyYXRpb24ncyByZXN1bHQgc3RyaW5nIHNvIGZhclxuICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgcmVtYWluaW5nUGFydCAtIHRoZSB0ZW1wbGF0ZSBjaHVuayBhZnRlciB0aGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgICAgICAgLSB0aGUgcmVzdWx0IG9mIGpvaW5pbmcgdGhpcyBpdGVyYXRpb24ncyBwcm9jZXNzZWQgc3Vic3RpdHV0aW9uIHdpdGggdGhlIHJlc3VsdFxuICAgKi9cbiAgcHJvY2Vzc1N1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucywgcmVzdWx0U29GYXIsIHJlbWFpbmluZ1BhcnQpIHtcbiAgICBjb25zdCBzdWJzdGl0dXRpb24gPSB0aGlzLnRyYW5zZm9ybVN1YnN0aXR1dGlvbihcbiAgICAgIHN1YnN0aXR1dGlvbnMuc2hpZnQoKSxcbiAgICAgIHJlc3VsdFNvRmFyLFxuICAgICk7XG4gICAgcmV0dXJuICcnLmNvbmNhdChyZXN1bHRTb0Zhciwgc3Vic3RpdHV0aW9uLCByZW1haW5pbmdQYXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCB0cmFuc2Zvcm1lciwgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybWVyJ3MgYG9uU3RyaW5nYCBtZXRob2QgdG8gdGhlIHRlbXBsYXRlXG4gICAqIHN0cmluZ3MgYmVmb3JlIGFsbCBzdWJzdGl0dXRpb25zIGFyZSBwcm9jZXNzZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgc3RyIC0gVGhlIGlucHV0IHN0cmluZ1xuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAtIFRoZSBmaW5hbCByZXN1bHRzIG9mIHByb2Nlc3NpbmcgZWFjaCB0cmFuc2Zvcm1lclxuICAgKi9cbiAgdHJhbnNmb3JtU3RyaW5nKHN0cikge1xuICAgIGNvbnN0IGNiID0gKHJlcywgdHJhbnNmb3JtKSA9PlxuICAgICAgdHJhbnNmb3JtLm9uU3RyaW5nID8gdHJhbnNmb3JtLm9uU3RyaW5nKHJlcykgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgc3Vic3RpdHV0aW9uIGlzIGVuY291bnRlcmVkLCBpdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIgYW5kIGFwcGxpZXMgdGhlIHRyYW5zZm9ybWVyJ3NcbiAgICogYG9uU3Vic3RpdHV0aW9uYCBtZXRob2QgdG8gdGhlIHN1YnN0aXR1dGlvbi5cbiAgICogQHBhcmFtICB7Kn0gICAgICBzdWJzdGl0dXRpb24gLSBUaGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXN1bHRTb0ZhciAgLSBUaGUgcmVzdWx0IHVwIHRvIGFuZCBleGNsdWRpbmcgdGhpcyBzdWJzdGl0dXRpb24uXG4gICAqIEByZXR1cm4geyp9ICAgICAgICAgICAgICAgICAgIC0gVGhlIGZpbmFsIHJlc3VsdCBvZiBhcHBseWluZyBhbGwgc3Vic3RpdHV0aW9uIHRyYW5zZm9ybWF0aW9ucy5cbiAgICovXG4gIHRyYW5zZm9ybVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgY29uc3QgY2IgPSAocmVzLCB0cmFuc2Zvcm0pID0+XG4gICAgICB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb25cbiAgICAgICAgPyB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb24ocmVzLCByZXN1bHRTb0ZhcilcbiAgICAgICAgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIsIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1lcidzIGBvbkVuZFJlc3VsdGAgbWV0aG9kIHRvIHRoZVxuICAgKiB0ZW1wbGF0ZSBsaXRlcmFsIGFmdGVyIGFsbCBzdWJzdGl0dXRpb25zIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBlbmRSZXN1bHQgLSBUaGUgcHJvY2Vzc2VkIHRlbXBsYXRlLCBqdXN0IGJlZm9yZSBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZSB0YWdcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgLSBUaGUgZmluYWwgcmVzdWx0cyBvZiBwcm9jZXNzaW5nIGVhY2ggdHJhbnNmb3JtZXJcbiAgICovXG4gIHRyYW5zZm9ybUVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBjb25zdCBjYiA9IChyZXMsIHRyYW5zZm9ybSkgPT5cbiAgICAgIHRyYW5zZm9ybS5vbkVuZFJlc3VsdCA/IHRyYW5zZm9ybS5vbkVuZFJlc3VsdChyZXMpIDogcmVzO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybWVycy5yZWR1Y2UoY2IsIGVuZFJlc3VsdCk7XG4gIH1cbn1cbiJdfQ==","var defaults = {\n separator: '',\n conjunction: '',\n serial: false\n};\n\n/**\n * Converts an array substitution to a string containing a list\n * @param {String} [opts.separator = ''] - the character that separates each item\n * @param {String} [opts.conjunction = ''] - replace the last separator with this\n * @param {Boolean} [opts.serial = false] - include the separator before the conjunction? (Oxford comma use-case)\n *\n * @return {Object} - a TemplateTag transformer\n */\nvar inlineArrayTransformer = function inlineArrayTransformer() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaults;\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n // only operate on arrays\n if (Array.isArray(substitution)) {\n var arrayLength = substitution.length;\n var separator = opts.separator;\n var conjunction = opts.conjunction;\n var serial = opts.serial;\n // join each item in the array into a string where each item is separated by separator\n // be sure to maintain indentation\n var indent = resultSoFar.match(/(\\n?[^\\S\\n]+)$/);\n if (indent) {\n substitution = substitution.join(separator + indent[1]);\n } else {\n substitution = substitution.join(separator + ' ');\n }\n // if conjunction is set, replace the last separator with conjunction, but only if there is more than one substitution\n if (conjunction && arrayLength > 1) {\n var separatorIndex = substitution.lastIndexOf(separator);\n substitution = substitution.slice(0, separatorIndex) + (serial ? separator : '') + ' ' + conjunction + substitution.slice(separatorIndex + 1);\n }\n }\n return substitution;\n }\n };\n};\n\nexport default inlineArrayTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVBcnJheVRyYW5zZm9ybWVyL2lubGluZUFycmF5VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiZGVmYXVsdHMiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiIsInNlcmlhbCIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJvcHRzIiwib25TdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJyZXN1bHRTb0ZhciIsIkFycmF5IiwiaXNBcnJheSIsImFycmF5TGVuZ3RoIiwibGVuZ3RoIiwiaW5kZW50IiwibWF0Y2giLCJqb2luIiwic2VwYXJhdG9ySW5kZXgiLCJsYXN0SW5kZXhPZiIsInNsaWNlIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxXQUFXO0FBQ2ZDLGFBQVcsRUFESTtBQUVmQyxlQUFhLEVBRkU7QUFHZkMsVUFBUTtBQUhPLENBQWpCOztBQU1BOzs7Ozs7OztBQVFBLElBQU1DLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUUwsUUFBUjtBQUFBLFNBQXNCO0FBQ25ETSxrQkFEbUQsMEJBQ3BDQyxZQURvQyxFQUN0QkMsV0FEc0IsRUFDVDtBQUN4QztBQUNBLFVBQUlDLE1BQU1DLE9BQU4sQ0FBY0gsWUFBZCxDQUFKLEVBQWlDO0FBQy9CLFlBQU1JLGNBQWNKLGFBQWFLLE1BQWpDO0FBQ0EsWUFBTVgsWUFBWUksS0FBS0osU0FBdkI7QUFDQSxZQUFNQyxjQUFjRyxLQUFLSCxXQUF6QjtBQUNBLFlBQU1DLFNBQVNFLEtBQUtGLE1BQXBCO0FBQ0E7QUFDQTtBQUNBLFlBQU1VLFNBQVNMLFlBQVlNLEtBQVosQ0FBa0IsZ0JBQWxCLENBQWY7QUFDQSxZQUFJRCxNQUFKLEVBQVk7QUFDVk4seUJBQWVBLGFBQWFRLElBQWIsQ0FBa0JkLFlBQVlZLE9BQU8sQ0FBUCxDQUE5QixDQUFmO0FBQ0QsU0FGRCxNQUVPO0FBQ0xOLHlCQUFlQSxhQUFhUSxJQUFiLENBQWtCZCxZQUFZLEdBQTlCLENBQWY7QUFDRDtBQUNEO0FBQ0EsWUFBSUMsZUFBZVMsY0FBYyxDQUFqQyxFQUFvQztBQUNsQyxjQUFNSyxpQkFBaUJULGFBQWFVLFdBQWIsQ0FBeUJoQixTQUF6QixDQUF2QjtBQUNBTSx5QkFDRUEsYUFBYVcsS0FBYixDQUFtQixDQUFuQixFQUFzQkYsY0FBdEIsS0FDQ2IsU0FBU0YsU0FBVCxHQUFxQixFQUR0QixJQUVBLEdBRkEsR0FHQUMsV0FIQSxHQUlBSyxhQUFhVyxLQUFiLENBQW1CRixpQkFBaUIsQ0FBcEMsQ0FMRjtBQU1EO0FBQ0Y7QUFDRCxhQUFPVCxZQUFQO0FBQ0Q7QUE1QmtELEdBQXRCO0FBQUEsQ0FBL0I7O0FBK0JBLGVBQWVILHNCQUFmIiwiZmlsZSI6ImlubGluZUFycmF5VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWZhdWx0cyA9IHtcbiAgc2VwYXJhdG9yOiAnJyxcbiAgY29uanVuY3Rpb246ICcnLFxuICBzZXJpYWw6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBzdWJzdGl0dXRpb24gdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gJyddIC0gdGhlIGNoYXJhY3RlciB0aGF0IHNlcGFyYXRlcyBlYWNoIGl0ZW1cbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuY29uanVuY3Rpb24gPSAnJ10gIC0gcmVwbGFjZSB0aGUgbGFzdCBzZXBhcmF0b3Igd2l0aCB0aGlzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbb3B0cy5zZXJpYWwgPSBmYWxzZV0gLSBpbmNsdWRlIHRoZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBjb25qdW5jdGlvbj8gKE94Zm9yZCBjb21tYSB1c2UtY2FzZSlcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgPSAob3B0cyA9IGRlZmF1bHRzKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgLy8gb25seSBvcGVyYXRlIG9uIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gc3Vic3RpdHV0aW9uLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9IG9wdHMuc2VwYXJhdG9yO1xuICAgICAgY29uc3QgY29uanVuY3Rpb24gPSBvcHRzLmNvbmp1bmN0aW9uO1xuICAgICAgY29uc3Qgc2VyaWFsID0gb3B0cy5zZXJpYWw7XG4gICAgICAvLyBqb2luIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgaW50byBhIHN0cmluZyB3aGVyZSBlYWNoIGl0ZW0gaXMgc2VwYXJhdGVkIGJ5IHNlcGFyYXRvclxuICAgICAgLy8gYmUgc3VyZSB0byBtYWludGFpbiBpbmRlbnRhdGlvblxuICAgICAgY29uc3QgaW5kZW50ID0gcmVzdWx0U29GYXIubWF0Y2goLyhcXG4/W15cXFNcXG5dKykkLyk7XG4gICAgICBpZiAoaW5kZW50KSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5qb2luKHNlcGFyYXRvciArIGluZGVudFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24uam9pbihzZXBhcmF0b3IgKyAnICcpO1xuICAgICAgfVxuICAgICAgLy8gaWYgY29uanVuY3Rpb24gaXMgc2V0LCByZXBsYWNlIHRoZSBsYXN0IHNlcGFyYXRvciB3aXRoIGNvbmp1bmN0aW9uLCBidXQgb25seSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHN1YnN0aXR1dGlvblxuICAgICAgaWYgKGNvbmp1bmN0aW9uICYmIGFycmF5TGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHN1YnN0aXR1dGlvbi5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBzdWJzdGl0dXRpb24gPVxuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkgK1xuICAgICAgICAgIChzZXJpYWwgPyBzZXBhcmF0b3IgOiAnJykgK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgY29uanVuY3Rpb24gK1xuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGlubGluZUFycmF5VHJhbnNmb3JtZXI7XG4iXX0=","function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * strips indentation from a template literal\n * @param {String} type = 'initial' - whether to remove all indentation or just leading indentation. can be 'all' or 'initial'\n * @return {Object} - a TemplateTag transformer\n */\nvar stripIndentTransformer = function stripIndentTransformer() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'initial';\n return {\n onEndResult: function onEndResult(endResult) {\n if (type === 'initial') {\n // remove the shortest leading indentation from each line\n var match = endResult.match(/^[^\\S\\n]*(?=\\S)/gm);\n var indent = match && Math.min.apply(Math, _toConsumableArray(match.map(function (el) {\n return el.length;\n })));\n if (indent) {\n var regexp = new RegExp('^.{' + indent + '}', 'gm');\n return endResult.replace(regexp, '');\n }\n return endResult;\n }\n if (type === 'all') {\n // remove all indentation from each line\n return endResult.replace(/^[^\\S\\n]+/gm, '');\n }\n throw new Error('Unknown type: ' + type);\n }\n };\n};\n\nexport default stripIndentTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudFRyYW5zZm9ybWVyL3N0cmlwSW5kZW50VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInR5cGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIm1hdGNoIiwiaW5kZW50IiwiTWF0aCIsIm1pbiIsIm1hcCIsImVsIiwibGVuZ3RoIiwicmVnZXhwIiwiUmVnRXhwIiwicmVwbGFjZSIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7OztBQUtBLElBQU1BLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUSxTQUFSO0FBQUEsU0FBdUI7QUFDcERDLGVBRG9ELHVCQUN4Q0MsU0FEd0MsRUFDN0I7QUFDckIsVUFBSUYsU0FBUyxTQUFiLEVBQXdCO0FBQ3RCO0FBQ0EsWUFBTUcsUUFBUUQsVUFBVUMsS0FBVixDQUFnQixtQkFBaEIsQ0FBZDtBQUNBLFlBQU1DLFNBQVNELFNBQVNFLEtBQUtDLEdBQUwsZ0NBQVlILE1BQU1JLEdBQU4sQ0FBVTtBQUFBLGlCQUFNQyxHQUFHQyxNQUFUO0FBQUEsU0FBVixDQUFaLEVBQXhCO0FBQ0EsWUFBSUwsTUFBSixFQUFZO0FBQ1YsY0FBTU0sU0FBUyxJQUFJQyxNQUFKLFNBQWlCUCxNQUFqQixRQUE0QixJQUE1QixDQUFmO0FBQ0EsaUJBQU9GLFVBQVVVLE9BQVYsQ0FBa0JGLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDtBQUNELGVBQU9SLFNBQVA7QUFDRDtBQUNELFVBQUlGLFNBQVMsS0FBYixFQUFvQjtBQUNsQjtBQUNBLGVBQU9FLFVBQVVVLE9BQVYsQ0FBa0IsYUFBbEIsRUFBaUMsRUFBakMsQ0FBUDtBQUNEO0FBQ0QsWUFBTSxJQUFJQyxLQUFKLG9CQUEyQmIsSUFBM0IsQ0FBTjtBQUNEO0FBakJtRCxHQUF2QjtBQUFBLENBQS9COztBQW9CQSxlQUFlRCxzQkFBZiIsImZpbGUiOiJzdHJpcEluZGVudFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdHJpcHMgaW5kZW50YXRpb24gZnJvbSBhIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSA9ICdpbml0aWFsJyAtIHdoZXRoZXIgdG8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBvciBqdXN0IGxlYWRpbmcgaW5kZW50YXRpb24uIGNhbiBiZSAnYWxsJyBvciAnaW5pdGlhbCdcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAtIGEgVGVtcGxhdGVUYWcgdHJhbnNmb3JtZXJcbiAqL1xuY29uc3Qgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciA9ICh0eXBlID0gJ2luaXRpYWwnKSA9PiAoe1xuICBvbkVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBpZiAodHlwZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAvLyByZW1vdmUgdGhlIHNob3J0ZXN0IGxlYWRpbmcgaW5kZW50YXRpb24gZnJvbSBlYWNoIGxpbmVcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kUmVzdWx0Lm1hdGNoKC9eW15cXFNcXG5dKig/PVxcUykvZ20pO1xuICAgICAgY29uc3QgaW5kZW50ID0gbWF0Y2ggJiYgTWF0aC5taW4oLi4ubWF0Y2gubWFwKGVsID0+IGVsLmxlbmd0aCkpO1xuICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGBeLnske2luZGVudH19YCwgJ2dtJyk7XG4gICAgICAgIHJldHVybiBlbmRSZXN1bHQucmVwbGFjZShyZWdleHAsICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbmRSZXN1bHQ7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnYWxsJykge1xuICAgICAgLy8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggbGluZVxuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eW15cXFNcXG5dKy9nbSwgJycpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZTogJHt0eXBlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXI7XG4iXX0=","/**\n * TemplateTag transformer that trims whitespace on the end result of a tagged template\n * @param {String} side = '' - The side of the string to trim. Can be 'start' or 'end' (alternatively 'left' or 'right')\n * @return {Object} - a TemplateTag transformer\n */\nvar trimResultTransformer = function trimResultTransformer() {\n var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return {\n onEndResult: function onEndResult(endResult) {\n if (side === '') {\n return endResult.trim();\n }\n\n side = side.toLowerCase();\n\n if (side === 'start' || side === 'left') {\n return endResult.replace(/^\\s*/, '');\n }\n\n if (side === 'end' || side === 'right') {\n return endResult.replace(/\\s*$/, '');\n }\n\n throw new Error('Side not supported: ' + side);\n }\n };\n};\n\nexport default trimResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmltUmVzdWx0VHJhbnNmb3JtZXIvdHJpbVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNpZGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBS0EsSUFBTUEsd0JBQXdCLFNBQXhCQSxxQkFBd0I7QUFBQSxNQUFDQyxJQUFELHVFQUFRLEVBQVI7QUFBQSxTQUFnQjtBQUM1Q0MsZUFENEMsdUJBQ2hDQyxTQURnQyxFQUNyQjtBQUNyQixVQUFJRixTQUFTLEVBQWIsRUFBaUI7QUFDZixlQUFPRSxVQUFVQyxJQUFWLEVBQVA7QUFDRDs7QUFFREgsYUFBT0EsS0FBS0ksV0FBTCxFQUFQOztBQUVBLFVBQUlKLFNBQVMsT0FBVCxJQUFvQkEsU0FBUyxNQUFqQyxFQUF5QztBQUN2QyxlQUFPRSxVQUFVRyxPQUFWLENBQWtCLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDs7QUFFRCxVQUFJTCxTQUFTLEtBQVQsSUFBa0JBLFNBQVMsT0FBL0IsRUFBd0M7QUFDdEMsZUFBT0UsVUFBVUcsT0FBVixDQUFrQixNQUFsQixFQUEwQixFQUExQixDQUFQO0FBQ0Q7O0FBRUQsWUFBTSxJQUFJQyxLQUFKLDBCQUFpQ04sSUFBakMsQ0FBTjtBQUNEO0FBakIyQyxHQUFoQjtBQUFBLENBQTlCOztBQW9CQSxlQUFlRCxxQkFBZiIsImZpbGUiOiJ0cmltUmVzdWx0VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyIHRoYXQgdHJpbXMgd2hpdGVzcGFjZSBvbiB0aGUgZW5kIHJlc3VsdCBvZiBhIHRhZ2dlZCB0ZW1wbGF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBzaWRlID0gJycgLSBUaGUgc2lkZSBvZiB0aGUgc3RyaW5nIHRvIHRyaW0uIENhbiBiZSAnc3RhcnQnIG9yICdlbmQnIChhbHRlcm5hdGl2ZWx5ICdsZWZ0JyBvciAncmlnaHQnKVxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciA9IChzaWRlID0gJycpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChzaWRlID09PSAnJykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC50cmltKCk7XG4gICAgfVxuXG4gICAgc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChzaWRlID09PSAnc3RhcnQnIHx8IHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eXFxzKi8sICcnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gJ2VuZCcgfHwgc2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZGUgbm90IHN1cHBvcnRlZDogJHtzaWRlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lcjtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzL2NvbW1hTGlzdHMuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHMiLCJzZXBhcmF0b3IiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGFBQWEsSUFBSUosV0FBSixDQUNqQkUsdUJBQXVCLEVBQUVHLFdBQVcsR0FBYixFQUF2QixDQURpQixFQUVqQkosc0JBRmlCLEVBR2pCRSxxQkFIaUIsQ0FBbkI7O0FBTUEsZUFBZUMsVUFBZiIsImZpbGUiOiJjb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGNvbW1hTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzQW5kL2NvbW1hTGlzdHNBbmQuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHNBbmQiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZ0JBQWdCLElBQUlKLFdBQUosQ0FDcEJFLHVCQUF1QixFQUFFRyxXQUFXLEdBQWIsRUFBa0JDLGFBQWEsS0FBL0IsRUFBdkIsQ0FEb0IsRUFFcEJMLHNCQUZvQixFQUdwQkUscUJBSG9CLENBQXRCOztBQU1BLGVBQWVDLGFBQWYiLCJmaWxlIjoiY29tbWFMaXN0c0FuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzT3IvY29tbWFMaXN0c09yLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJjb21tYUxpc3RzT3IiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSixXQUFKLENBQ25CRSx1QkFBdUIsRUFBRUcsV0FBVyxHQUFiLEVBQWtCQyxhQUFhLElBQS9CLEVBQXZCLENBRG1CLEVBRW5CTCxzQkFGbUIsRUFHbkJFLHFCQUhtQixDQUFyQjs7QUFNQSxlQUFlQyxZQUFmIiwiZmlsZSI6ImNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzT3IgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJywgY29uanVuY3Rpb246ICdvcicgfSksXG4gIHN0cmlwSW5kZW50VHJhbnNmb3JtZXIsXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hTGlzdHNPcjtcbiJdfQ==","var splitStringTransformer = function splitStringTransformer(splitBy) {\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n if (splitBy != null && typeof splitBy === 'string') {\n if (typeof substitution === 'string' && substitution.includes(splitBy)) {\n substitution = substitution.split(splitBy);\n }\n } else {\n throw new Error('You need to specify a string character to split by.');\n }\n return substitution;\n }\n };\n};\n\nexport default splitStringTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyL3NwbGl0U3RyaW5nVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwicmVzdWx0U29GYXIiLCJzcGxpdEJ5IiwiaW5jbHVkZXMiLCJzcGxpdCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSx5QkFBeUIsU0FBekJBLHNCQUF5QjtBQUFBLFNBQVk7QUFDekNDLGtCQUR5QywwQkFDMUJDLFlBRDBCLEVBQ1pDLFdBRFksRUFDQztBQUN4QyxVQUFJQyxXQUFXLElBQVgsSUFBbUIsT0FBT0EsT0FBUCxLQUFtQixRQUExQyxFQUFvRDtBQUNsRCxZQUFJLE9BQU9GLFlBQVAsS0FBd0IsUUFBeEIsSUFBb0NBLGFBQWFHLFFBQWIsQ0FBc0JELE9BQXRCLENBQXhDLEVBQXdFO0FBQ3RFRix5QkFBZUEsYUFBYUksS0FBYixDQUFtQkYsT0FBbkIsQ0FBZjtBQUNEO0FBQ0YsT0FKRCxNQUlPO0FBQ0wsY0FBTSxJQUFJRyxLQUFKLENBQVUscURBQVYsQ0FBTjtBQUNEO0FBQ0QsYUFBT0wsWUFBUDtBQUNEO0FBVndDLEdBQVo7QUFBQSxDQUEvQjs7QUFhQSxlQUFlRixzQkFBZiIsImZpbGUiOiJzcGxpdFN0cmluZ1RyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciA9IHNwbGl0QnkgPT4gKHtcbiAgb25TdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCByZXN1bHRTb0Zhcikge1xuICAgIGlmIChzcGxpdEJ5ICE9IG51bGwgJiYgdHlwZW9mIHNwbGl0QnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHN1YnN0aXR1dGlvbiA9PT0gJ3N0cmluZycgJiYgc3Vic3RpdHV0aW9uLmluY2x1ZGVzKHNwbGl0QnkpKSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5zcGxpdChzcGxpdEJ5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IGEgc3RyaW5nIGNoYXJhY3RlciB0byBzcGxpdCBieS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyO1xuIl19","var isValidValue = function isValidValue(x) {\n return x != null && !Number.isNaN(x) && typeof x !== 'boolean';\n};\n\nvar removeNonPrintingValuesTransformer = function removeNonPrintingValuesTransformer() {\n return {\n onSubstitution: function onSubstitution(substitution) {\n if (Array.isArray(substitution)) {\n return substitution.filter(isValidValue);\n }\n if (isValidValue(substitution)) {\n return substitution;\n }\n return '';\n }\n };\n};\n\nexport default removeNonPrintingValuesTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiaXNWYWxpZFZhbHVlIiwieCIsIk51bWJlciIsImlzTmFOIiwicmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxlQUFlLFNBQWZBLFlBQWU7QUFBQSxTQUNuQkMsS0FBSyxJQUFMLElBQWEsQ0FBQ0MsT0FBT0MsS0FBUCxDQUFhRixDQUFiLENBQWQsSUFBaUMsT0FBT0EsQ0FBUCxLQUFhLFNBRDNCO0FBQUEsQ0FBckI7O0FBR0EsSUFBTUcscUNBQXFDLFNBQXJDQSxrQ0FBcUM7QUFBQSxTQUFPO0FBQ2hEQyxrQkFEZ0QsMEJBQ2pDQyxZQURpQyxFQUNuQjtBQUMzQixVQUFJQyxNQUFNQyxPQUFOLENBQWNGLFlBQWQsQ0FBSixFQUFpQztBQUMvQixlQUFPQSxhQUFhRyxNQUFiLENBQW9CVCxZQUFwQixDQUFQO0FBQ0Q7QUFDRCxVQUFJQSxhQUFhTSxZQUFiLENBQUosRUFBZ0M7QUFDOUIsZUFBT0EsWUFBUDtBQUNEO0FBQ0QsYUFBTyxFQUFQO0FBQ0Q7QUFUK0MsR0FBUDtBQUFBLENBQTNDOztBQVlBLGVBQWVGLGtDQUFmIiwiZmlsZSI6InJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1ZhbGlkVmFsdWUgPSB4ID0+XG4gIHggIT0gbnVsbCAmJiAhTnVtYmVyLmlzTmFOKHgpICYmIHR5cGVvZiB4ICE9PSAnYm9vbGVhbic7XG5cbmNvbnN0IHJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIgPSAoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJzdGl0dXRpb24pKSB7XG4gICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmZpbHRlcihpc1ZhbGlkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNWYWxpZFZhbHVlKHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport removeNonPrintingValuesTransformer from '../removeNonPrintingValuesTransformer';\n\nvar html = new TemplateTag(splitStringTransformer('\\n'), removeNonPrintingValuesTransformer, inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default html;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odG1sL2h0bWwuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNwbGl0U3RyaW5nVHJhbnNmb3JtZXIiLCJyZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIiwiaHRtbCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxrQ0FBUCxNQUErQyx1Q0FBL0M7O0FBRUEsSUFBTUMsT0FBTyxJQUFJTixXQUFKLENBQ1hJLHVCQUF1QixJQUF2QixDQURXLEVBRVhDLGtDQUZXLEVBR1hILHNCQUhXLEVBSVhELHNCQUpXLEVBS1hFLHFCQUxXLENBQWI7O0FBUUEsZUFBZUcsSUFBZiIsImZpbGUiOiJodG1sLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciBmcm9tICcuLi9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyJztcbmltcG9ydCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIGZyb20gJy4uL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXInO1xuXG5jb25zdCBodG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lcixcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgaHRtbDtcbiJdfQ==","var replaceSubstitutionTransformer = function replaceSubstitutionTransformer(replaceWhat, replaceWith) {\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error('replaceSubstitutionTransformer requires at least 2 arguments.');\n }\n\n // Do not touch if null or undefined\n if (substitution == null) {\n return substitution;\n } else {\n return substitution.toString().replace(replaceWhat, replaceWith);\n }\n }\n };\n};\n\nexport default replaceSubstitutionTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIvcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvblN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInJlc3VsdFNvRmFyIiwiRXJyb3IiLCJ0b1N0cmluZyIsInJlcGxhY2UiXSwibWFwcGluZ3MiOiJBQUFBLElBQU1BLGlDQUFpQyxTQUFqQ0EsOEJBQWlDLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQ3BFQyxrQkFEb0UsMEJBQ3JEQyxZQURxRCxFQUN2Q0MsV0FEdUMsRUFDMUI7QUFDeEMsVUFBSUosZUFBZSxJQUFmLElBQXVCQyxlQUFlLElBQTFDLEVBQWdEO0FBQzlDLGNBQU0sSUFBSUksS0FBSixDQUNKLCtEQURJLENBQU47QUFHRDs7QUFFRDtBQUNBLFVBQUlGLGdCQUFnQixJQUFwQixFQUEwQjtBQUN4QixlQUFPQSxZQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBT0EsYUFBYUcsUUFBYixHQUF3QkMsT0FBeEIsQ0FBZ0NQLFdBQWhDLEVBQTZDQyxXQUE3QyxDQUFQO0FBQ0Q7QUFDRjtBQWRtRSxHQUEvQjtBQUFBLENBQXZDOztBQWlCQSxlQUFlRiw4QkFBZiIsImZpbGUiOiJyZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIgPSAocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgaWYgKHJlcGxhY2VXaGF0ID09IG51bGwgfHwgcmVwbGFjZVdpdGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIHJlcXVpcmVzIGF0IGxlYXN0IDIgYXJndW1lbnRzLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERvIG5vdCB0b3VjaCBpZiBudWxsIG9yIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzdGl0dXRpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbi50b1N0cmluZygpLnJlcGxhY2UocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport replaceSubstitutionTransformer from '../replaceSubstitutionTransformer';\n\nvar safeHtml = new TemplateTag(splitStringTransformer('\\n'), inlineArrayTransformer, stripIndentTransformer, trimResultTransformer, replaceSubstitutionTransformer(/&/g, '&'), replaceSubstitutionTransformer(/</g, '<'), replaceSubstitutionTransformer(/>/g, '>'), replaceSubstitutionTransformer(/\"/g, '"'), replaceSubstitutionTransformer(/'/g, '''), replaceSubstitutionTransformer(/`/g, '`'));\n\nexport default safeHtml;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zYWZlSHRtbC9zYWZlSHRtbC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInNhZmVIdG1sIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLDhCQUFQLE1BQTJDLG1DQUEzQzs7QUFFQSxJQUFNQyxXQUFXLElBQUlOLFdBQUosQ0FDZkksdUJBQXVCLElBQXZCLENBRGUsRUFFZkYsc0JBRmUsRUFHZkQsc0JBSGUsRUFJZkUscUJBSmUsRUFLZkUsK0JBQStCLElBQS9CLEVBQXFDLE9BQXJDLENBTGUsRUFNZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBTmUsRUFPZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBUGUsRUFRZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBUmUsRUFTZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVGUsRUFVZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVmUsQ0FBakI7O0FBYUEsZUFBZUMsUUFBZiIsImZpbGUiOiJzYWZlSHRtbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHNwbGl0U3RyaW5nVHJhbnNmb3JtZXIgZnJvbSAnLi4vc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcic7XG5cbmNvbnN0IHNhZmVIdG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLyYvZywgJyZhbXA7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvPC9nLCAnJmx0OycpLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLz4vZywgJyZndDsnKSxcbiAgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyKC9cIi9nLCAnJnF1b3Q7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvJy9nLCAnJiN4Mjc7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvYC9nLCAnJiN4NjA7JyksXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBzYWZlSHRtbDtcbiJdfQ==","/**\n * Replaces tabs, newlines and spaces with the chosen value when they occur in sequences\n * @param {(String|RegExp)} replaceWhat - the value or pattern that should be replaced\n * @param {*} replaceWith - the replacement value\n * @return {Object} - a TemplateTag transformer\n */\nvar replaceResultTransformer = function replaceResultTransformer(replaceWhat, replaceWith) {\n return {\n onEndResult: function onEndResult(endResult) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error('replaceResultTransformer requires at least 2 arguments.');\n }\n return endResult.replace(replaceWhat, replaceWith);\n }\n };\n};\n\nexport default replaceResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIvcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIkVycm9yIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQU1BLElBQU1BLDJCQUEyQixTQUEzQkEsd0JBQTJCLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQzlEQyxlQUQ4RCx1QkFDbERDLFNBRGtELEVBQ3ZDO0FBQ3JCLFVBQUlILGVBQWUsSUFBZixJQUF1QkMsZUFBZSxJQUExQyxFQUFnRDtBQUM5QyxjQUFNLElBQUlHLEtBQUosQ0FDSix5REFESSxDQUFOO0FBR0Q7QUFDRCxhQUFPRCxVQUFVRSxPQUFWLENBQWtCTCxXQUFsQixFQUErQkMsV0FBL0IsQ0FBUDtBQUNEO0FBUjZELEdBQS9CO0FBQUEsQ0FBakM7O0FBV0EsZUFBZUYsd0JBQWYiLCJmaWxlIjoicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBsYWNlcyB0YWJzLCBuZXdsaW5lcyBhbmQgc3BhY2VzIHdpdGggdGhlIGNob3NlbiB2YWx1ZSB3aGVuIHRoZXkgb2NjdXIgaW4gc2VxdWVuY2VzXG4gKiBAcGFyYW0gIHsoU3RyaW5nfFJlZ0V4cCl9IHJlcGxhY2VXaGF0IC0gdGhlIHZhbHVlIG9yIHBhdHRlcm4gdGhhdCBzaG91bGQgYmUgcmVwbGFjZWRcbiAqIEBwYXJhbSAgeyp9ICAgICAgICAgICAgICAgcmVwbGFjZVdpdGggLSB0aGUgcmVwbGFjZW1lbnQgdmFsdWVcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciA9IChyZXBsYWNlV2hhdCwgcmVwbGFjZVdpdGgpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChyZXBsYWNlV2hhdCA9PSBudWxsIHx8IHJlcGxhY2VXaXRoID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciByZXF1aXJlcyBhdCBsZWFzdCAyIGFyZ3VtZW50cy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKHJlcGxhY2VXaGF0LCByZXBsYWNlV2l0aCk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLine = new TemplateTag(replaceResultTransformer(/(?:\\n(?:\\s*))+/g, ' '), trimResultTransformer);\n\nexport default oneLine;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lL29uZUxpbmUuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxVQUFVLElBQUlILFdBQUosQ0FDZEUseUJBQXlCLGlCQUF6QixFQUE0QyxHQUE1QyxDQURjLEVBRWRELHFCQUZjLENBQWhCOztBQUtBLGVBQWVFLE9BQWYiLCJmaWxlIjoib25lTGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmUgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxuKD86XFxzKikpKy9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lO1xuIl19","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineTrim = new TemplateTag(replaceResultTransformer(/(?:\\n\\s*)/g, ''), trimResultTransformer);\n\nexport default oneLineTrim;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lVHJpbS9vbmVMaW5lVHJpbS5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVUcmltIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxjQUFjLElBQUlILFdBQUosQ0FDbEJFLHlCQUF5QixZQUF6QixFQUF1QyxFQUF2QyxDQURrQixFQUVsQkQscUJBRmtCLENBQXBCOztBQUtBLGVBQWVFLFdBQWYiLCJmaWxlIjoib25lTGluZVRyaW0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lVHJpbSA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXG5cXHMqKS9nLCAnJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVUcmltO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0cy9vbmVMaW5lQ29tbWFMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0cyIsInNlcGFyYXRvciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMsb0JBQW9CLElBQUlKLFdBQUosQ0FDeEJDLHVCQUF1QixFQUFFSSxXQUFXLEdBQWIsRUFBdkIsQ0FEd0IsRUFFeEJGLHlCQUF5QixVQUF6QixFQUFxQyxHQUFyQyxDQUZ3QixFQUd4QkQscUJBSHdCLENBQTFCOztBQU1BLGVBQWVFLGlCQUFmIiwiZmlsZSI6Im9uZUxpbmVDb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lQ29tbWFMaXN0cyA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnIH0pLFxuICByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIoLyg/OlxccyspL2csICcgJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVDb21tYUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c09yL29uZUxpbmVDb21tYUxpc3RzT3IuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIiwib25lTGluZUNvbW1hTGlzdHNPciIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxzQkFBc0IsSUFBSUosV0FBSixDQUMxQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxJQUEvQixFQUF2QixDQUQwQixFQUUxQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjBCLEVBRzFCRCxxQkFIMEIsQ0FBNUI7O0FBTUEsZUFBZUUsbUJBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgb25lTGluZUNvbW1hTGlzdHNPciA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnLCBjb25qdW5jdGlvbjogJ29yJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c09yO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c0FuZC9vbmVMaW5lQ29tbWFMaXN0c0FuZC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0c0FuZCIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyx1QkFBdUIsSUFBSUosV0FBSixDQUMzQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxLQUEvQixFQUF2QixDQUQyQixFQUUzQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjJCLEVBRzNCRCxxQkFIMkIsQ0FBN0I7O0FBTUEsZUFBZUUsb0JBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNBbmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmVDb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar inlineLists = new TemplateTag(inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default inlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVMaXN0cy9pbmxpbmVMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwiaW5saW5lTGlzdHMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGNBQWMsSUFBSUosV0FBSixDQUNsQkUsc0JBRGtCLEVBRWxCRCxzQkFGa0IsRUFHbEJFLHFCQUhrQixDQUFwQjs7QUFNQSxlQUFlQyxXQUFmIiwiZmlsZSI6ImlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGlubGluZUxpc3RzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyLFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBpbmxpbmVMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineInlineLists = new TemplateTag(inlineArrayTransformer, replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineInlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lSW5saW5lTGlzdHMvb25lTGluZUlubGluZUxpc3RzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVJbmxpbmVMaXN0cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMscUJBQXFCLElBQUlKLFdBQUosQ0FDekJDLHNCQUR5QixFQUV6QkUseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRnlCLEVBR3pCRCxxQkFIeUIsQ0FBM0I7O0FBTUEsZUFBZUUsa0JBQWYiLCJmaWxlIjoib25lTGluZUlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lSW5saW5lTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIsXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxzKykvZywgJyAnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgb25lTGluZUlubGluZUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndent = new TemplateTag(stripIndentTransformer, trimResultTransformer);\n\nexport default stripIndent;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudC9zdHJpcEluZGVudC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJzdHJpcEluZGVudCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsY0FBYyxJQUFJSCxXQUFKLENBQ2xCQyxzQkFEa0IsRUFFbEJDLHFCQUZrQixDQUFwQjs7QUFLQSxlQUFlQyxXQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBzdHJpcEluZGVudCA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnQ7XG4iXX0=","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndents = new TemplateTag(stripIndentTransformer('all'), trimResultTransformer);\n\nexport default stripIndents;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudHMvc3RyaXBJbmRlbnRzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInN0cmlwSW5kZW50cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSCxXQUFKLENBQ25CQyx1QkFBdUIsS0FBdkIsQ0FEbUIsRUFFbkJDLHFCQUZtQixDQUFyQjs7QUFLQSxlQUFlQyxZQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgc3RyaXBJbmRlbnRzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyKCdhbGwnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnRzO1xuIl19","import { stripIndents } from 'common-tags';\n\nimport { LogsQueryLanguage } from '../../types';\n\nexport interface SampleQuery {\n title: string;\n expr: Partial<Record<LogsQueryLanguage, string>>;\n}\n\nconst sqlOnlyGeneralQueries: SampleQuery[] = [\n {\n title:\n 'Use the JOIN command to match events between two log groups (LogGroupA, LogGroupB), based on common user IDs across the logs. ',\n expr: {\n SQL: stripIndents`SELECT A.transaction_id as txn_id_a, A.userId , A.instance_id as inst_id_a, B.instance_id as inst_id_b FROM \\`LogGroupA\\` as A INNER JOIN \\`LogGroupB\\` as B ON A.userId = B.userId WHERE B.Status='ERROR'`,\n },\n },\n {\n title: 'Find logs where duration is greater than the average duration of all log groups, using a sub-query',\n expr: {\n SQL: stripIndents`SELECT \\`@duration\\` FROM \\`LogGroupA\\`\n WHERE \\`@duration\\` > (\n SELECT avg(\\`@duration\\`) FROM \\`LogGroupA\\`\n WHERE \\`@type\\` = 'REPORT')`,\n },\n },\n {\n title:\n 'Find all logs relating to a Lambda function where level is ERROR, and order these logs by request id using a sub-query',\n expr: {\n SQL: stripIndents`select requestId, level, \\`@timestamp\\`, \\`@message\\` from \\`LogGroupA\\` where requestId IN (SELECT distinct\n requestId FROM \\`LogGroupA\\` where level = 'ERROR') order by requestId`,\n },\n },\n {\n title: 'Find error logs from high-volume log streams using a sub-query. ',\n expr: {\n SQL: stripIndents`SELECT \n \\`@logStream\\`,\n COUNT(*) as error_count\n FROM \\`LogGroupA\\`\n WHERE \n \\`start\\` >= date_sub(current_timestamp(), 1)\n AND lower(\\`@message\\`) LIKE '%error%'\n AND \\`@logStream\\` IN (\n SELECT \\`@logStream\\`\n FROM \\`logs\\`\n GROUP BY \\`@logStream\\`\n HAVING COUNT(*) > 1000\n )\n GROUP BY \\`@logStream\\`\n ORDER BY error_count DESC`,\n },\n },\n {\n title: 'Extract parameter values from a JSON log group',\n expr: {\n SQL: stripIndents`SELECT query_name, get_json_object(\\`@message\\`, '$.answers[*].Rdata')\n AS answers FROM \\`LogGroupA\\` Where query_type = 'A'`,\n },\n },\n {\n title: 'Find the intersection of elements for two columns based on eventName.',\n expr: {\n SQL: stripIndents`SELECT array_intersect(\n array(get_json_object(\\`column1\\`, '$.eventName')),\n array(get_json_object(\\`column2\\`, '$.eventName'))\n ) as matching_events\n FROM \\`LogGroupA\\`;`,\n },\n },\n {\n title: 'Return the top 25 most recently added log events.',\n expr: {\n SQL: 'SELECT `@timestamp`, `@message` FROM `LogGroupA` ORDER BY `@timestamp` DESC LIMIT 25;',\n },\n },\n {\n title: 'Find the number of exceptions logged every five minutes.',\n expr: {\n SQL: `SELECT window.start, COUNT(*) AS exceptionCount FROM \\`LogGroupA\\` WHERE \\`@message\\` LIKE '%Exception%' GROUP BY window(\\`@timestamp\\`, '5 minute') ORDER BY exceptionCount DESC`,\n },\n },\n {\n title: 'Return a list of log events that are not exceptions.',\n expr: {\n SQL: `SELECT \\`@message\\` FROM \\`LogGroupA\\` WHERE \\`@message\\` NOT LIKE '%Exception%'`,\n },\n },\n {\n title: 'Identify faults on API calls.',\n expr: {\n SQL: 'Select @timestamp, @logStream as instanceId, ExceptionMessage from `LogGroupA` where Operation = \"x\" and Fault > 0',\n },\n },\n {\n title:\n 'Return the number of exceptions logged every five minutes using regex where exception is not case sensitive.',\n expr: {\n SQL: `SELECT window.start, COUNT(*) AS exceptionCount FROM \\`LogGroupA\\` WHERE \\`@message\\` LIKE '%Exception%' GROUP BY window(\\`@timestamp\\`, '5 minute') ORDER BY exceptionCount DESC`,\n },\n },\n {\n title:\n 'Count the number of logs per minute over the last 24 hours, grouping them into one-minute time buckets and sorting from newest to oldest, and only consider those groups that have error_count greater than zero.',\n expr: {\n SQL: stripIndents`SELECT \n date(\\`@timestamp\\`) as log_date,\n \\`@logStream\\`,\n COUNT(*) as total_messages,\n SUM(CASE WHEN lower(\\`@message\\`) LIKE '%error%' THEN 1 ELSE 0 END) as error_count,\n SUM(CASE WHEN lower(\\`@message\\`) LIKE '%warn%' THEN 1 ELSE 0 END) as warning_count\n FROM \\`LogGroupA\\`\n WHERE \\`@timestamp\\` >= date_sub(current_timestamp(), 7)\n GROUP BY date(\\`startTime\\`), \\`@logStream\\`\n HAVING error_count > 0\n ORDER BY error_count DESC`,\n },\n },\n {\n title:\n 'Calculate the total count of logs and unique streams, along with the earliest and latest timestamps for all logs from the past 24 hours.',\n expr: {\n SQL: stripIndents`SELECT \n COUNT(*) as total_logs,\n COUNT(DISTINCT \\`@logStream\\`) as unique_streams,\n MIN(\\`@timestamp\\`) as earliest_log,\n MAX(\\`startTime\\`) as latest_log\n FROM \\`LogGroupA\\`\n WHERE \\`startTime\\` >= date_sub(current_timestamp(), 1)`,\n },\n },\n {\n title:\n \"Show the top 10 most active log streams from the past 24 hours, displaying each stream's total log count and its first and last log timestamps, sorted by highest log count first.\",\n expr: {\n SQL: stripIndents`SELECT \\`@logStream\\`, COUNT(*) as log_count, MIN(\\`@timestamp\\`) as first_seen, MAX(\\`@timestamp\\`) as last_seen FROM \\`LogGroupA\\`WHERE \\`startTime\\` >= date_sub(current_timestamp(), 24)GROUP BY \\`@logStream\\`ORDER BY log_count DESC LIMIT 10`,\n },\n },\n {\n title: 'Count the number of error messages per hour over the last 24 hours, sorted chronologically by hour.',\n expr: {\n SQL: stripIndents`SELECT \n hour(\\`@timestamp\\`) as hour_of_day,\n COUNT(*) as error_count\n FROM \\`LogGroupA\\`\n WHERE lower(\\`@message\\`) LIKE '%error%'\n AND \\`@timestamp\\` >= date_sub(current_timestamp(), 24)\n GROUP BY hour(\\`@timestamp\\`)\n ORDER BY hour_of_day`,\n },\n },\n {\n title:\n 'Categorize and count all log messages from the last 24 hours into different log levels (ERROR, WARNING, INFO, OTHER), based on message content.',\n expr: {\n SQL: stripIndents`SELECT \n CASE \n WHEN lower(\\`@message\\`) LIKE '%error%' THEN 'ERROR'\n WHEN lower(\\`@message\\`) LIKE '%warn%' THEN 'WARNING'\n WHEN lower(\\`@message\\`) LIKE '%info%' THEN 'INFO'\n ELSE 'OTHER'\n END as log_level,\n COUNT(*) as message_count\n FROM \\`LogGroupA\\`\n WHERE \\`startTime\\` >= date_sub(current_timestamp(), 1)\n GROUP BY CASE \n WHEN lower(\\`@message\\`) LIKE '%error%' THEN 'ERROR'\n WHEN lower(\\`@message\\`) LIKE '%warn%' THEN 'WARNING'\n WHEN lower(\\`@message\\`) LIKE '%info%' THEN 'INFO'\n ELSE 'OTHER'\n END\n ORDER BY message_count DESC`,\n },\n },\n {\n title:\n 'Count the number of logs per minute over the last 24 hours, and group them into one-minute time buckets and sort from newest to oldest.',\n expr: {\n SQL: stripIndents`SELECT \n date_trunc('minute', startTime) as time_bucket,\n COUNT(*) as log_count\n FROM \\`LogGroupA\\`\n WHERE startTime >= date_sub(current_timestamp(), 1)\n GROUP BY date_trunc('minute', \\`startTime\\`)\n ORDER BY time_bucket DESC`,\n },\n },\n {\n title:\n 'Find log messages that were truncated, based on analysis of the length of the @message field in the log events.',\n expr: {\n SQL: stripIndents`SELECT \n length(\\`@message\\`) as msg_length,\n COUNT(*) as count,\n MIN(\\`@message\\`) as sample_message\n FROM \\`LogGroupA\\`\n WHERE \\`startTime\\` >= date_sub(current_timestamp(), 1)\n GROUP BY length(\\`@message\\`)\n HAVING count > 10\n ORDER BY msg_length DESC\n LIMIT 10`,\n },\n },\n {\n title:\n 'Show the top 10 most common message lengths from the last 24 hours. It displays the length, count, and a sample message for each message length that appears more than 10 times, sorted by longest messages first.',\n expr: {\n SQL: 'SELECT `@logStream`, MAX(`startTime`) as last_log_time, UNIX_TIMESTAMP() - UNIX_TIMESTAMP(MAX(`startTime`)) as seconds_since_last_log FROM `LogGroupA`GROUP BY `@logStream`HAVING seconds_since_last_log > 3600 ORDER BY seconds_since_last_log DESC',\n },\n },\n {\n title:\n 'Find duplicate log messages that occurred more than 10 times in the last 24 hours, showing their count, first and last occurrence times, and number of streams they appeared in, sorted by most frequent messages first',\n expr: {\n SQL: stripIndents`SELECT \n \\`@message\\`,\n COUNT(*) as occurrence_count,\n MIN(\\`@timestamp\\`) as first_seen,\n MAX(\\`@timestamp\\`) as last_seen,\n COUNT(DISTINCT \\`@logStream\\`) as stream_count\n FROM \\`LogGroupA\\`\n WHERE \\`@timestamp\\` >= date_sub(current_timestamp(), 1)\n GROUP BY \\`@message\\`\n HAVING occurrence_count > 10\n ORDER BY occurrence_count DESC\"`,\n },\n },\n {\n title:\n 'Count unique message patterns per hour over the last 24 hours. When doing this, it considers only the first 50 characters of longer messages. Results are sorted from most recent hour to oldest.',\n expr: {\n SQL: stripIndents`SSELECT \n date_trunc('hour', startTime) as hour_window,\n COUNT(DISTINCT \n CASE \n WHEN length(\\`@message\\`) < 50 THEN substr(\\`@message\\`, 1, length(\\`@message\\`))\n ELSE substr(\\`@message\\`, 1, 50)\n END\n ) as unique_patterns\n FROM \\`LogGroupA\\`\n WHERE startTime >= date_sub(current_timestamp(), 24)\n GROUP BY date_trunc('hour', startTime)\n ORDER BY hour_window DESC\"`,\n },\n },\n {\n title:\n 'Calculate the success and failure rates of requests, based on occurrence of success or failure keywords in the log.',\n expr: {\n SQL: stripIndents`SELECT \n date_trunc('minute', \\`@timestamp\\`) as minute,\n COUNT(*) as total_requests,\n SUM(CASE WHEN lower(\\`@message\\`) LIKE '%success%' THEN 1 ELSE 0 END) as successful_requests,\n SUM(CASE WHEN lower(\\`@message\\`) LIKE '%fail%' OR lower(\\`@message\\`) LIKE '%error%' THEN 1 ELSE 0 END) as failed_requests,\n ROUND(SUM(CASE WHEN lower(\\`@message\\`) LIKE '%success%' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) as success_rate\n FROM \\`LogGroupA\\`\n WHERE startTime >= date_sub(current_timestamp(), 1)\n GROUP BY date_trunc('minute', startTime)\n ORDER BY minute DESC\"`,\n },\n },\n {\n title: 'Identify and extract specific patterns from messages.',\n expr: {\n SQL: stripIndents`SELECT \n \\`@logStream\\`,\n regexp_extract(\\`@message\\`, '([A-Z0-9]{8})', 1) as id_pattern,\n substring_index(\\`@message\\`, ' ', 2) as first_two_words,\n left(\\`@message\\`, 10) as message_start,\n right(\\`@message\\`, 10) as message_end,\n length(trim(\\`@message\\`)) - length(replace(lower(\\`@message\\`), ' ', '')) + 1 as word_count\n FROM \\`LogGroupA\\`\n WHERE startTime >= date_sub(current_timestamp(), 1)\"`,\n },\n },\n {\n title: 'Mask numbers in the log events, replacing them with asterisks.',\n expr: {\n SQL: stripIndents`SELECT \n \\`@logStream\\`,\n translate(\\`@message\\`, '{}[]()',' ') as cleaned_message,\n regexp_replace(\\`@message\\`, '[0-9]', '*') as numbers_masked,\n concat_ws(' - ', \\`@logStream\\`, substr(\\`@message\\`, 1, 50)) as combined_log,\n repeat('*', length(\\`@message\\`)) as message_mask\n FROM \\`LogGroupA\\`\n WHERE startTime >= date_sub(current_timestamp(), 1)\"`,\n },\n },\n {\n title: 'Find log streams that have more than 50 error logs in the last 24 hours',\n expr: {\n SQL: stripIndents`SELECT \n \\`@logStream\\`,\n COUNT(*) as total_logs,\n COUNT(CASE WHEN lower(\\`@message\\`) LIKE '%error%' THEN 1 END) as error_count\n FROM \\`LogGroupA\\`\n WHERE \\`@timestamp\\` >= date_sub(current_timestamp(), 1)\n GROUP BY \\`@logStream\\`\n HAVING error_count > 50\n ORDER BY error_count DESC\"`,\n },\n },\n];\n\nconst pplOnlyGeneralQueries: SampleQuery[] = [\n {\n title:\n 'Calculate the total message length over five-minute intervals, and then find the average value across the five-minute intervals.\t',\n expr: {\n PPL: 'eval len_message = length(`@message`) | stats count(len_message) as log_bytes by span(`@timestamp`, 5m) | stats avg(log_bytes) | head 10',\n },\n },\n {\n title: 'Return the top 25 most recently added log events.\t',\n expr: {\n PPL: 'fields `@timestamp`, `@message` | sort - `@timestamp` | head 25',\n },\n },\n {\n title: 'Return a list of log events that are not exceptions.\t',\n expr: {\n PPL: \"eval result = LIKE(`@message`, '%Exception%') | where result = false\",\n },\n },\n {\n title: 'Identify faults on API calls.\t',\n expr: {\n PPL: stripIndents`\"where Operation = <operation> AND Fault > 0\n | fields \\`@timestamp\\`, \\`@logStream\\` as instanceId, ExceptionMessage\"`,\n },\n },\n {\n title:\n 'Return the number of exceptions logged every five minutes using regex where exception is not case sensitive.\t',\n expr: {\n PPL: 'eval result = LIKE(`@message`, \\'%Exception%\\') | where result = true | stats count() as exceptionCount by span(`@timestamp`, \"5m\") | sort -exceptionCount',\n },\n },\n {\n title: 'Parse the data and counts the number of fields.\t',\n expr: {\n PPL: stripIndents`\"eval result = LIKE(\\`@message\\`, 'EndTime') | eval result = true |\n parse \\`@message\\` '.+=(?<day>[A-Za-z]{3}), \\d+' | stats count() by day | head 25\"`,\n },\n },\n {\n title:\n 'Examine message length patterns per log stream to identify potential truncation issues or abnormal logging behavior that might indicate problems.\t',\n expr: {\n PPL: stripIndents`eval msg_length = length(\\`@message\\`)| stats avg(msg_length) as avg_length, max(msg_length) as max_length, min(msg_length) as min_length by \\`@logStream\\`| sort - avg_length`,\n },\n },\n {\n title: 'Analyze log volume trends over time to identify patterns and potential issues in system behavior.\t',\n expr: {\n PPL: stripIndents`\"eval date = ADDDATE(CURRENT_DATE(), -1) | eval result = TIMESTAMP(date) | where \\`@timestamp\\` > result | \n stats count() as log_count by span(\\`@timestamp\\`, 1h) \n | sort - log_count\n | head 10\"`,\n },\n },\n {\n title: 'Group and count error messages to identify the most frequent issues affecting the system.\t',\n expr: {\n PPL: stripIndents`eval result = LIKE(\\`@message\\`, \"%Error%\") | where result = true | stats count() by \\`@logStream\\` | head 10`,\n },\n },\n {\n title: 'Find the top causes of error logs.\t',\n expr: {\n PPL: stripIndents`eval result = LIKE(\\`@message\\`, \"%Error%\") | where result = true | top 2 \\`@logStream\\` | head 10`,\n },\n },\n {\n title: 'Find the log streams that contribute the least error log events.\t',\n expr: {\n PPL: stripIndents`eval result = LIKE(\\`@message\\`, \"%Error%\") | where result = true | rare \\`@logStream\\` | head 10`,\n },\n },\n {\n title:\n 'Calculate the total message length over five-minute intervals, and then find the average value across the five-minute intervals.\t',\n expr: {\n PPL: stripIndents`eval len_message = length(\\`@message\\`) | stats count(len_message) as log_bytes by span(\\`@timestamp\\`, 5m) | stats avg(log_bytes) | head 10`,\n },\n },\n {\n title: 'Find the log events that are not exceptions.\t',\n expr: {\n PPL: stripIndents`eval isException = LIKE(\\`@message\\`, '%exception%') | where isException = false | fields \\`@logStream\\`, \\`@message\\` | head 10`,\n },\n },\n {\n title: 'Return the top 25 log events sorted by timestamp.\t',\n expr: {\n PPL: stripIndents`fields \\`@logStream\\`, \\`@message\\` | sort -\\`@timestamp\\` | head 25`,\n },\n },\n {\n title: 'Find and display the error count.\t',\n expr: {\n PPL: stripIndents`where Operation = \"x\" and Fault > 0 | fields \\`@timestamp\\`, \\`@logStream\\`, ExceptionMessage | head 20`,\n },\n },\n];\n\nexport const generalQueries: SampleQuery[] = [\n {\n title: 'Find the 25 most recently added log events',\n expr: {\n CWLI: 'fields @timestamp, @message | sort @timestamp desc | limit 25',\n SQL: stripIndents`SELECT \\`@timestamp\\`, \\`@message\\`\n FROM \\`log_group\\`\n ORDER BY \\`@timestamp\\` DESC\n LIMIT 25`,\n PPL: stripIndents`fields \\`@timestamp\\`, \\`@message\\`\n| sort - \\`@timestamp\\`\n| head 25\n`,\n },\n },\n {\n title: 'Get a list of the number of exceptions per hour',\n expr: {\n CWLI: stripIndents`filter @message like /Exception/\n| stats count(*) as exceptionCount by bin(1h)\n| sort exceptionCount desc`,\n SQL: stripIndents`SELECT window.start, COUNT(*) AS exceptionCount\nFROM \\`log_group\\`\nWHERE \\`@message\\` LIKE '%Exception%'\nGROUP BY window(\\`@timestamp\\`, '1 hour')\nORDER BY exceptionCount DESC`,\n PPL: stripIndents`where abs(\\`@message\\`, \"%Exception%\")\n| stats count() as exceptionCount by span(\\`@timestamp\\`, 1h)\n| sort - exceptionCount`,\n },\n },\n {\n title: \"Get a list of log events that aren't exceptions.\",\n expr: {\n CWLI: 'fields @message | filter @message not like /Exception/',\n SQL: stripIndents`SELECT \\`@message\\`\nFROM \\`log_group\\`\nWHERE \\`@message\\` NOT LIKE '%Exception%'`,\n PPL: stripIndents`fields \\`@message\\`\n| where not like(\\`@message\\`, \"%Exception%\")`,\n },\n },\n {\n title: 'Get the most recent log event for each unique value of the server field',\n expr: {\n CWLI: stripIndents`fields @timestamp, server, severity, message\n| sort @timestamp asc\n| dedup server`,\n PPL: stripIndents`fields \\`@timestamp\\`, server, severity, message\n| sort \\`@timestamp\\`\n| dedup server`,\n },\n },\n {\n title: 'Get the most recent log event for each unique value of the server field for each severity type',\n expr: {\n CWLI: stripIndents`fields @timestamp, server, severity, message\n| sort @timestamp desc\n| dedup server, severity`,\n PPL: stripIndents`fields \\`@timestamp\\`, server, severity, message\n| sort - \\`@timestamp\\`\n| dedup server`,\n },\n },\n {\n title: 'Number of exceptions logged every 5 minutes',\n expr: {\n CWLI: 'filter @message like /Exception/ | stats count(*) as exceptionCount by bin(5m) | sort exceptionCount desc',\n SQL: stripIndents`SELECT window.start, COUNT(*) AS exceptionCount\nFROM \\`log_group\\`\nWHERE \\`@message\\` LIKE '%Exception%'\nGROUP BY window(\\`@timestamp\\`, '5 minute')\nORDER BY exceptionCount DESC`,\n PPL: stripIndents`where like(\\`@message\\`, \"%Exception%\")\n| stats count() as exceptionCount by span(\\`@timestamp\\`, 5m)\n| sort - exceptionCount`,\n },\n },\n ...sqlOnlyGeneralQueries,\n ...pplOnlyGeneralQueries,\n];\n\nexport const lambdaSamples: SampleQuery[] = [\n {\n title: 'View latency statistics for 5-minute intervals',\n expr: {\n CWLI: stripIndents`filter @type = \"REPORT\" |\n stats avg(@duration), max(@duration), min(@duration) by bin(5m)`,\n SQL: stripIndents`SELECT window.start, AVG(\\`@duration\\`) AS averageDuration,\n MAX(\\`@duration\\`) AS maxDuration,\n MIN(\\`@duration\\`) AS minDuration\n FROM \\`log_group\\`\n WHERE \\`@type\\` = 'REPORT'\n GROUP BY window(\\`@timestamp\\`, '5 minute')`,\n },\n },\n {\n title: 'Determine the amount of overprovisioned memory',\n expr: {\n CWLI: stripIndents`filter @type = \"REPORT\"\n | stats max(@memorySize / 1000 / 1000) as provisionedMemoryMB,\n min(@maxMemoryUsed / 1000 / 1000) as smallestMemoryRequestMB,\n avg(@maxMemoryUsed / 1000 / 1000) as avgMemoryUsedMB,\n max(@maxMemoryUsed / 1000 / 1000) as maxMemoryUsedMB,\n provisionedMemoryMB - maxMemoryUsedMB as overProvisionedMB\n `,\n SQL: stripIndents`SELECT MAX(\\`@memorySize\\` / 1000 / 1000) AS provisonedMemoryMB,\n MIN(\\`@maxMemoryUsed\\` / 1000 / 1000) AS smallestMemoryRequestMB,\n AVG(\\`@maxMemoryUsed\\` / 1000 / 1000) AS avgMemoryUsedMB,\n MAX(\\`@maxMemoryUsed\\` / 1000 / 1000) AS maxMemoryUsedMB,\n MAX(\\`@memorySize\\` / 1000 / 1000) - MAX(\\`@maxMemoryUsed\\` / 1000 / 1000) AS overProvisionedMB\n FROM \\`log_group\\`\n WHERE \\`@type\\` = 'REPORT'`,\n },\n },\n {\n title: 'Find the most expensive requests',\n expr: {\n CWLI: stripIndents`filter @type = \"REPORT\"\n | fields @requestId, @billedDuration\n | sort by @billedDuration desc`,\n SQL: stripIndents`SELECT\\`@requestId\\`, \\`@billedDuration\\`\n FROM \\`log_group\\`\n WHERE \\`@type\\` = 'REPORT'\n ORDER BY \\`@billedDuration\\` DESC`,\n PPL: stripIndents`where \\`@type\\` = 'REPORT'\n | fields \\`@requestId\\`, \\`@billedDuration\\`\n | sort - \\`@billedDuration\\``,\n },\n },\n];\n\nexport const vpcSamples: SampleQuery[] = [\n {\n title: 'Find the top 15 packet transfers across hosts',\n expr: {\n CWLI: stripIndents`stats sum(packets) as packetsTransferred by srcAddr, dstAddr\n | sort packetsTransferred desc\n | limit 15`,\n SQL: stripIndents`SELECT \\`srcAddr\\`, \\`dstAddr\\`, SUM(\\`packets\\`) AS packetsTransferred\n FROM \\`log_group\\`\n GROUP BY \\`srcAddr\\`, \\`dstAddr\\`\n ORDER BY packetsTransferred DESC\n LIMIT 15;`,\n },\n },\n\n {\n title: 'Find the IP addresses that use UDP as a data transfer protocol',\n expr: {\n CWLI: 'filter protocol=17 | stats count(*) by srcAddr',\n SQL: stripIndents`SELECT \\`srcAddr\\`, COUNT(*) AS totalCount\n FROM \\`log_group\\`\n WHERE \\`protocol\\` = 17\n GROUP BY srcAddr;`,\n },\n },\n {\n title: 'Find the IP addresses where flow records were skipped during the capture window',\n expr: {\n CWLI: stripIndents`filter logStatus=\"SKIPDATA\"\n | stats count(*) by bin(1h) as t\n | sort t`,\n SQL: stripIndents`SELECT window.start, COUNT(*) AS totalCount\n FROM \\`log_group\\`\n WHERE \\`logStatus\\` = 'SKIPDATA'\n GROUP BY window(\\`@timestamp\\`, '1 minute')\n ORDER BY window.start`,\n PPL: stripIndents`where logStatus=\"SKIPDATA\"\n | stats count() by span(\\`@timestamp\\`, 1h) as t\n | sort t`,\n },\n },\n {\n title: 'Average, min, and max byte transfers by source and destination IP addresses',\n expr: {\n CWLI: 'stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10',\n SQL: stripIndents`SELECT \\`srcAddr\\`, \\`dstAddr\\`, AVG(\\`bytes\\`),\n MIN(\\`bytes\\`), MAX(\\`bytes\\`)\n FROM \\`log_group\\`\n GROUP BY \\`srcAddr\\`, \\`dstAddr\\``,\n },\n },\n\n {\n title: 'Top 10 byte transfers by source and destination IP addresses',\n expr: {\n CWLI: 'stats sum(bytes) as bytesTransferred by srcAddr, dstAddr | sort bytesTransferred desc | limit 10',\n SQL: stripIndents`SELECT \\`srcAddr\\`, \\`dstAddr\\`, SUM(\\`bytes\\`) as bytesTransferred\n FROM \\`log_group\\`\n GROUP BY \\`srcAddr\\`, \\`dstAddr\\`\n ORDER BY bytesTransferred DESC\n LIMIT 10`,\n },\n },\n {\n title: 'Top 20 source IP addresses with highest number of rejected requests',\n expr: {\n CWLI: 'filter action=\"REJECT\" | stats count(*) as numRejections by srcAddr | sort numRejections desc | limit 20',\n SQL: stripIndents`SELECT \\`srcAddr\\`, COUNT(*) AS numRejections\n FROM \\`log_group\\`\n WHERE \\`action\\` = 'REJECT'\n GROUP BY \\`srcAddr\\`\n ORDER BY numRejections DESC\n LIMIT 20`,\n },\n },\n {\n title: 'Find the 10 DNS resolvers with the highest number of requests.',\n expr: {\n CWLI: stripIndents`stats count(*) as numRequests by resolverIp\n | sort numRequests desc\n | limit 10`,\n SQL: stripIndents`SELECT \\`resolverIp\\`, COUNT(*) AS numRequests\n FROM \\`log_group\\`\n GROUP BY \\`resolverIp\\`\n ORDER BY numRequests DESC\n LIMIT 10`,\n },\n },\n {\n title: 'Find the number of records by domain and subdomain where the server failed to complete the DNS request.',\n expr: {\n CWLI: stripIndents`filter responseCode=\"SERVFAIL\" | stats count(*) by queryName`,\n SQL: stripIndents`SELECT \\`queryName\\`, COUNT(*)\n FROM \\`log_group\\`\n WHERE \\`responseCode\\` = 'SERVFAIL'\n GROUP BY \\`queryName\\``,\n PPL: stripIndents`where \\`responseCode\\` = 'SERVFAIL'\n | stats count() by \\`queryName\\``,\n },\n },\n {\n title: 'Number of requests received every 10 minutes by edge location',\n expr: {\n CWLI: 'stats count(*) by queryType, bin(10m)',\n SQL: stripIndents`SELECT window.start, \\`queryType\\`,\n COUNT(*) AS totalCount\n FROM \\`log_group\\`\n GROUP BY window(\\`@timestamp\\`, '10 minute'), \\`queryType\\``,\n PPL: 'stats count() by queryType, span(`@timestamp`, 10m)',\n },\n },\n];\n\nexport const cloudtrailSamples: SampleQuery[] = [\n {\n title: 'Find the number of log entries for each service, event type, and AWS Region',\n expr: {\n CWLI: 'stats count(*) by eventSource, eventName, awsRegion',\n PPL: 'stats count() by `eventSource`, `eventName`, `awsRegion`',\n SQL: stripIndents`SELECT \\`eventSource\\`, \\`eventName\\`,\n \\`awsRegion\\`, COUNT(*)\n FROM \\`log_group\\`\n GROUP BY \\`eventSource\\`, \\`eventName\\`,\n \\`awsRegion\\``,\n },\n },\n {\n title: 'Find the Amazon EC2 hosts that were started or stopped in a given AWS Region',\n expr: {\n CWLI: 'filter (eventName=\"StartInstances\" or eventName=\"StopInstances\") and awsRegion=\"us-east-2',\n PPL: stripIndents`where \\`eventName\\` = 'StartInstances'\n OR \\`eventName\\` = 'StopInstances'\n AND \\`awsRegion\\` = 'us-east-2'`,\n SQL: stripIndents`SELECT \\`@timestamp\\`, \\`@message\\`\n FROM \\`log_group\\`\n WHERE \\`eventName\\` = 'StartInstances'\n OR \\`eventName\\` = 'StopInstances'\n AND \\`awsRegion\\` = 'us-east-2'`,\n },\n },\n {\n title: 'Find the AWS Regions, user names, and ARNs of newly created IAM users',\n expr: {\n CWLI: stripIndents`filter eventName=\"CreateUser\"\n | fields awsRegion, requestParameters.userName, responseElements.user.arn`,\n PPL: stripIndents`where \\`eventName\\` = 'CreateUser'\n | fields \\`awsRegion\\`, \\`requestParameters.userName\\`, \\`responseElements.user.arn\\``,\n SQL: stripIndents`SELECT \\`awsRegion\\`, \\`requestParameters.userName\\`,\n \\`responseElements.user.arn\\`\n FROM \\`log_group\\`\n WHERE \\`eventName\\` = 'CreateUser'`,\n },\n },\n {\n title: 'Find the number of records where an exception occurred while invoking the API UpdateTrail',\n expr: {\n CWLI: stripIndents`filter eventName=\"UpdateTrail\" and ispresent(errorCode)\n | stats count(*) by errorCode, errorMessage`,\n PPL: stripIndents`where eventName = \"UpdateTrail\" and isnotnull(errorCode)\n | stats count() by errorCode, errorMessage`,\n SQL: stripIndents`SELECT \\`errorCode\\`, \\`errorMessage\\`, COUNT(*)\n FROM \\`log_group\\`\n WHERE \\`eventName\\` = 'UpdateTrail'\n AND \\`errorCode\\` IS NOT NULL\n GROUP BY \\`errorCode\\`, \\`errorMessage\\``,\n },\n },\n {\n title: 'Find log entries where TLS 1.0 or 1.1 was used',\n expr: {\n CWLI: stripIndents`filter tlsDetails.tlsVersion in [ \"TLSv1\", \"TLSv1.1\" ]\n | stats count(*) as numOutdatedTlsCalls by userIdentity.accountId, recipientAccountId, eventSource, eventName, awsRegion, tlsDetails.tlsVersion, tlsDetails.cipherSuite, userAgent\n | sort eventSource, eventName, awsRegion, tlsDetails.tlsVersion`,\n PPL: stripIndents`where tlsDetails.tlsVersion in ('TLSv1', 'TLSv1.1')\n | stats count() as numOutdatedTlsCalls by\n \\`userIdentity.accountId\\`, \\`recipientAccountId\\`,\n \\`eventSource\\`, \\`eventName\\`, \\`awsRegion\\`\n \\`tlsDetails.tlsVersion\\`, \\`tlsDetails.cipherSuite\\`\n \\`userAgent\\`\n | sort \\`eventSource\\`, \\`eventName\\`, \\`awsRegion\\`, \\`tlsDetails.tlsVersion\\``,\n SQL: stripIndents`SELECT \\`userIdentity.accountId\\`, \\`recipientAccountId\\`, \\`eventSource\\`,\n \\`eventName\\`, \\`awsRegion\\`, \\`tlsDetails.tlsVersion\\`,\n \\`tlsDetails.cipherSuite\\`, \\`userAgent\\`, COUNT(*) AS numOutdatedTlsCalls\n FROM \\`log_group\\`\n WHERE \\`tlsDetails.tlsVersion\\` IN ('TLSv1', 'TLSv1.1')\n GROUP BY \\`userIdentity.accountId\\`, \\`recipientAccountId\\`, \\`eventSource\\`,\n \\`eventName\\`, \\`awsRegion\\`, \\`tlsDetails.tlsVersion\\`,\n \\`tlsDetails.cipherSuite\\`, \\`userAgent\\`\n ORDER BY \\`eventSource\\`, \\`eventName\\`, \\`awsRegion\\`, \\`tlsDetails.tlsVersion\\``,\n },\n },\n {\n title: 'Find the number of calls per service that used TLS versions 1.0 or 1.1',\n expr: {\n CWLI: stripIndents`filter tlsDetails.tlsVersion in [ \"TLSv1\", \"TLSv1.1\" ]\n | stats count(*) as numOutdatedTlsCalls by eventSource\n | sort numOutdatedTlsCalls desc`,\n PPL: stripIndents`where \\`tlsDetails.tlsVersion\\` in ('TLSv1', 'TLSv1.1')\n | stats count() as numOutdatedTlsCalls by \\`eventSource\\`\n | sort - numOutdatedTlsCalls`,\n SQL: stripIndents`SELECT \\`eventSource\\`, COUNT(*) AS numOutdatedTlsCalls\n FROM \\`log_group\\`\n WHERE \\`tlsDetails.tlsVersion\\` IN ('TLSv1', 'TLSv1.1')\n GROUP BY \\`eventSource\\`\n ORDER BY numOutdatedTlsCalls DESC`,\n },\n },\n {\n title: 'Number of log entries by region and EC2 event type',\n expr: {\n CWLI: 'filter eventSource=\"ec2.amazonaws.com\" | stats count(*) as eventCount by eventName, awsRegion | sort eventCount desc',\n PPL: stripIndents`where \\`eventSource\\` = 'ec2.amazonaws.com'\n | stats count() as eventCount by \\`eventName\\`, \\`awsRegion\\`\n | sort - eventCount\n `,\n SQL: stripIndents`SELECT \\`eventName\\`, \\`awsRegion\\`,\n COUNT(*) AS eventCount\n FROM \\`log_group\\`\n WHERE \\`eventSource\\` = 'ec2.amazonaws.com'\n GROUP BY \\`eventName\\`, \\`awsRegion\\`\n ORDER BY eventCount DESC`,\n },\n },\n];\nexport const natSamples: SampleQuery[] = [\n {\n title: 'Find the instances that are sending the most traffic through your NAT gateway',\n expr: {\n CWLI: stripIndents`filter (dstAddr like 'x.x.x.x' and srcAddr like 'y.y.')\n | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr\n | sort bytesTransferred desc\n | limit 10`,\n PPL: stripIndents`where like(dstAddr, \"x.x.x.x\") and like(srcAddr like \"y.y.\")\n | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr\n | sort - bytesTransferred\n | head 10`,\n SQL: stripIndents`SELECT \\`srcAddr\\`, \\`dstAddr\\`,\n SUM(\\`bytes\\`) AS bytesTransferred\n FROM \\`log_group\\`\n WHERE \\`dstAddr\\` LIKE 'x.x.x.x'\n AND \\`srcAddr\\` LIKE \\`y.y.%\\`\n GROUP BY \\`srcAddr\\`, \\`dstAddr\\`\n ORDER BY bytesTransferred DESC\n LIMIT 10`,\n },\n },\n {\n title: \"Determine the traffic that's going to and from the instances in your NAT gateways\",\n expr: {\n CWLI: stripIndents`filter (dstAddr like 'x.x.x.x' and srcAddr like 'y.y.') or (srcAddr like 'xxx.xx.xx.xx' and dstAddr like 'y.y.')\n | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr\n | sort bytesTransferred desc\n | limit 10`,\n PPL: stripIndents`where (like(dstAddr, \"x.x.x.x\") and like(srcAddr, \"y.y.\")) or (like(srcAddr, \"xxx.xx.xx.xx\") and like(dstAddr, \"y.y.\")\n | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr\n | sort - bytesTransferred\n | limit 10`,\n SQL: stripIndents`SELECT \\`srcAddr\\`, \\`dstAddr\\`,\n SUM (\\`bytes\\`) AS bytesTransferred\n FROM \\`log_group\\`\n WHERE (\\`dstAddr\\` LIKE 'x.x.x.x' AND \\`srcAddr\\` LIKE 'y.y.%')\n OR (\\`srcAddr\\` LIKE 'xxx.xx.xx.xx' AND \\`dstAddr\\` LIKE 'y.y.%')\n GROUP BY \\`srcAddr\\`, \\`dstAddr\\`\n ORDER BY \\`bytesTransferred\\` DESC\n LIMIT 10`,\n },\n },\n {\n title:\n 'Determine the internet destinations that the instances in your VPC communicate with most often for uploads and downloads - for uploads',\n expr: {\n CWLI: stripIndents`filter (srcAddr like 'x.x.x.x' and dstAddr not like 'y.y.')\n | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr\n | sort bytesTransferred desc\n | limit 10`,\n PPL: stripIndents`where like(srcAddr like \"y.y.\") and not like(dstAddr, \"x.x.x.x\")\n | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr\n | sort - bytesTransferred\n | head 10`,\n SQL: stripIndents`SELECT \\`srcAddr\\`, \\`dstAddr\\`,\n SUM(\\`bytes\\`) AS bytesTransferred\n FROM \\`log_group\\`\n WHERE \\`srcAddr\\` LIKE 'x.x.x.x'\n AND \\`dstAddr\\` NOT LIKE \\`y.y.%\\`\n GROUP BY \\`srcAddr\\`, \\`dstAddr\\`\n ORDER BY bytesTransferred DESC\n LIMIT 10`,\n },\n },\n {\n title:\n 'Determine the internet destinations that the instances in your VPC communicate with most often for uploads and downloads - for downloads',\n expr: {\n CWLI: stripIndents`filter (dstAddr like 'x.x.x.x' and srcAddr not like 'y.y.')\n | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr\n | sort bytesTransferred desc\n | limit 10`,\n PPL: stripIndents`where like(dstAddr, \"x.x.x.x\") and not like(srcAddr like \"y.y.\")\n | stats sum(bytes) as bytesTransferred by srcAddr, dstAddr\n | sort - bytesTransferred\n | head 10`,\n SQL: stripIndents`SELECT \\`srcAddr\\`, \\`dstAddr\\`,\n SUM(\\`bytes\\`) AS bytesTransferred\n FROM \\`log_group\\`\n WHERE \\`dstAddr\\` LIKE 'x.x.x.x'\n AND \\`srcAddr\\` NOT LIKE \\`y.y.%\\`\n GROUP BY \\`srcAddr\\`, \\`dstAddr\\`\n ORDER BY bytesTransferred DESC\n LIMIT 10`,\n },\n },\n];\n\nexport const appSyncSamples: SampleQuery[] = [\n {\n title: 'Number of unique HTTP status codes',\n expr: {\n CWLI: 'fields ispresent(graphQLAPIId) as isApi | filter isApi | filter logType = \"RequestSummary\" | stats count() as statusCount by statusCode | sort statusCount desc',\n SQL: stripIndents`SELECT \\`graphQLAPIId\\`, \\`statusCode\\`,\n COUNT(*) AS statusCount\n FROM \\`log_group\\`\n WHERE \\`logType\\` = 'RequestSummary'\n AND \\`graphQLAPIId\\` IS NOT NULL\n GROUP BY \\`graphQLAPIId\\`, \\`statusCode\\`\n ORDER BY statusCount DESC`,\n },\n },\n {\n title: 'Most frequently invoked resolvers',\n expr: {\n CWLI: 'fields ispresent(resolverArn) as isRes | stats count() as invocationCount by resolverArn | filter isRes | filter logType = \"Tracing\" | sort invocationCount desc | limit 10',\n PPL: stripIndents`where \\`logType\\` = 'Tracing'\n | fields \\`resolverArn\\`, \\`duration\\`\n | sort - duration\n | head 10`,\n SQL: stripIndents`SELECT \\`resolverArn\\`, COUNT(*) AS invocationCount\n FROM \\`log_group\\`\n WHERE \\`logType\\` = 'Tracing'\n AND \\`resolverArn\\` IS NOT NULL\n GROUP BY \\`resolverArn\\`\n ORDER BY invocationCount DESC\n LIMIT 10`,\n },\n },\n {\n title: 'Top 10 resolvers with maximum latency',\n expr: {\n CWLI: 'fields resolverArn, duration | filter logType = \"Tracing\" | sort duration desc | limit 10',\n PPL: stripIndents`where \\`logType\\` = 'Tracing'\n | fields \\`resolverArn\\`, \\`duration\\`\n | sort - duration\n | head 10`,\n SQL: stripIndents`SELECT \\`resolverArn\\`, \\`duration\\`\n FROM \\`log_group\\`\n WHERE \\`logType\\` = 'Tracing'\n ORDER BY \\`duration\\` DESC\n LIMIT 10`,\n },\n },\n {\n title: 'Resolvers with most errors in mapping templates',\n expr: {\n CWLI: 'fields ispresent(resolverArn) as isRes | stats count() as errorCount by resolverArn, logType | filter isRes and (logType = \"RequestMapping\" or logType = \"ResponseMapping\") and fieldInError | sort errorCount desc | limit 10',\n SQL: stripIndents`SELECT resolverArn, COUNT(*) AS errorCount\n FROM \\`log_group\\`\n WHERE ISNOTNULL(resolverArn) AND (logType = \"RequestMapping\" OR logType = \"ResponseMapping\") AND fieldInError\n GROUP BY resolverArn\n ORDER BY errorCount DESC\n LIMIT 10`,\n },\n },\n {\n title: 'Field latency statistics',\n expr: {\n CWLI: `stats min(duration), max(duration), avg(duration) as avgDur by concat(parentType, '/', fieldName) as fieldKey | filter logType = \"Tracing\" | sort avgDur desc | limit 10`,\n SQL: stripIndents`SELECT CONCAT(parentType, \"/\", fieldName) AS fieldKey, MIN(duration), MAX(duration), AVG(duration) as avgDur\n FROM \\`log_group\\`\n ORDER BY fieldKey\n WHERE logType=\"Tracing\"\n SORTY BY avgDur DESC\n LIMIT 10`,\n },\n },\n {\n title: 'Resolver latency statistics',\n expr: {\n CWLI: 'fields ispresent(resolverArn) as isRes | filter isRes | filter logType = \"Tracing\" | stats min(duration), max(duration), avg(duration) as avgDur by resolverArn | sort avgDur desc | limit 10 ',\n SQL: stripIndents`SELECT \\`resolverArn\\`, MIN(\\`duration\\`),\n MAX(\\`duration\\`), AVG(\\`duration\\`) as avgDur\n FROM \\`log_group\\`\n WHERE \\`resolverArn\\` IS NOT NULL\n AND \\`logType\\` = 'Tracing'\n GROUP BY \\`resolverArn\\`\n ORDER BY avgDur DESC\n LIMIT 10`,\n },\n },\n {\n title: 'Top 10 requests with maximum latency',\n expr: {\n CWLI: 'fields requestId, latency | filter logType = \"RequestSummary\" | sort latency desc | limit 10',\n PPL: stripIndents`where \\`logType\\` = 'RequestSummary'\n | fields \\`requestId\\`, \\`latency\\`\n | sort - \\`latency\\`\n | head 10`,\n SQL: stripIndents`SELECT \\`requestId\\`, \\`latency\\`\n FROM \\`log_group\\`\n WHERE \\`logType\\` = 'RequestSummary'\n ORDER BY \\`latency\\` DESC\n LIMIT 10`,\n },\n },\n];\n\nexport const iotSamples = [\n {\n title: 'Count IoT Events and status including errors',\n expr: {\n CWLI: 'fields @timestamp, @message | stats count(*) by eventType, status',\n SQL: stripIndents`SELECT \\`eventType\\`, \\`status\\`, COUNT(*)\n FROM \\`log_group\\`\n GROUP BY \\`eventType\\`, \\`status\\``,\n },\n },\n {\n title: 'Count of Disconnect reasons',\n expr: {\n CWLI: 'filter eventType=\"Disconnect\" | stats count(*) by disconnectReason | sort disconnectReason desc',\n PPL: stripIndents`where \\`eventType\\` = \\`Disconnect\\`\n | stats count() by \\`disconnectReason\\`\n | sort - \\`disconnectReason\\``,\n SQL: stripIndents`SELECT \\`disconnectReason\\`, COUNT(*)\n FROM \\`log_group\\`\n WHERE \\`eventType\\` = 'Disconnect'\n GROUP BY \\`disconnectReason\\`\n ORDER BY \\`disconnectReason\\` DESC`,\n },\n },\n {\n title: 'Top 50 devices with Duplicate ClientId disconnect error',\n expr: {\n CWLI: 'filter eventType=\"Disconnect\" and disconnectReason=\"DUPLICATE_CLIENTID\" | stats count(*) by clientId | sort numPublishIn desc | limit 50',\n SQL: stripIndents`SELECT \\`clientId\\`, COUNT(*) AS duplicateCount\n FROM \\`log_group\\`\n WHERE \\`eventType\\` = 'Disconnect'\n AND \\`disconnectReason\\` = 'DUPLICATE_CLIENTID'\n GROUP BY \\`clientId\\`\n ORDER BY duplicateCount DESC\n LIMIT 50`,\n },\n },\n {\n title: 'Top 10 failed connections by ClientId',\n expr: {\n CWLI: 'filter eventType=\"Connect\" and status=\"Failure\" | stats count(*) by clientId | sort numPublishIn desc | limit 10',\n SQL: stripIndents`SELECT \\`clientId\\`, COUNT(*) AS failedConnectionCount\n FROM \\`log_group\\`\n WHERE \\`eventType\\` = 'Connect'\n AND \\`status\\` = 'Failure'\n GROUP BY \\`clientId\\`\n ORDER BY failedConnectionCount DESC\n LIMIT 10`,\n },\n },\n {\n title: 'Connectivity activity for a device',\n expr: {\n CWLI: 'fields @timestamp, eventType, reason, clientId | filter clientId like /sampleClientID/ | filter eventType like /Connect|Disconnect/ | sort @timestamp desc | limit 20',\n PPL: stripIndents`fields \\`@timestamp\\`, eventType, reason, clientId\n | where like(clientId, \"%sampleClientID%\")\n | where like(eventType, \"%Connect%\") or like(eventType, \"%Disconnect%\")\n | sort - \\`@timestamp\\`\n | head 20`,\n SQL: stripIndents`SELECT \\`@timestamp\\`, \\`eventType\\`,\n \\`reason\\`, \\`clientId\\`\n FROM \\`log_group\\`\n WHERE \\`clientId\\` LIKE '%sampleClientID%'\n AND \\`eventType\\` LIKE ANY ('%Connect%', '%Disconnect%')\n ORDER BY \\`@timestamp\\` DESC\n LIMIT 20`,\n },\n },\n {\n title: 'View messages published to a topic',\n expr: {\n CWLI: 'fields @timestamp, @message | sort @timestamp desc | filter ( eventType=\"Publish-In\" ) and topicName like \\'your/topic/here\\'',\n PPL: stripIndents`fields \\`@timestamp\\`, \\`@message\\`\n | where eventType = \"Publish-In\" and like(topicName, \"%your/topic/here%\")\n | sort - \\`@timestamp\\``,\n SQL: stripIndents`SELECT \\`@timestamp\\`, \\`@message\\`\n FROM \\`log_group\\`\n WHERE \\`eventType\\` = 'Publish-In'\n AND \\`topicName\\` LIKE '%your/topic/here%'`,\n },\n },\n];\n","import { Grammar } from 'prismjs';\n\nimport { CompletionItem } from '@grafana/ui';\n\nexport const QUERY_COMMANDS: CompletionItem[] = [\n {\n label: 'fields',\n documentation: 'Retrieves the specified fields from log events',\n },\n { label: 'display', documentation: 'Specifies which fields to display in the query results' },\n {\n label: 'filter',\n documentation: 'Filters the results of a query based on one or more conditions',\n },\n {\n label: 'stats',\n documentation: 'Calculates aggregate statistics based on the values of log fields',\n },\n { label: 'sort', documentation: 'Sorts the retrieved log events' },\n { label: 'limit', documentation: 'Specifies the number of log events returned by the query' },\n {\n label: 'parse',\n documentation:\n 'Extracts data from a log field, creating one or more ephemeral fields that you can process further in the query',\n },\n];\n\nexport const COMPARISON_OPERATORS = ['=', '!=', '<', '<=', '>', '>='];\nexport const ARITHMETIC_OPERATORS = ['+', '-', '*', '/', '^', '%'];\n\nexport const NUMERIC_OPERATORS = [\n {\n label: 'abs',\n detail: 'abs(a)',\n documentation: 'Absolute value.',\n },\n {\n label: 'ceil',\n detail: 'ceil(a)',\n documentation: 'Round to ceiling (the smallest integer that is greater than the value of a).',\n },\n {\n label: 'floor',\n detail: 'floor(a)',\n documentation: 'Round to floor (the largest integer that is smaller than the value of a).',\n },\n {\n label: 'greatest',\n detail: 'greatest(a,b, ... z)',\n documentation: 'Returns the largest value.',\n },\n {\n label: 'least',\n detail: 'least(a, b, ... z)',\n documentation: 'Returns the smallest value.',\n },\n {\n label: 'log',\n detail: 'log(a)',\n documentation: 'Natural logarithm.',\n },\n {\n label: 'sqrt',\n detail: 'sqrt(a)',\n documentation: 'Square root.',\n },\n];\n\nexport const GENERAL_FUNCTIONS = [\n {\n label: 'ispresent',\n detail: 'ispresent(fieldname)',\n documentation: 'Returns true if the field exists.',\n },\n {\n label: 'coalesce',\n detail: 'coalesce(fieldname1, fieldname2, ... fieldnamex)',\n documentation: 'Returns the first non-null value from the list.',\n },\n];\n\nexport const STRING_FUNCTIONS = [\n {\n label: 'isempty',\n detail: 'isempty(fieldname)',\n documentation: 'Returns true if the field is missing or is an empty string.',\n },\n {\n label: 'isblank',\n detail: 'isblank(fieldname)',\n documentation: 'Returns true if the field is missing, an empty string, or contains only white space.',\n },\n {\n label: 'concat',\n detail: 'concat(string1, string2, ... stringz)',\n documentation: 'Concatenates the strings.',\n },\n {\n label: 'ltrim',\n detail: 'ltrim(string) or ltrim(string1, string2)',\n documentation:\n 'Remove white space from the left of the string. If the function has a second string argument, it removes the characters of string2 from the left of string1.',\n },\n {\n label: 'rtrim',\n detail: 'rtrim(string) or rtrim(string1, string2)',\n documentation:\n 'Remove white space from the right of the string. If the function has a second string argument, it removes the characters of string2 from the right of string1.',\n },\n {\n label: 'trim',\n detail: 'trim(string) or trim(string1, string2)',\n documentation:\n 'Remove white space from both ends of the string. If the function has a second string argument, it removes the characters of string2 from both sides of string1.',\n },\n {\n label: 'strlen',\n detail: 'strlen(string)',\n documentation: 'Returns the length of the string in Unicode code points.',\n },\n {\n label: 'toupper',\n detail: 'toupper(string)',\n documentation: 'Converts the string to uppercase.',\n },\n {\n label: 'tolower',\n detail: 'tolower(string)',\n documentation: 'Converts the string to lowercase.',\n },\n {\n label: 'substr',\n detail: 'substr(string1, x), or substr(string1, x, y)',\n documentation:\n 'Returns a substring from the index specified by the number argument to the end of the string. If the function has a second number argument, it contains the length of the substring to be retrieved.',\n },\n {\n label: 'replace',\n detail: 'replace(string1, string2, string3)',\n documentation: 'Replaces all instances of string2 in string1 with string3.',\n },\n {\n label: 'strcontains',\n detail: 'strcontains(string1, string2)',\n documentation: 'Returns 1 if string1 contains string2 and 0 otherwise.',\n },\n];\n\nexport const DATETIME_FUNCTIONS = [\n {\n label: 'bin',\n detail: 'bin(period)',\n documentation: 'Rounds the value of @timestamp to the given period and then truncates.',\n },\n {\n label: 'datefloor',\n detail: 'datefloor(a, period)',\n documentation: 'Truncates the timestamp to the given period.',\n },\n {\n label: 'dateceil',\n detail: 'dateceil(a, period)',\n documentation: 'Rounds up the timestamp to the given period and then truncates.',\n },\n {\n label: 'fromMillis',\n detail: 'fromMillis(fieldname)',\n documentation:\n 'Interprets the input field as the number of milliseconds since the Unix epoch and converts it to a timestamp.',\n },\n {\n label: 'toMillis',\n detail: 'toMillis(fieldname)',\n documentation:\n 'Converts the timestamp found in the named field into a number representing the milliseconds since the Unix epoch.',\n },\n];\n\nexport const IP_FUNCTIONS = [\n {\n label: 'isValidIp',\n detail: 'isValidIp(fieldname)',\n documentation: 'Returns true if the field is a valid v4 or v6 IP address.',\n },\n {\n label: 'isValidIpV4',\n detail: 'isValidIpV4(fieldname)',\n documentation: 'Returns true if the field is a valid v4 IP address.',\n },\n {\n label: 'isValidIpV6',\n detail: 'isValidIpV6(fieldname)',\n documentation: 'Returns true if the field is a valid v6 IP address.',\n },\n {\n label: 'isIpInSubnet',\n detail: 'isIpInSubnet(fieldname, string)',\n documentation: 'Returns true if the field is a valid v4 or v6 IP address within the specified v4 or v6 subnet.',\n },\n {\n label: 'isIpv4InSubnet',\n detail: 'isIpv4InSubnet(fieldname, string)',\n documentation: 'Returns true if the field is a valid v4 IP address within the specified v4 subnet.',\n },\n {\n label: 'isIpv6InSubnet',\n detail: 'isIpv6InSubnet(fieldname, string)',\n documentation: 'Returns true if the field is a valid v6 IP address within the specified v6 subnet.',\n },\n];\n\nexport const BOOLEAN_FUNCTIONS = [\n {\n label: 'ispresent',\n detail: 'ispresent(fieldname)',\n documentation: 'Returns true if the field exists.',\n },\n {\n label: 'isempty',\n detail: 'isempty(fieldname)',\n documentation: 'Returns true if the field is missing or is an empty string.',\n },\n {\n label: 'isblank',\n detail: 'isblank(fieldname)',\n documentation: 'Returns true if the field is missing, an empty string, or contains only white space.',\n },\n {\n label: 'strcontains',\n detail: 'strcontains(string1, string2)',\n documentation: 'Returns 1 if string1 contains string2 and 0 otherwise.',\n },\n ...IP_FUNCTIONS,\n];\n\nexport const AGGREGATION_FUNCTIONS_STATS = [\n {\n label: 'avg',\n detail: 'avg(NumericFieldname)',\n documentation: 'The average of the values in the specified field.',\n },\n {\n label: 'count',\n detail: 'count(fieldname) or count(*)',\n documentation: 'Counts the log records.',\n },\n {\n label: 'count_distinct',\n detail: 'count_distinct(fieldname)',\n documentation: 'Returns the number of unique values for the field.',\n },\n {\n label: 'max',\n detail: 'max(fieldname)',\n documentation: 'The maximum of the values for this log field in the queried logs.',\n },\n {\n label: 'min',\n detail: 'min(fieldname)',\n documentation: 'The minimum of the values for this log field in the queried logs.',\n },\n {\n label: 'pct',\n detail: 'pct(fieldname, value)',\n documentation: 'A percentile indicates the relative standing of a value in a datas.',\n },\n {\n label: 'stddev',\n detail: 'stddev(NumericFieldname)',\n documentation: 'The standard deviation of the values in the specified field.',\n },\n {\n label: 'sum',\n detail: 'sum(NumericFieldname)',\n documentation: 'The sum of the values in the specified field.',\n },\n];\n\nexport const NON_AGGREGATION_FUNCS_STATS = [\n {\n label: 'earliest',\n detail: 'earliest(fieldname)',\n documentation:\n 'Returns the value of fieldName from the log event that has the earliest time stamp in the queried logs.',\n },\n {\n label: 'latest',\n detail: 'latest(fieldname)',\n documentation:\n 'Returns the value of fieldName from the log event that has the latest time stamp in the queried logs.',\n },\n {\n label: 'sortsFirst',\n detail: 'sortsFirst(fieldname)',\n documentation: 'Returns the value of fieldName that sorts first in the queried logs.',\n },\n {\n label: 'sortsLast',\n detail: 'sortsLast(fieldname)',\n documentation: 'Returns the value of fieldName that sorts last in the queried logs.',\n },\n];\n\nexport const STATS_FUNCS = [...AGGREGATION_FUNCTIONS_STATS, ...NON_AGGREGATION_FUNCS_STATS];\n\nexport const KEYWORDS = ['as', 'like', 'by', 'in', 'desc', 'asc'];\nexport const FIELD_AND_FILTER_FUNCTIONS = [\n ...NUMERIC_OPERATORS,\n ...GENERAL_FUNCTIONS,\n ...STRING_FUNCTIONS,\n ...DATETIME_FUNCTIONS,\n ...IP_FUNCTIONS,\n];\n\nexport const FUNCTIONS = [...FIELD_AND_FILTER_FUNCTIONS, ...STATS_FUNCS];\n\nconst tokenizer: Grammar = {\n comment: {\n pattern: /^#.*/,\n greedy: true,\n },\n backticks: {\n pattern: /`.*?`/,\n alias: 'string',\n greedy: true,\n },\n quote: {\n pattern: /\".*?\"/,\n alias: 'string',\n greedy: true,\n },\n regex: {\n pattern: /\\/.*?\\/(?=\\||\\s*$|,)/,\n greedy: true,\n },\n 'query-command': {\n pattern: new RegExp(`\\\\b(?:${QUERY_COMMANDS.map((command) => command.label).join('|')})\\\\b`, 'i'),\n alias: 'function',\n },\n function: {\n pattern: new RegExp(`\\\\b(?:${FUNCTIONS.map((f) => f.label).join('|')})\\\\b`, 'i'),\n },\n keyword: {\n pattern: new RegExp(`(\\\\s+)(${KEYWORDS.join('|')})(?=\\\\s+)`, 'i'),\n lookbehind: true,\n },\n // 'log-group-name': {\n // pattern: /[\\.\\-_/#A-Za-z0-9]+/,\n // },\n 'field-name': {\n pattern: /(@?[_a-zA-Z]+[_.0-9a-zA-Z]*)|(`((\\\\`)|([^`]))*?`)/,\n greedy: true,\n },\n number: /\\b-?\\d+((\\.\\d*)?([eE][+-]?\\d+)?)?\\b/,\n 'command-separator': {\n pattern: /\\|/,\n alias: 'punctuation',\n },\n 'comparison-operator': {\n pattern: /([<>]=?)|(!?=)/,\n },\n punctuation: /[{}()`,.]/,\n whitespace: /\\s+/,\n};\n\nexport default tokenizer;\n","// import { Grammar } from 'prismjs';\n\nimport { Grammar } from 'prismjs';\n\nimport { FUNCTIONS, KEYWORDS, QUERY_COMMANDS } from '../../language/cloudwatch-logs/syntax';\nimport * as sql from '../../language/cloudwatch-logs-sql/language';\nimport * as ppl from '../../language/cloudwatch-ppl/language';\n\nexport const baseTokenizer = (languageSpecificFeatures: Grammar): Grammar => ({\n comment: {\n pattern: /^#.*/,\n greedy: true,\n },\n backticks: {\n pattern: /`.*?`/,\n alias: 'string',\n greedy: true,\n },\n quote: {\n pattern: /[\\\"'].*?[\\\"']/,\n alias: 'string',\n greedy: true,\n },\n regex: {\n pattern: /\\/.*?\\/(?=\\||\\s*$|,)/,\n greedy: true,\n },\n ...languageSpecificFeatures,\n\n 'field-name': {\n pattern: /(@?[_a-zA-Z]+[_.0-9a-zA-Z]*)|(`((\\\\`)|([^`]))*?`)/,\n greedy: true,\n },\n number: /\\b-?\\d+((\\.\\d*)?([eE][+-]?\\d+)?)?\\b/,\n 'command-separator': {\n pattern: /\\|/,\n alias: 'punctuation',\n },\n 'comparison-operator': {\n pattern: /([<>]=?)|(!?=)/,\n },\n punctuation: /[{}()`,.]/,\n whitespace: /\\s+/,\n});\n\nexport const cwliTokenizer: Grammar = {\n ...baseTokenizer({\n 'query-command': {\n pattern: new RegExp(`\\\\b(?:${QUERY_COMMANDS.map((command) => command.label).join('|')})\\\\b`, 'i'),\n alias: 'function',\n },\n function: {\n pattern: new RegExp(`\\\\b(?:${FUNCTIONS.map((f) => f.label).join('|')})\\\\b`, 'i'),\n },\n keyword: {\n pattern: new RegExp(`(\\\\s+)(${KEYWORDS.join('|')})(?=\\\\s+)`, 'i'),\n lookbehind: true,\n },\n }),\n};\n\nexport const pplTokenizer: Grammar = {\n ...baseTokenizer({\n 'query-command': {\n pattern: new RegExp(`\\\\b(?:${ppl.PPL_COMMANDS.join('|')})\\\\b`, 'i'),\n alias: 'function',\n },\n function: {\n pattern: new RegExp(`\\\\b(?:${ppl.ALL_FUNCTIONS.join('|')})\\\\b`, 'i'),\n },\n keyword: {\n pattern: new RegExp(`(\\\\s+)(${ppl.ALL_KEYWORDS.join('|')})(?=\\\\s+)`, 'i'),\n lookbehind: true,\n },\n operator: {\n pattern: new RegExp(`\\\\b(?:${ppl.PPL_OPERATORS.map((operator) => `\\\\${operator}`).join('|')})\\\\b`, 'i'),\n },\n }),\n};\n\nexport const sqlTokenizer = {\n ...baseTokenizer({\n function: {\n pattern: new RegExp(`\\\\b(?:${sql.ALL_FUNCTIONS.join('|')})\\\\b(?!\\\\.)`, 'i'),\n },\n keyword: {\n pattern: new RegExp(`\\\\b(?:${sql.ALL_KEYWORDS.join('|')})\\\\b(?=\\\\s)`, 'i'),\n lookbehind: true,\n },\n operator: {\n pattern: new RegExp(`\\\\b(?:${sql.ALL_OPERATORS.map((operator) => `\\\\${operator}`).join('|')})\\\\b`, 'i'),\n },\n }),\n};\n","import { css } from '@emotion/css';\nimport Prism from 'prismjs';\nimport { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Collapse, useStyles2, Text, TextLink } from '@grafana/ui';\nimport { flattenTokens } from '@grafana/ui/internal';\n\nimport { trackSampleQuerySelection } from '../../tracking';\nimport { CloudWatchLogsQuery, CloudWatchQuery, LogsQueryLanguage } from '../../types';\n\nimport * as sampleQueries from './sampleQueries';\nimport { cwliTokenizer, pplTokenizer, sqlTokenizer } from './tokenizer';\n\ninterface QueryExample {\n category: string;\n examples: sampleQueries.SampleQuery[];\n}\n\nconst QUERIES: QueryExample[] = [\n {\n category: 'General queries',\n examples: sampleQueries.generalQueries,\n },\n {\n category: 'Lambda',\n examples: sampleQueries.lambdaSamples,\n },\n\n {\n category: 'VPC Flow Logs',\n examples: sampleQueries.vpcSamples,\n },\n {\n category: 'CloudTrail Logs',\n examples: sampleQueries.cloudtrailSamples,\n },\n {\n category: 'NAT Gateway',\n examples: sampleQueries.natSamples,\n },\n {\n category: 'AWS App Sync',\n examples: sampleQueries.appSyncSamples,\n },\n {\n category: 'IOT queries',\n examples: sampleQueries.iotSamples,\n },\n];\n\nfunction renderHighlightedMarkup(\n code: string,\n keyPrefix: string,\n queryLanugage: LogsQueryLanguage = LogsQueryLanguage.CWLI\n) {\n const grammar = getGrammarForLanguage(queryLanugage);\n const tokens = flattenTokens(Prism.tokenize(code, grammar));\n const spans = tokens\n .filter((token) => typeof token !== 'string')\n .map((token, i) => {\n return (\n <span\n className={`prism-token token ${token.types.join(' ')} ${token.aliases.join(' ')}`}\n key={`${keyPrefix}-token-${i}`}\n >\n {token.content}\n </span>\n );\n });\n\n return <div className=\"slate-query-field\">{spans}</div>;\n}\n\ninterface CollapseProps {\n key?: string;\n label: string;\n children: React.ReactNode;\n}\nconst CheatSheetCollapse = (props: CollapseProps) => {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <Collapse label={props.label} isOpen={isOpen} onToggle={setIsOpen} key={props.key}>\n {props.children}\n </Collapse>\n );\n};\n\ntype Props = {\n onClickExample: (query: CloudWatchQuery) => void;\n query: CloudWatchQuery;\n};\nconst isLogsQuery = (query: CloudWatchQuery): query is CloudWatchLogsQuery => query.queryMode === 'Logs';\n\nconst LogsCheatSheet = (props: Props) => {\n const styles = useStyles2(getStyles);\n const queryLanguage: LogsQueryLanguage =\n (isLogsQuery(props.query) && props.query.queryLanguage) || LogsQueryLanguage.CWLI;\n\n const onClickExample = (query: sampleQueries.SampleQuery, queryCategory: string) => {\n props.onClickExample({\n ...props.query,\n refId: props.query.refId ?? 'A',\n expression: query.expr[queryLanguage],\n queryMode: 'Logs',\n region: props.query.region,\n id: props.query.refId ?? 'A',\n logGroupNames: 'logGroupNames' in props.query ? props.query.logGroupNames : [],\n logGroups: 'logGroups' in props.query ? props.query.logGroups : [],\n });\n trackSampleQuerySelection({ queryLanguage, queryCategory });\n };\n\n return (\n <div>\n <div className={styles.heading}>\n <Text variant=\"h3\" weight=\"bold\">\n CloudWatch Logs cheat sheet\n </Text>\n </div>\n {QUERIES.map((query, i) => (\n <CheatSheetCollapse key={query.category} label={query.category}>\n <div key={`cat-${i}`}>\n {query.examples.map((item, j) => (\n <>\n {item.expr[queryLanguage] && (\n <>\n <Text variant=\"h6\" weight=\"bold\">\n {item.title}\n </Text>\n <button\n type=\"button\"\n className={styles.cheatSheetExample}\n key={item.expr[queryLanguage]}\n onClick={() => onClickExample(item, query.category)}\n >\n <pre>{renderHighlightedMarkup(item.expr[queryLanguage], `item-${j}`, queryLanguage)}</pre>\n </button>\n </>\n )}\n </>\n ))}\n </div>\n </CheatSheetCollapse>\n ))}\n <div>\n Note: If you are seeing masked data, you may have CloudWatch logs data protection enabled.{' '}\n <TextLink\n href=\"https://grafana.com/docs/grafana/latest/datasources/aws-cloudwatch/#cloudwatch-logs-data-protection\"\n external\n >\n See documentation for details\n </TextLink>\n .\n </div>\n </div>\n );\n};\n\nexport default LogsCheatSheet;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n heading: css({\n marginBottom: theme.spacing(2),\n }),\n cheatSheetExample: css({\n margin: theme.spacing(0.5, 0),\n // element is interactive, clear button styles\n textAlign: 'left',\n border: 'none',\n background: 'transparent',\n display: 'block',\n }),\n});\n\nconst getGrammarForLanguage = (queryLanugage: LogsQueryLanguage) => {\n switch (queryLanugage) {\n case LogsQueryLanguage.CWLI:\n return cwliTokenizer;\n case LogsQueryLanguage.PPL:\n return pplTokenizer;\n case LogsQueryLanguage.SQL:\n return sqlTokenizer;\n }\n};\n","import { useEffect, useState } from 'react';\nimport { useAsyncFn, useDeepCompareEffect } from 'react-use';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nimport { CloudWatchDatasource } from './datasource';\nimport { ResourcesAPI } from './resources/ResourcesAPI';\nimport { GetMetricsRequest, GetDimensionKeysRequest } from './resources/types';\nimport { appendTemplateVariables } from './utils/utils';\n\nexport const useRegions = (datasource: CloudWatchDatasource): [Array<SelectableValue<string>>, boolean] => {\n const [regionsIsLoading, setRegionsIsLoading] = useState<boolean>(false);\n const [regions, setRegions] = useState<Array<SelectableValue<string>>>([{ label: 'default', value: 'default' }]);\n\n useEffect(() => {\n setRegionsIsLoading(true);\n\n const variableOptionGroup = {\n label: 'Template Variables',\n options: datasource.getVariables().map(toOption),\n };\n\n datasource.resources\n .getRegions()\n .then((regions: Array<SelectableValue<string>>) => setRegions([...regions, variableOptionGroup]))\n .finally(() => setRegionsIsLoading(false));\n }, [datasource]);\n\n return [regions, regionsIsLoading];\n};\n\nexport const useNamespaces = (datasource: CloudWatchDatasource) => {\n const [namespaces, setNamespaces] = useState<Array<SelectableValue<string>>>([]);\n useEffect(() => {\n datasource.resources.getNamespaces().then((namespaces) => {\n setNamespaces(appendTemplateVariables(datasource, namespaces));\n });\n }, [datasource]);\n\n return namespaces;\n};\n\nexport const useMetrics = (datasource: CloudWatchDatasource, { region, namespace, accountId }: GetMetricsRequest) => {\n const [metrics, setMetrics] = useState<Array<SelectableValue<string>>>([]);\n\n // need to ensure dependency array below recieves the interpolated value so that the effect is triggered when a variable is changed\n if (region) {\n region = datasource.templateSrv.replace(region, {});\n }\n if (namespace) {\n namespace = datasource.templateSrv.replace(namespace, {});\n }\n\n if (accountId) {\n accountId = datasource.templateSrv.replace(accountId, {});\n }\n useEffect(() => {\n datasource.resources.getMetrics({ namespace, region, accountId }).then((result: Array<SelectableValue<string>>) => {\n setMetrics(appendTemplateVariables(datasource, result));\n });\n }, [datasource, region, namespace, accountId]);\n\n return metrics;\n};\n\nexport const useDimensionKeys = (\n datasource: CloudWatchDatasource,\n { region, namespace, metricName, dimensionFilters, accountId }: GetDimensionKeysRequest\n) => {\n const [dimensionKeys, setDimensionKeys] = useState<Array<SelectableValue<string>>>([]);\n\n // need to ensure dependency array below revieves the interpolated value so that the effect is triggered when a variable is changed\n if (region) {\n region = datasource.templateSrv.replace(region, {});\n }\n if (namespace) {\n namespace = datasource.templateSrv.replace(namespace, {});\n }\n\n if (metricName) {\n metricName = datasource.templateSrv.replace(metricName, {});\n }\n\n if (accountId) {\n accountId = datasource.templateSrv.replace(accountId, {});\n }\n\n if (dimensionFilters) {\n dimensionFilters = datasource.resources.convertDimensionFormat(dimensionFilters, {}, false);\n }\n\n // doing deep comparison to avoid making new api calls to list metrics unless dimension filter object props changes\n useDeepCompareEffect(() => {\n datasource.resources\n .getDimensionKeys({ namespace, region, metricName, accountId, dimensionFilters }, false)\n .then((result: Array<SelectableValue<string>>) => {\n setDimensionKeys(appendTemplateVariables(datasource, result));\n });\n }, [datasource, namespace, region, metricName, accountId, dimensionFilters]);\n\n return dimensionKeys;\n};\n\nexport const useEnsureVariableHasSingleSelection = (datasource: CloudWatchDatasource, target?: string) => {\n const [error, setError] = useState('');\n // interpolate the target to ensure the check in useEffect runs when the variable selection is changed\n const interpolatedTarget = datasource.templateSrv.replace(target);\n\n useEffect(() => {\n if (datasource.resources.isVariableWithMultipleOptionsSelected(target)) {\n const newErrorMessage = `Template variables with multiple selected options are not supported for ${target}`;\n if (error !== newErrorMessage) {\n setError(newErrorMessage);\n }\n return;\n }\n\n if (error) {\n setError('');\n }\n }, [datasource.resources, target, interpolatedTarget, error]);\n\n return error;\n};\n\nexport const useIsMonitoringAccount = (resources: ResourcesAPI, region: string) => {\n const [isMonitoringAccount, setIsMonitoringAccount] = useState(false);\n // we call this before the use effect to ensure dependency array below\n // receives the interpolated value so that the effect is triggered when a variable is changed\n if (region) {\n region = resources.templateSrv.replace(region, {});\n }\n useEffect(() => {\n if (config.featureToggles.cloudWatchCrossAccountQuerying) {\n resources.isMonitoringAccount(region).then((result) => setIsMonitoringAccount(result));\n }\n }, [region, resources]);\n\n return isMonitoringAccount;\n};\n\nexport const useAccountOptions = (\n resources: Pick<ResourcesAPI, 'getAccounts' | 'templateSrv' | 'getVariables'> | undefined,\n region: string\n) => {\n // we call this before the use effect to ensure dependency array below\n // receives the interpolated value so that the effect is triggered when a variable is changed\n if (region) {\n region = resources?.templateSrv.replace(region, {}) ?? '';\n }\n\n const fetchAccountOptions = async () => {\n if (!config.featureToggles.cloudWatchCrossAccountQuerying) {\n return Promise.resolve([]);\n }\n const accounts = (await resources?.getAccounts({ region })) ?? [];\n if (accounts.length === 0) {\n return [];\n }\n\n const options: Array<SelectableValue<string>> = accounts.map((a) => ({\n label: a.label,\n value: a.id,\n description: a.id,\n }));\n\n const variableOptions = resources?.getVariables().map(toOption) || [];\n\n const variableOptionGroup: SelectableValue<string> = {\n label: 'Template Variables',\n options: variableOptions,\n };\n\n return [...options, variableOptionGroup];\n };\n\n const [state, doFetch] = useAsyncFn(fetchAccountOptions, [resources, region]);\n\n useEffect(() => {\n doFetch();\n }, [resources, region, doFetch]);\n\n return state;\n};\n","export const standardStatistics = ['Average', 'Maximum', 'Minimum', 'Sum', 'SampleCount', 'IQM'];\n","import { useMemo } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { Select } from '@grafana/ui';\n\nexport interface Props {\n onChange: (accountId?: string) => void;\n accountOptions: Array<SelectableValue<string>>;\n accountId?: string;\n}\n\nexport const ALL_ACCOUNTS_OPTION = {\n label: 'All',\n value: 'all',\n description: 'Target all linked accounts',\n};\n\nexport function Account({ accountId, onChange, accountOptions }: Props) {\n const selectedAccountExistsInOptions = useMemo(\n () =>\n accountOptions.find((a) => {\n if (a.options) {\n const matchingTemplateVar = a.options.find((tempVar: SelectableValue<string>) => {\n return tempVar.value === accountId;\n });\n return matchingTemplateVar;\n }\n return a.value === accountId;\n }),\n [accountOptions, accountId]\n );\n\n if (accountOptions.length === 0) {\n return null;\n }\n\n return (\n <EditorField\n label=\"Account\"\n width={26}\n tooltip=\"A CloudWatch monitoring account views data from source accounts so you can centralize monitoring and troubleshooting activities across multiple accounts. Go to the CloudWatch settings page in the AWS console for more details.\"\n >\n <Select\n aria-label=\"Account Selection\"\n value={selectedAccountExistsInOptions ? accountId : ALL_ACCOUNTS_OPTION.value}\n options={[ALL_ACCOUNTS_OPTION, ...accountOptions]}\n onChange={({ value }) => {\n onChange(value);\n }}\n />\n </EditorField>\n );\n}\n","import { css, cx } from '@emotion/css';\nimport { useMemo } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { GrafanaTheme2, SelectableValue, toOption } from '@grafana/data';\nimport { AccessoryButton, InputGroup } from '@grafana/plugin-ui';\nimport { Alert, Select, useStyles2 } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { useDimensionKeys, useEnsureVariableHasSingleSelection } from '../../../hooks';\nimport { Dimensions, MetricStat } from '../../../types';\nimport { appendTemplateVariables } from '../../../utils/utils';\n\nimport { DimensionFilterCondition } from './Dimensions';\n\nexport interface Props {\n metricStat: MetricStat;\n datasource: CloudWatchDatasource;\n filter: DimensionFilterCondition;\n disableExpressions: boolean;\n onChange: (value: DimensionFilterCondition) => void;\n onDelete: () => void;\n}\n\nconst wildcardOption = { value: '*', label: '*' };\n\nconst excludeCurrentKey = (dimensions: Dimensions, currentKey: string | undefined) =>\n Object.entries(dimensions ?? {}).reduce<Dimensions>((acc, [key, value]) => {\n if (key !== currentKey) {\n return { ...acc, [key]: value };\n }\n return acc;\n }, {});\n\nexport const FilterItem = ({ filter, metricStat, datasource, disableExpressions, onChange, onDelete }: Props) => {\n const { region, namespace, metricName, dimensions, accountId } = metricStat;\n const error = useEnsureVariableHasSingleSelection(datasource, filter.key);\n const dimensionsExcludingCurrentKey = useMemo(\n () => excludeCurrentKey(dimensions ?? {}, filter.key),\n [dimensions, filter]\n );\n const dimensionKeys = useDimensionKeys(datasource, {\n ...metricStat,\n dimensionFilters: dimensionsExcludingCurrentKey,\n });\n\n const loadDimensionValues = async () => {\n if (!filter.key) {\n return [];\n }\n\n return datasource.resources\n .getDimensionValues({\n dimensionKey: filter.key,\n dimensionFilters: dimensionsExcludingCurrentKey,\n region,\n namespace,\n metricName,\n accountId,\n })\n .then((result: Array<SelectableValue<string>>) => {\n if (result.length && !disableExpressions && !result.some((o) => o.value === wildcardOption.value)) {\n result.unshift(wildcardOption);\n }\n return appendTemplateVariables(datasource, result);\n });\n };\n\n const [state, loadOptions] = useAsyncFn(loadDimensionValues, [\n filter.key,\n dimensions,\n region,\n namespace,\n metricName,\n accountId,\n ]);\n const styles = useStyles2(getOperatorStyles);\n\n return (\n <div className={styles.container} data-testid=\"cloudwatch-dimensions-filter-item\">\n <InputGroup>\n <Select\n aria-label=\"Dimensions filter key\"\n inputId=\"cloudwatch-dimensions-filter-item-key\"\n width=\"auto\"\n value={filter.key ? toOption(filter.key) : null}\n allowCustomValue\n options={dimensionKeys}\n onChange={(change) => {\n if (change.label) {\n onChange({ key: change.label, value: undefined });\n }\n }}\n />\n\n <span className={cx(styles.root)}>=</span>\n\n <Select\n aria-label=\"Dimensions filter value\"\n inputId=\"cloudwatch-dimensions-filter-item-value\"\n onOpenMenu={loadOptions}\n width=\"auto\"\n value={filter.value ? toOption(filter.value) : null}\n allowCustomValue\n isLoading={state.loading}\n options={state.value}\n onChange={(change) => {\n if (change.value) {\n onChange({ ...filter, value: change.value });\n }\n }}\n />\n <AccessoryButton aria-label=\"remove\" icon=\"times\" variant=\"secondary\" onClick={onDelete} type=\"button\" />\n </InputGroup>\n {error && <Alert className={styles.alert} title={error} severity=\"error\" topSpacing={1} />}\n </div>\n );\n};\n\nconst getOperatorStyles = (theme: GrafanaTheme2) => ({\n root: css({\n padding: theme.spacing(0, 1),\n alignSelf: 'center',\n }),\n container: css({ display: 'inline-block' }),\n alert: css({ minWidth: '100%', width: 'min-content' }),\n});\n","import { isEqual } from 'lodash';\nimport { useMemo, useState } from 'react';\n\nimport { EditorList } from '@grafana/plugin-ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { Dimensions as DimensionsType, MetricStat } from '../../../types';\n\nimport { FilterItem } from './FilterItem';\n\nexport interface Props {\n metricStat: MetricStat;\n onChange: (dimensions: DimensionsType) => void;\n datasource: CloudWatchDatasource;\n disableExpressions: boolean;\n}\n\nexport interface DimensionFilterCondition {\n key?: string;\n operator?: string;\n value?: string;\n}\n\nconst dimensionsToFilterConditions = (dimensions: DimensionsType | undefined) =>\n Object.entries(dimensions ?? {}).reduce<DimensionFilterCondition[]>((acc, [key, value]) => {\n if (!value) {\n return acc;\n }\n\n // Previously, we only appended to the `acc`umulated dimensions if the value was a string.\n // However, Cloudwatch can present dimensions with single-value arrays, e.g.\n // k: FunctionName\n // v: ['MyLambdaFunction']\n // in which case we grab the single-value from the Array and use that as the value.\n let v = '';\n if (typeof value === 'string') {\n v = value;\n } else if (Array.isArray(value) && typeof value[0] === 'string') {\n v = value[0];\n }\n\n if (!v) {\n return acc;\n }\n\n const filter = {\n key: key,\n value: v,\n operator: '=',\n };\n return [...acc, filter];\n }, []);\n\nconst filterConditionsToDimensions = (filters: DimensionFilterCondition[]) => {\n return filters.reduce<DimensionsType>((acc, { key, value }) => {\n if (key && value) {\n return { ...acc, [key]: value };\n }\n return acc;\n }, {});\n};\n\nexport const Dimensions = ({ metricStat, datasource, disableExpressions, onChange }: Props) => {\n const dimensionFilters = useMemo(() => dimensionsToFilterConditions(metricStat.dimensions), [metricStat.dimensions]);\n const [items, setItems] = useState<DimensionFilterCondition[]>(dimensionFilters);\n const onDimensionsChange = (newItems: Array<Partial<DimensionFilterCondition>>) => {\n setItems(newItems);\n\n // The onChange event should only be triggered in the case there is a complete dimension object.\n // So when a new key is added that does not yet have a value, it should not trigger an onChange event.\n const newDimensions = filterConditionsToDimensions(newItems);\n if (!isEqual(newDimensions, metricStat.dimensions)) {\n onChange(newDimensions);\n }\n };\n\n return (\n <EditorList\n items={items}\n onChange={onDimensionsChange}\n renderItem={makeRenderFilter(datasource, metricStat, disableExpressions)}\n />\n );\n};\n\nfunction makeRenderFilter(datasource: CloudWatchDatasource, metricStat: MetricStat, disableExpressions: boolean) {\n function renderFilter(\n item: DimensionFilterCondition,\n onChange: (item: DimensionFilterCondition) => void,\n onDelete: () => void\n ) {\n return (\n <FilterItem\n filter={item}\n onChange={(item) => onChange(item)}\n datasource={datasource}\n metricStat={metricStat}\n disableExpressions={disableExpressions}\n onDelete={onDelete}\n />\n );\n }\n\n return renderFilter;\n}\n","import { useEffect } from 'react';\nimport * as React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { EditorField, EditorFieldGroup, EditorRow, EditorRows, EditorSwitch } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { Select, TextLink } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { useAccountOptions, useMetrics, useNamespaces } from '../../../hooks';\nimport { standardStatistics } from '../../../standardStatistics';\nimport { MetricStat } from '../../../types';\nimport { appendTemplateVariables, toOption } from '../../../utils/utils';\nimport { Account } from '../Account';\nimport { Dimensions } from '../Dimensions/Dimensions';\n\nexport type Props = {\n refId: string;\n metricStat: MetricStat;\n datasource: CloudWatchDatasource;\n disableExpressions?: boolean;\n onChange: (value: MetricStat) => void;\n};\n\nconst percentileSyntaxRE = /^(p|tm|tc|ts|wm)\\d{2}(?:\\.\\d{1,2})?$/;\nconst boundariesInnerParenthesesSyntax = `\\\\d*(\\\\.\\\\d+)?%?:\\\\d*(\\\\.\\\\d+)?%?`;\nconst boundariesSyntaxRE = new RegExp(`^(PR|TM|TC|TS|WM)\\\\((${boundariesInnerParenthesesSyntax})\\\\)$`);\n\n// used in both Metric query editor and in Annotations Editor\nexport const MetricStatEditor = ({\n refId,\n metricStat,\n datasource,\n disableExpressions = false,\n onChange,\n}: React.PropsWithChildren<Props>) => {\n const namespaces = useNamespaces(datasource);\n const metrics = useMetrics(datasource, metricStat);\n const accountState = useAccountOptions(datasource.resources, metricStat.region);\n\n useEffect(() => {\n datasource.resources.isMonitoringAccount(metricStat.region).then((isMonitoringAccount) => {\n if (isMonitoringAccount && !accountState.loading && accountState.value?.length && !metricStat.accountId) {\n onChange({ ...metricStat, accountId: 'all' });\n }\n\n if (!accountState.loading && accountState.value && !accountState.value.length && metricStat.accountId) {\n onChange({ ...metricStat, accountId: undefined });\n }\n });\n }, [accountState, metricStat, onChange, datasource.resources]);\n\n const onNamespaceChange = async (metricStat: MetricStat) => {\n const validatedQuery = await validateMetricName(metricStat);\n onChange(validatedQuery);\n };\n\n const validateMetricName = async (metricStat: MetricStat) => {\n let { metricName, namespace, region } = metricStat;\n if (!metricName) {\n return metricStat;\n }\n await datasource.resources.getMetrics({ namespace, region }).then((result: Array<SelectableValue<string>>) => {\n if (!result.find((metric) => metric.value === metricName)) {\n metricName = '';\n }\n });\n return { ...metricStat, metricName };\n };\n\n return (\n <EditorRows>\n <EditorRow>\n {!disableExpressions && config.featureToggles.cloudWatchCrossAccountQuerying && (\n <Account\n accountId={metricStat.accountId}\n onChange={(accountId?: string) => {\n onChange({ ...metricStat, accountId });\n }}\n accountOptions={accountState?.value || []}\n ></Account>\n )}\n <EditorFieldGroup>\n <EditorField label=\"Namespace\" width={26}>\n <Select\n aria-label=\"Namespace\"\n value={metricStat?.namespace && toOption(metricStat.namespace)}\n allowCustomValue\n options={namespaces}\n onChange={({ value: namespace }) => {\n if (namespace) {\n onNamespaceChange({ ...metricStat, namespace });\n }\n }}\n />\n </EditorField>\n <EditorField label=\"Metric name\" width={16}>\n <Select\n aria-label=\"Metric name\"\n value={metricStat?.metricName && toOption(metricStat.metricName)}\n allowCustomValue\n options={metrics}\n onChange={({ value: metricName }) => {\n if (metricName) {\n onChange({ ...metricStat, metricName });\n }\n }}\n />\n </EditorField>\n\n <EditorField label=\"Statistic\" width={16}>\n <Select\n inputId={`${refId}-metric-stat-editor-select-statistic`}\n allowCustomValue\n value={toOption(metricStat.statistic ?? standardStatistics[0])}\n options={appendTemplateVariables(\n datasource,\n standardStatistics.filter((s) => s !== metricStat.statistic).map(toOption)\n )}\n onChange={({ value: statistic }) => {\n if (\n !statistic ||\n (!standardStatistics.includes(statistic) &&\n !(percentileSyntaxRE.test(statistic) || boundariesSyntaxRE.test(statistic)) &&\n !datasource.templateSrv.containsTemplate(statistic))\n ) {\n return;\n }\n\n onChange({ ...metricStat, statistic });\n }}\n />\n </EditorField>\n </EditorFieldGroup>\n </EditorRow>\n\n <EditorRow>\n <EditorField label=\"Dimensions\">\n <Dimensions\n metricStat={metricStat}\n onChange={(dimensions) => onChange({ ...metricStat, dimensions })}\n disableExpressions={disableExpressions}\n datasource={datasource}\n />\n </EditorField>\n {!disableExpressions && (\n <EditorField\n label=\"Match exact\"\n optional={true}\n tooltip={\n <>\n {\n 'Only show metrics that contain exactly the dimensions defined in the query and match the specified values. If this is enabled, all dimensions of the metric being queried must be specified so that the '\n }\n <TextLink\n href=\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/search-expression-syntax.html\"\n external\n >\n metric schema\n </TextLink>\n {\n ' matches exactly. If this is disabled, metrics that match the schema and have additional dimensions will also be returned.'\n }\n </>\n }\n tooltipInteractive\n >\n <EditorSwitch\n id={`${refId}-cloudwatch-match-exact`}\n value={!!metricStat.matchExact}\n onChange={(e) => {\n onChange({\n ...metricStat,\n matchExact: e.currentTarget.checked,\n });\n }}\n />\n </EditorField>\n )}\n </EditorRow>\n </EditorRows>\n );\n};\n","import { ChangeEvent } from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\nimport { EditorField, EditorHeader, EditorRow, EditorSwitch, InlineSelect } from '@grafana/plugin-ui';\nimport { Alert, Input, Space } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { isCloudWatchAnnotationQuery } from '../../guards';\nimport { useRegions } from '../../hooks';\nimport { CloudWatchJsonData, CloudWatchQuery, MetricStat } from '../../types';\nimport { MetricStatEditor } from '../shared/MetricStatEditor/MetricStatEditor';\n\nexport type Props = QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>;\n\n// Dashboard Settings -> Annotations -> New Query\nexport const AnnotationQueryEditor = (props: Props) => {\n const { query, onChange, datasource } = props;\n const [regions, regionIsLoading] = useRegions(datasource);\n\n if (!isCloudWatchAnnotationQuery(query)) {\n return (\n <Alert severity=\"error\" title=\"Invalid annotation query\" topSpacing={2}>\n {JSON.stringify(query, null, 4)}\n </Alert>\n );\n }\n\n return (\n <>\n <EditorHeader>\n <InlineSelect\n label=\"Region\"\n value={regions.find((v) => v.value === query.region)}\n placeholder=\"Select region\"\n allowCustomValue\n onChange={({ value: region }) => region && onChange({ ...query, region })}\n options={regions}\n isLoading={regionIsLoading}\n />\n </EditorHeader>\n <Space v={0.5} />\n <MetricStatEditor\n {...props}\n refId={query.refId}\n metricStat={query}\n disableExpressions={true}\n onChange={(metricStat: MetricStat) => onChange({ ...query, ...metricStat })}\n ></MetricStatEditor>\n <Space v={0.5} />\n <EditorRow>\n <EditorField label=\"Period\" width={26} tooltip=\"Minimum interval between points in seconds.\">\n <Input\n value={query.period || ''}\n placeholder=\"auto\"\n onChange={(event: ChangeEvent<HTMLInputElement>) => onChange({ ...query, period: event.target.value })}\n />\n </EditorField>\n <EditorField label=\"Enable Prefix Matching\" optional={true}>\n <EditorSwitch\n value={query.prefixMatching}\n onChange={(e) => {\n onChange({\n ...query,\n prefixMatching: e.currentTarget.checked,\n });\n }}\n />\n </EditorField>\n <EditorField label=\"Action\" optional={true} disabled={!query.prefixMatching}>\n <Input\n value={query.actionPrefix || ''}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange({ ...query, actionPrefix: event.target.value })\n }\n />\n </EditorField>\n <EditorField label=\"Alarm Name\" optional={true} disabled={!query.prefixMatching}>\n <Input\n value={query.alarmNamePrefix || ''}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange({ ...query, alarmNamePrefix: event.target.value })\n }\n />\n </EditorField>\n </EditorRow>\n </>\n );\n};\n","import {\n CloudWatchAnnotationQuery,\n CloudWatchLogsQuery,\n CloudWatchMetricsQuery,\n LogGroup,\n LogsQueryLanguage,\n MetricEditorMode,\n MetricQueryType,\n VariableQuery,\n VariableQueryType,\n} from './types';\n\nexport const DEFAULT_METRICS_QUERY: Omit<CloudWatchMetricsQuery, 'refId'> = {\n queryMode: 'Metrics',\n namespace: '',\n metricName: '',\n expression: '',\n dimensions: {},\n region: 'default',\n id: '',\n statistic: 'Average',\n period: '',\n metricQueryType: MetricQueryType.Search,\n metricEditorMode: MetricEditorMode.Builder,\n sql: undefined,\n sqlExpression: '',\n matchExact: true,\n};\n\nexport const DEFAULT_ANNOTATIONS_QUERY: Omit<CloudWatchAnnotationQuery, 'refId'> = {\n queryMode: 'Annotations',\n namespace: '',\n region: 'default',\n statistic: 'Average',\n};\n\nexport const DEFAULT_CWLI_QUERY_STRING = 'fields @timestamp, @message |\\nsort @timestamp desc |\\nlimit 20';\nexport const DEFAULT_PPL_QUERY_STRING = 'fields `@timestamp`, `@message`\\n| sort - `@timestamp`\\n| head 25s';\nexport const DEFAULT_SQL_QUERY_STRING =\n 'SELECT `@timestamp`, `@message`\\nFROM `log_group`\\nORDER BY `@timestamp` DESC\\nLIMIT 25;';\n\nexport const getDefaultLogsQuery = (\n defaultLogGroups?: LogGroup[],\n legacyDefaultLogGroups?: string[]\n): Omit<CloudWatchLogsQuery, 'refId' | 'queryMode'> => ({\n id: '',\n region: 'default',\n // in case legacy default log groups have been defined in the ConfigEditor, they will be migrated in the LogGroupsField component or the next time the ConfigEditor is opened.\n // the migration requires async backend calls, so we don't want to do it here as it would block the UI.\n logGroupNames: legacyDefaultLogGroups,\n logGroups: defaultLogGroups ?? [],\n queryLanguage: LogsQueryLanguage.CWLI,\n});\n\nexport const DEFAULT_VARIABLE_QUERY: Partial<VariableQuery> = {\n queryType: VariableQueryType.Regions,\n region: 'default',\n};\n","import { AnnotationQuery } from '@grafana/data';\n\nimport { AnnotationQueryEditor } from './components/AnnotationQueryEditor/AnnotationQueryEditor';\nimport { DEFAULT_ANNOTATIONS_QUERY } from './defaultQueries';\nimport { isCloudWatchAnnotation } from './guards';\nimport { CloudWatchAnnotationQuery, CloudWatchQuery, LegacyAnnotationQuery } from './types';\n\nexport const CloudWatchAnnotationSupport = {\n // converts legacy angular style queries to new format. Also sets the same default values as in the deprecated angular directive\n prepareAnnotation: (\n query: LegacyAnnotationQuery | AnnotationQuery<CloudWatchAnnotationQuery>\n ): AnnotationQuery<CloudWatchAnnotationQuery> => {\n if (isCloudWatchAnnotation(query)) {\n return query;\n }\n\n return {\n // setting AnnotationQuery props explicitly since spreading would incorrectly use props that should be on the target only\n datasource: query.datasource,\n enable: query.enable,\n iconColor: query.iconColor,\n name: query.name,\n builtIn: query.builtIn,\n hide: query.hide,\n target: {\n ...query.target,\n ...query,\n statistic: query.statistic || DEFAULT_ANNOTATIONS_QUERY.statistic,\n region: query.region || DEFAULT_ANNOTATIONS_QUERY.region,\n queryMode: 'Annotations',\n refId: query.refId || 'annotationQuery',\n },\n };\n },\n // return undefined if query is not complete so that annotation query execution is quietly skipped\n prepareQuery: (anno: AnnotationQuery<CloudWatchAnnotationQuery>): CloudWatchQuery | undefined => {\n if (!anno.target) {\n return undefined;\n }\n\n const { prefixMatching, actionPrefix, alarmNamePrefix, statistic, namespace, metricName } = anno.target;\n const validPrefixMatchingQuery = !!prefixMatching && !!actionPrefix && !!alarmNamePrefix;\n const validMetricStatQuery = !prefixMatching && !!namespace && !!metricName && !!statistic;\n\n if (validPrefixMatchingQuery || validMetricStatQuery) {\n return anno.target;\n }\n\n return undefined;\n },\n getDefaultQuery() {\n return DEFAULT_ANNOTATIONS_QUERY;\n },\n QueryEditor: AnnotationQueryEditor,\n};\n","import { VariableOption, UserProps, OrgProps, DashboardProps, ScopedVars } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\n\n/*\n * This regex matches 3 types of variable reference with an optional format specifier\n * There are 6 capture groups that replace will return\n * \\$(\\w+) $var1\n * \\[\\[(\\w+?)(?::(\\w+))?\\]\\] [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(?:\\.([^:^\\}]+))?(?::([^\\}]+))?} ${var3} or ${var3.fieldPath} or ${var3:fmt3} (or ${var3.fieldPath:fmt3} but that is not a separate capture group)\n */\nconst variableRegex = /\\$(\\w+)|\\[\\[(\\w+?)(?::(\\w+))?\\]\\]|\\${(\\w+)(?:\\.([^:^\\}]+))?(?::([^\\}]+))?}/g;\n\n// Helper function since lastIndex is not reset\nconst variableRegexExec = (variableString: string) => {\n variableRegex.lastIndex = 0;\n return variableRegex.exec(variableString);\n};\n\nexport const getVariableName = (expression: string) => {\n const match = variableRegexExec(expression);\n if (!match) {\n return null;\n }\n const variableName = match.slice(1).find((match) => match !== undefined);\n return variableName;\n};\n\n/**\n * @remarks\n * Takes a string array of variables and non-variables and returns a string array with the raw values of the variable(s)\n * A few examples:\n * single-valued variable + non-variable item. ['$singleValuedVariable', 'log-group'] => ['value', 'log-group']\n * multi-valued variable + non-variable item. ['$multiValuedVariable', 'log-group'] => ['value1', 'value2', 'log-group']\n * @param templateSrv - The template service\n * @param strings - The array of strings to interpolate. May contain variables and non-variables.\n * @pararm scopedVars - The scoped variables to use when interpolating the variables.\n * @param key - Allows you to specify whether the variable MetricFindValue.text or MetricFindValue.value should be used when interpolating the variable. Optional, defaults to 'value'.\n **/\nexport const interpolateStringArrayUsingSingleOrMultiValuedVariable = (\n templateSrv: TemplateSrv,\n strings: string[],\n scopedVars: ScopedVars,\n key?: 'value' | 'text'\n) => {\n key = key ?? 'value';\n const format = key === 'value' ? 'pipe' : 'text';\n let result: string[] = [];\n for (const string of strings) {\n const variableName = getVariableName(string);\n const valueVar = templateSrv.getVariables().find(({ name }) => name === variableName);\n\n if (valueVar && 'current' in valueVar && isVariableOption(valueVar.current)) {\n const rawValue = valueVar.current[key];\n if (Array.isArray(rawValue)) {\n const separator = format === 'text' ? ' + ' : '|';\n result.push(...templateSrv.replace(string, scopedVars, format).split(separator));\n } else if (typeof rawValue === 'string') {\n result.push(templateSrv.replace(string, scopedVars, format));\n }\n } else {\n // if it's not a variable, just add the raw value\n result.push(string);\n }\n }\n\n return result;\n};\n\nexport const isTemplateVariable = (templateSrv: TemplateSrv, string: string) => {\n const variableName = getVariableName(string);\n return templateSrv.getVariables().some(({ name }) => name === variableName);\n};\n\nconst isVariableOption = (\n current:\n | VariableOption\n | Record<string, never>\n | { value: UserProps }\n | { value: OrgProps }\n | { value: DashboardProps }\n): current is VariableOption => {\n return current.hasOwnProperty('value') && current.hasOwnProperty('text');\n};\n","import { TemplateSrv } from '@grafana/runtime';\n\nimport { LogGroup } from '../dataquery.gen';\nimport { ResourcesAPI } from '../resources/ResourcesAPI';\nimport { interpolateStringArrayUsingSingleOrMultiValuedVariable } from '../utils/templateVariableUtils';\n\nexport const fetchLogGroupFields = async (\n logGroups: LogGroup[],\n region: string,\n templateSrv: TemplateSrv,\n resources: ResourcesAPI\n): Promise<string[]> => {\n if (logGroups.length === 0) {\n return [];\n }\n\n const interpolatedLogGroups = interpolateStringArrayUsingSingleOrMultiValuedVariable(\n templateSrv,\n logGroups.map((lg) => lg.name),\n {},\n 'text'\n );\n\n const results = await Promise.all(\n interpolatedLogGroups.map((logGroupName) =>\n resources\n .getLogGroupFields(region, logGroupName)\n .then((fields) => fields.filter((f) => f).map((f) => f.value.name ?? ''))\n )\n );\n // Deduplicate fields\n return [...new Set(results.flat())];\n};\n","import Prism, { Grammar } from 'prismjs';\nimport { lastValueFrom } from 'rxjs';\n\nimport { AbsoluteTimeRange, HistoryItem, LanguageProvider } from '@grafana/data';\nimport { BackendDataSourceResponse, FetchResponse, TemplateSrv, getTemplateSrv } from '@grafana/runtime';\nimport { CompletionItemGroup, SearchFunctionType, Token, TypeaheadInput, TypeaheadOutput } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { CloudWatchQuery, LogGroup } from '../../types';\nimport { fetchLogGroupFields } from '../utils';\n\nimport syntax, {\n AGGREGATION_FUNCTIONS_STATS,\n BOOLEAN_FUNCTIONS,\n DATETIME_FUNCTIONS,\n FIELD_AND_FILTER_FUNCTIONS,\n IP_FUNCTIONS,\n NUMERIC_OPERATORS,\n QUERY_COMMANDS,\n STRING_FUNCTIONS,\n} from './syntax';\n\nexport type CloudWatchHistoryItem = HistoryItem<CloudWatchQuery>;\n\ntype TypeaheadContext = {\n history?: CloudWatchHistoryItem[];\n absoluteRange?: AbsoluteTimeRange;\n logGroups?: LogGroup[];\n region: string;\n};\n\nexport class CloudWatchLogsLanguageProvider extends LanguageProvider {\n started = false;\n declare initialRange: AbsoluteTimeRange;\n datasource: CloudWatchDatasource;\n templateSrv: TemplateSrv;\n\n constructor(datasource: CloudWatchDatasource, templateSrv?: TemplateSrv) {\n super();\n\n this.datasource = datasource;\n this.templateSrv = templateSrv ?? getTemplateSrv();\n }\n\n // Strip syntax chars\n cleanText = (s: string) => s.replace(/[()]/g, '').trim();\n\n getSyntax(): Grammar {\n return syntax;\n }\n\n request = (url: string, params?: any): Promise<FetchResponse<BackendDataSourceResponse>> => {\n return lastValueFrom(this.datasource.logsQueryRunner.awsRequest(url, params));\n };\n\n start = () => {\n if (!this.startTask) {\n this.startTask = Promise.resolve().then(() => {\n this.started = true;\n return [];\n });\n }\n\n return this.startTask;\n };\n\n isStatsQuery(query: string): boolean {\n const grammar = this.getSyntax();\n const tokens = Prism.tokenize(query, grammar) ?? [];\n\n return !!tokens.find(\n (token) =>\n typeof token !== 'string' &&\n token.content.toString().toLowerCase() === 'stats' &&\n token.type === 'query-command'\n );\n }\n\n /**\n * Return suggestions based on input that can be then plugged into a typeahead dropdown.\n * Keep this DOM-free for testing\n * @param input\n * @param context Is optional in types but is required in case we are doing getLabelCompletionItems\n * @param context.absoluteRange Required in case we are doing getLabelCompletionItems\n * @param context.history Optional used only in getEmptyCompletionItems\n */\n async provideCompletionItems(input: TypeaheadInput, context?: TypeaheadContext): Promise<TypeaheadOutput> {\n const { value } = input;\n\n // Get tokens\n const tokens: Token[] = value?.data.get('tokens');\n\n if (!tokens || !tokens.length) {\n return { suggestions: [] };\n }\n\n const curToken = tokens.filter(\n (token) =>\n token.offsets &&\n token.offsets.start <= value!.selection?.start?.offset &&\n token.offsets.end >= value!.selection?.start?.offset\n )[0];\n\n const isFirstToken = !curToken.prev;\n const prevToken = prevNonWhitespaceToken(curToken);\n\n const isCommandStart = isFirstToken || (!isFirstToken && prevToken?.types.includes('command-separator'));\n if (isCommandStart) {\n return this.getCommandCompletionItems();\n }\n\n if (isInsideFunctionParenthesis(curToken)) {\n return await this.getFieldCompletionItems(context?.logGroups, context?.region || 'default');\n }\n\n if (isAfterKeyword('by', curToken)) {\n return this.handleKeyword(context);\n }\n\n if (prevToken?.types.includes('comparison-operator')) {\n return this.handleComparison(context);\n }\n\n const commandToken = previousCommandToken(curToken);\n if (commandToken) {\n return await this.handleCommand(commandToken, curToken, context);\n }\n\n return {\n suggestions: [],\n };\n }\n\n private handleKeyword = async (context?: TypeaheadContext): Promise<TypeaheadOutput> => {\n const suggs = await this.getFieldCompletionItems(context?.logGroups, context?.region || 'default');\n const functionSuggestions: CompletionItemGroup[] = [\n {\n searchFunctionType: SearchFunctionType.Prefix,\n label: 'Functions',\n items: STRING_FUNCTIONS.concat(DATETIME_FUNCTIONS, IP_FUNCTIONS),\n },\n ];\n suggs.suggestions.push(...functionSuggestions);\n\n return suggs;\n };\n\n private handleCommand = async (\n commandToken: Token,\n curToken: Token,\n context?: TypeaheadContext\n ): Promise<TypeaheadOutput> => {\n const queryCommand = commandToken.content.toLowerCase();\n const prevToken = prevNonWhitespaceToken(curToken);\n const currentTokenIsFirstArg = prevToken === commandToken;\n\n if (queryCommand === 'sort') {\n return this.handleSortCommand(currentTokenIsFirstArg, curToken, context);\n }\n\n if (queryCommand === 'parse') {\n if (currentTokenIsFirstArg) {\n return await this.getFieldCompletionItems(context?.logGroups ?? [], context?.region || 'default');\n }\n }\n\n const currentTokenIsAfterCommandAndEmpty = isTokenType(commandToken.next, 'whitespace') && !commandToken.next?.next;\n const currentTokenIsAfterCommand =\n currentTokenIsAfterCommandAndEmpty || nextNonWhitespaceToken(commandToken) === curToken;\n\n const currentTokenIsComma = isTokenType(curToken, 'punctuation', ',');\n const currentTokenIsCommaOrAfterComma = currentTokenIsComma || isTokenType(prevToken, 'punctuation', ',');\n\n // We only show suggestions if we are after a command or after a comma which is a field separator\n if (!(currentTokenIsAfterCommand || currentTokenIsCommaOrAfterComma)) {\n return { suggestions: [] };\n }\n\n if (['display', 'fields'].includes(queryCommand)) {\n const typeaheadOutput = await this.getFieldCompletionItems(\n context?.logGroups ?? [],\n context?.region || 'default'\n );\n typeaheadOutput.suggestions.push(...this.getFieldAndFilterFunctionCompletionItems().suggestions);\n\n return typeaheadOutput;\n }\n\n if (queryCommand === 'stats') {\n const typeaheadOutput = this.getStatsAggCompletionItems();\n if (currentTokenIsComma || currentTokenIsAfterCommandAndEmpty) {\n typeaheadOutput?.suggestions.forEach((group) => {\n group.skipFilter = true;\n });\n }\n return typeaheadOutput;\n }\n\n if (queryCommand === 'filter' && currentTokenIsFirstArg) {\n const sugg = await this.getFieldCompletionItems(context?.logGroups, context?.region || 'default');\n const boolFuncs = this.getBoolFuncCompletionItems();\n sugg.suggestions.push(...boolFuncs.suggestions);\n return sugg;\n }\n return { suggestions: [] };\n };\n\n private async handleSortCommand(\n isFirstArgument: boolean,\n curToken: Token,\n context?: TypeaheadContext\n ): Promise<TypeaheadOutput> {\n if (isFirstArgument) {\n return await this.getFieldCompletionItems(context?.logGroups, context?.region || 'default');\n } else if (isTokenType(prevNonWhitespaceToken(curToken), 'field-name')) {\n // suggest sort options\n return {\n suggestions: [\n {\n searchFunctionType: SearchFunctionType.Prefix,\n label: 'Sort Order',\n items: [\n {\n label: 'asc',\n },\n { label: 'desc' },\n ],\n },\n ],\n };\n }\n\n return { suggestions: [] };\n }\n\n private handleComparison = async (context?: TypeaheadContext) => {\n const fieldsSuggestions = await this.getFieldCompletionItems(context?.logGroups, context?.region || 'default');\n const comparisonSuggestions = this.getComparisonCompletionItems();\n fieldsSuggestions.suggestions.push(...comparisonSuggestions.suggestions);\n return fieldsSuggestions;\n };\n\n private getCommandCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [{ searchFunctionType: SearchFunctionType.Prefix, label: 'Commands', items: QUERY_COMMANDS }],\n };\n };\n\n private getFieldAndFilterFunctionCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [\n { searchFunctionType: SearchFunctionType.Prefix, label: 'Functions', items: FIELD_AND_FILTER_FUNCTIONS },\n ],\n };\n };\n\n private getStatsAggCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [\n { searchFunctionType: SearchFunctionType.Prefix, label: 'Functions', items: AGGREGATION_FUNCTIONS_STATS },\n ],\n };\n };\n\n private getBoolFuncCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [\n {\n searchFunctionType: SearchFunctionType.Prefix,\n label: 'Functions',\n items: BOOLEAN_FUNCTIONS,\n },\n ],\n };\n };\n\n private getComparisonCompletionItems = (): TypeaheadOutput => {\n return {\n suggestions: [\n {\n searchFunctionType: SearchFunctionType.Prefix,\n label: 'Functions',\n items: NUMERIC_OPERATORS.concat(BOOLEAN_FUNCTIONS),\n },\n ],\n };\n };\n\n private getFieldCompletionItems = async (\n logGroups: LogGroup[] | undefined,\n region: string\n ): Promise<TypeaheadOutput> => {\n if (!logGroups) {\n return { suggestions: [] };\n }\n\n const fields = await fetchLogGroupFields(logGroups, region, this.templateSrv, this.datasource.resources);\n return {\n suggestions: [\n {\n label: 'Fields',\n items: fields.map((field) => ({\n label: field,\n insertText: field.match(/@?[_a-zA-Z]+[_.0-9a-zA-Z]*/) ? undefined : `\\`${field}\\``,\n })),\n },\n ],\n };\n };\n}\n\nfunction nextNonWhitespaceToken(token: Token): Token | null {\n let curToken = token;\n\n while (curToken.next) {\n if (curToken.next.types.includes('whitespace')) {\n curToken = curToken.next;\n } else {\n return curToken.next;\n }\n }\n\n return null;\n}\n\nfunction prevNonWhitespaceToken(token: Token): Token | null {\n let curToken = token;\n\n while (curToken.prev) {\n if (isTokenType(curToken.prev, 'whitespace')) {\n curToken = curToken.prev;\n } else {\n return curToken.prev;\n }\n }\n\n return null;\n}\n\nfunction previousCommandToken(startToken: Token): Token | null {\n let thisToken = startToken;\n while (!!thisToken.prev) {\n thisToken = thisToken.prev;\n if (\n thisToken.types.includes('query-command') &&\n (!thisToken.prev || isTokenType(prevNonWhitespaceToken(thisToken), 'command-separator'))\n ) {\n return thisToken;\n }\n }\n return null;\n}\n\nconst funcsWithFieldArgs = [\n 'avg',\n 'count',\n 'count_distinct',\n 'earliest',\n 'latest',\n 'sortsFirst',\n 'sortsLast',\n 'max',\n 'min',\n 'pct',\n 'stddev',\n 'ispresent',\n 'fromMillis',\n 'toMillis',\n 'isempty',\n 'isblank',\n 'isValidIp',\n 'isValidIpV4',\n 'isValidIpV6',\n 'isIpInSubnet',\n 'isIpv4InSubnet',\n 'isIpv6InSubnet',\n].map((funcName) => funcName.toLowerCase());\n\n/**\n * Returns true if cursor is currently inside a function parenthesis for example `count(|)` or `count(@mess|)` should\n * return true.\n */\nfunction isInsideFunctionParenthesis(curToken: Token): boolean {\n const prevToken = prevNonWhitespaceToken(curToken);\n\n if (!prevToken) {\n return false;\n }\n\n const parenthesisToken = curToken.content === '(' ? curToken : prevToken.content === '(' ? prevToken : undefined;\n if (parenthesisToken) {\n const maybeFunctionToken = prevNonWhitespaceToken(parenthesisToken);\n if (maybeFunctionToken) {\n return (\n funcsWithFieldArgs.includes(maybeFunctionToken.content.toLowerCase()) &&\n maybeFunctionToken.types.includes('function')\n );\n }\n }\n return false;\n}\n\nfunction isAfterKeyword(keyword: string, token: Token): boolean {\n const maybeKeyword = getPreviousTokenExcluding(token, [\n 'whitespace',\n 'function',\n 'punctuation',\n 'field-name',\n 'number',\n ]);\n if (isTokenType(maybeKeyword, 'keyword', 'by')) {\n const prev = getPreviousTokenExcluding(token, ['whitespace']);\n if (prev === maybeKeyword || isTokenType(prev, 'punctuation', ',')) {\n return true;\n }\n }\n return false;\n}\n\nfunction isTokenType(token: Token | undefined | null, type: string, content?: string): boolean {\n if (!token?.types.includes(type)) {\n return false;\n }\n if (content) {\n if (token?.content.toLowerCase() !== content) {\n return false;\n }\n }\n return true;\n}\n\ntype TokenDef = string | { type: string; value: string };\nfunction getPreviousTokenExcluding(token: Token, exclude: TokenDef[]): Token | undefined | null {\n let curToken = token.prev;\n main: while (curToken) {\n for (const item of exclude) {\n if (typeof item === 'string') {\n if (curToken.types.includes(item)) {\n curToken = curToken.prev;\n continue main;\n }\n } else {\n if (curToken.types.includes(item.type) && curToken.content.toLowerCase() === item.value) {\n curToken = curToken.prev;\n continue main;\n }\n }\n }\n break;\n }\n return curToken;\n}\n","import { monacoTypes } from '@grafana/ui';\n\nimport { TokenTypes } from './types';\n\nexport class LinkedToken {\n constructor(\n public type: string,\n public value: string,\n public range: monacoTypes.IRange,\n public previous: LinkedToken | null,\n public next: LinkedToken | null,\n public tokenTypes: TokenTypes\n ) {}\n\n isKeyword(): boolean {\n return this.type === this.tokenTypes.Keyword;\n }\n\n isWhiteSpace(): boolean {\n return this.type === this.tokenTypes.Whitespace;\n }\n\n isParenthesis(): boolean {\n return this.type === this.tokenTypes.Parenthesis;\n }\n\n isIdentifier(): boolean {\n return this.type === this.tokenTypes.Identifier;\n }\n\n isString(): boolean {\n return this.type === this.tokenTypes.String;\n }\n\n isDoubleQuotedString(): boolean {\n return this.type === this.tokenTypes.Type;\n }\n\n isVariable(): boolean {\n return this.type === this.tokenTypes.Variable;\n }\n\n isFunction(): boolean {\n return this.type === this.tokenTypes.Function;\n }\n\n isNumber(): boolean {\n return this.type === this.tokenTypes.Number;\n }\n\n is(type: string, value?: string | number | boolean): boolean {\n const isType = this.type === type;\n return value !== undefined ? isType && this.value === value : isType;\n }\n\n endsWith(value: string | number | boolean): boolean {\n return this.value === value || this.value[this.value.length - 1] === value;\n }\n\n getPreviousNonWhiteSpaceToken(): LinkedToken | null {\n let curr = this.previous;\n while (curr != null) {\n if (!curr.isWhiteSpace()) {\n return curr;\n }\n curr = curr.previous;\n }\n return null;\n }\n\n getPreviousOfType(type: string, value?: string): LinkedToken | null {\n let curr = this.previous;\n while (curr != null) {\n const isType = curr.type === type;\n if (value !== undefined ? isType && curr.value === value : isType) {\n return curr;\n }\n curr = curr.previous;\n }\n return null;\n }\n\n getPreviousUntil(type: string, ignoreTypes: string[], value?: string): LinkedToken[] | null {\n let tokens: LinkedToken[] = [];\n let curr = this.previous;\n while (curr != null) {\n if (ignoreTypes.some((t) => t === curr?.type)) {\n curr = curr.previous;\n continue;\n }\n\n const isType = curr.type === type;\n if (value !== undefined ? isType && curr.value === value : isType) {\n return tokens;\n }\n if (!curr.isWhiteSpace()) {\n tokens.push(curr);\n }\n curr = curr.previous;\n }\n\n return tokens;\n }\n\n getNextUntil(type: string, ignoreTypes: string[], value?: string): LinkedToken[] | null {\n let tokens: LinkedToken[] = [];\n let curr = this.next;\n while (curr != null) {\n if (ignoreTypes.some((t) => t === curr?.type)) {\n curr = curr.next;\n continue;\n }\n\n const isType = curr.type === type;\n if (value !== undefined ? isType && curr.value === value : isType) {\n return tokens;\n }\n if (!curr.isWhiteSpace()) {\n tokens.push(curr);\n }\n curr = curr.next;\n }\n\n return tokens;\n }\n\n getPreviousKeyword(): LinkedToken | null {\n let curr = this.previous;\n while (curr != null) {\n if (curr.isKeyword()) {\n return curr;\n }\n curr = curr.previous;\n }\n return null;\n }\n\n getNextNonWhiteSpaceToken(): LinkedToken | null {\n let curr = this.next;\n while (curr != null) {\n if (!curr.isWhiteSpace()) {\n return curr;\n }\n curr = curr.next;\n }\n return null;\n }\n\n getNextOfType(type: string, value?: string): LinkedToken | null {\n let curr = this.next;\n while (curr != null) {\n const isType = curr.type === type;\n if (value !== undefined ? isType && curr.value === value : isType) {\n return curr;\n }\n curr = curr.next;\n }\n return null;\n }\n}\n","import type { monacoTypes } from '@grafana/ui';\n\nimport { LinkedToken } from './LinkedToken';\nimport { LanguageDefinition } from './register';\nimport { Monaco, TokenTypes } from './types';\n\nexport function linkedTokenBuilder(\n monaco: Monaco,\n language: LanguageDefinition,\n model: monacoTypes.editor.ITextModel,\n position: monacoTypes.IPosition,\n tokenTypes: TokenTypes\n) {\n let current: LinkedToken | null = null;\n let previous: LinkedToken | null = null;\n const tokensPerLine = monaco.editor.tokenize(model.getValue() ?? '', language.id);\n\n for (let lineIndex = 0; lineIndex < tokensPerLine.length; lineIndex++) {\n const tokens = tokensPerLine[lineIndex];\n // In case position is first column in new line, add empty whitespace token so that links are not broken\n if (!tokens.length && previous) {\n const token: monacoTypes.Token = {\n offset: 0,\n type: tokenTypes.Whitespace,\n language: language.id,\n _tokenBrand: undefined,\n };\n tokens.push(token);\n }\n\n for (let columnIndex = 0; columnIndex < tokens.length; columnIndex++) {\n const token = tokens[columnIndex];\n let endColumn =\n tokens.length > columnIndex + 1 ? tokens[columnIndex + 1].offset + 1 : model.getLineLength(lineIndex + 1) + 1;\n\n const range: monacoTypes.IRange = {\n startLineNumber: lineIndex + 1,\n startColumn: token.offset === 0 ? 0 : token.offset + 1,\n endLineNumber: lineIndex + 1,\n endColumn,\n };\n\n const value = model.getValueInRange(range);\n const newToken: LinkedToken = new LinkedToken(token.type, value, range, previous, null, tokenTypes);\n\n if (monaco.Range.containsPosition(range, position)) {\n current = newToken;\n }\n\n if (previous) {\n previous.next = newToken;\n }\n previous = newToken;\n }\n }\n\n return current;\n}\n","import { monacoTypes } from '@grafana/ui';\n\nimport { LanguageDefinition } from './register';\n\nexport type CompletionItem = monacoTypes.languages.CompletionItem;\n\nexport interface TokenTypes {\n Parenthesis: string;\n Whitespace: string;\n Keyword: string;\n Delimiter: string;\n Operator: string;\n Identifier: string;\n Type: string;\n Function: string;\n Number: string;\n String: string;\n Variable: string;\n Comment: string;\n Regexp: string;\n}\n\nexport enum StatementPosition {\n Unknown,\n // sql\n SelectKeyword,\n AfterSelectKeyword,\n SelectExpression,\n AfterSelectExpression,\n AfterSelectFuncFirstArgument,\n PredefinedFunctionArgument,\n FromKeyword,\n AfterFrom,\n AfterFromKeyword,\n AfterFromArguments,\n SchemaFuncFirstArgument,\n SchemaFuncExtraArgument,\n WhereKey,\n WhereComparisonOperator,\n WhereValue,\n AfterWhereValue,\n HavingKey,\n HavingComparisonOperator,\n HavingValue,\n AfterHavingValue,\n CaseKey,\n CaseComparisonOperator,\n CaseValue,\n AfterCaseValue,\n WhenKey,\n WhenComparisonOperator,\n WhenValue,\n AfterWhenValue,\n ThenExpression,\n AfterThenExpression,\n AfterElseKeyword,\n OnKey,\n OnComparisonOperator,\n OnValue,\n AfterOnValue,\n AfterGroupByKeywords,\n AfterGroupBy,\n AfterOrderByKeywords,\n AfterOrderByFunction,\n AfterOrderByDirection,\n Subquery,\n // metric math\n PredefinedFunction,\n SearchFuncSecondArg,\n SearchFuncThirdArg,\n PredefinedFuncSecondArg,\n AfterFunction,\n WithinString,\n // logs\n NewCommand,\n Comment,\n\n DedupKeyword,\n AfterDedupKeyword,\n DisplayKeyword,\n AfterDisplayKeyword,\n FieldsKeyword,\n AfterFieldsKeyword,\n FilterKeyword,\n AfterFilterKeyword,\n FilterArg,\n LimitKeyword,\n AfterLimitKeyword,\n ParseKeyword,\n AfterParseKeyword,\n SortKeyword,\n AfterSortKeyword,\n SortArg,\n StatsKeyword,\n AfterStatsKeyword,\n\n AsKeyword,\n AfterAsKeyword,\n ByKeyword,\n AfterByKeyword,\n InKeyword,\n AfterInKeyword,\n LikeKeyword,\n AfterLikeKeyword,\n\n DiffKeyword,\n AfterDiffKeyword,\n DiffModifierArg,\n\n Function,\n FunctionArg,\n CommandArg,\n AfterCommand,\n\n ArithmeticOperator,\n ArithmeticOperatorArg,\n BooleanOperator,\n BooleanOperatorArg,\n ComparisonOperator,\n ComparisonOperatorArg,\n\n //PPL\n BeforeLogicalExpression,\n AfterArithmeticOperator,\n AfterINKeyword,\n SortField,\n AfterHeadCommand,\n AfterFieldsCommand,\n FieldList,\n AfterDedupFieldNames,\n AfterStatsCommand,\n StatsFunctionArgument,\n AfterStatsBy,\n AfterBooleanArgument,\n EvalClause,\n Expression,\n SortFieldExpression,\n}\n\nexport enum SuggestionKind {\n SelectKeyword,\n AfterSelectKeyword,\n AfterSelectExpression,\n FunctionsWithArguments,\n Metrics,\n FromKeyword,\n AfterFromKeyword,\n AfterFromArguments,\n JoinKeywords,\n HavingKeywords,\n SchemaKeyword,\n Namespaces,\n LabelKeys,\n WhereKeyword,\n GroupByKeywords,\n OrderByKeywords,\n FunctionsWithoutArguments,\n LimitKeyword,\n SortOrderDirectionKeyword,\n ComparisonOperators,\n LabelValues,\n LogicalOperators,\n CaseKeyword,\n WhenKeyword,\n ThenKeyword,\n AfterThenExpression,\n\n // metricmath,\n KeywordArguments,\n Operators,\n Statistic,\n Period,\n\n // logs\n Command,\n Function,\n InKeyword,\n DiffModifier,\n\n // PPL\n BooleanFunction,\n LogicalExpression,\n ValueExpression,\n FieldOperators,\n Field,\n BooleanLiteral,\n DedupParameter,\n StatsParameter,\n BooleanArgument,\n StatsFunctions,\n SpanClause,\n SortFunctions,\n}\n\nexport enum CompletionItemPriority {\n High = 'a',\n MediumHigh = 'd',\n Medium = 'g',\n MediumLow = 'k',\n Low = 'q',\n}\n\nexport interface Editor {\n tokenize: (value: string, languageId: string) => monacoTypes.Token[][];\n}\n\nexport interface Range {\n containsPosition: (range: monacoTypes.IRange, position: monacoTypes.IPosition) => boolean;\n fromPositions: (start: monacoTypes.IPosition, end?: monacoTypes.IPosition) => monacoTypes.Range;\n}\n\nexport interface Languages {\n CompletionItemInsertTextRule: {\n InsertAsSnippet: 4;\n };\n CompletionItemKind: {\n Function: 1;\n };\n}\nexport interface Monaco {\n editor: Editor;\n Range: Range;\n languages: Languages;\n}\n\nexport interface Completeable {\n getCompletionProvider(\n monaco: Monaco,\n languageDefinition: LanguageDefinition\n ): monacoTypes.languages.CompletionItemProvider;\n}\n","import { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport type { Monaco, monacoTypes } from '@grafana/ui';\n\nimport { ResourcesAPI } from '../../resources/ResourcesAPI';\nimport { CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID } from '../cloudwatch-ppl/language';\n\nimport { LinkedToken } from './LinkedToken';\nimport { linkedTokenBuilder } from './linkedTokenBuilder';\nimport { LanguageDefinition } from './register';\nimport { Completeable, StatementPosition, SuggestionKind, TokenTypes } from './types';\n\ntype CompletionItem = monacoTypes.languages.CompletionItem;\n\n/*\nCompletionItemProvider is an extendable class which needs to implement :\n- tokenTypes\n- getStatementPosition\n- getSuggestionKinds\n- getSuggestions\n*/\nexport class CompletionItemProvider implements Completeable {\n resources: ResourcesAPI;\n templateSrv: TemplateSrv;\n tokenTypes: TokenTypes;\n\n constructor(resources: ResourcesAPI, templateSrv: TemplateSrv = getTemplateSrv()) {\n this.resources = resources;\n this.templateSrv = templateSrv;\n this.templateSrv = templateSrv;\n\n // implement with more specific tokens when extending this class\n this.tokenTypes = {\n Parenthesis: 'delimiter.parenthesis',\n Whitespace: 'white',\n Keyword: 'keyword',\n Delimiter: 'delimiter',\n Operator: 'operator',\n Identifier: 'identifier',\n Type: 'type',\n Function: 'predefined',\n Number: 'number',\n String: 'string',\n Variable: 'variable',\n Comment: 'comment',\n Regexp: 'regexp',\n };\n }\n\n // implemented by subclasses, given a token, returns a lexical position in a query\n getStatementPosition(currentToken: LinkedToken | null): StatementPosition {\n return StatementPosition.Unknown;\n }\n\n // implemented by subclasses, given a lexical statement position, returns potential kinds of suggestions\n getSuggestionKinds(position: StatementPosition): SuggestionKind[] {\n return [];\n }\n\n // implemented by subclasses, given potential suggestions kinds, returns suggestion objects for monaco aka \"CompletionItem\"\n getSuggestions(\n monaco: Monaco,\n currentToken: LinkedToken | null,\n suggestionKinds: SuggestionKind[],\n statementPosition: StatementPosition,\n position: monacoTypes.IPosition\n ): Promise<CompletionItem[]> {\n return Promise.reject([]);\n }\n\n // called by registerLanguage and passed to monaco with registerCompletionItemProvider\n // returns an object that implements https://microsoft.github.io/monaco-editor/api/interfaces/monaco.languages.CompletionItemProvider.html\n getCompletionProvider(monaco: Monaco, languageDefinition: LanguageDefinition) {\n const isPPL = languageDefinition.id === CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID; // backticks for field names in PPL\n const triggerCharacters = [' ', '$', ',', '(', \"'\"].concat(isPPL ? ['`'] : []);\n\n return {\n triggerCharacters, // one of these characters indicates that it is time to look for a suggestion\n provideCompletionItems: async (model: monacoTypes.editor.ITextModel, position: monacoTypes.IPosition) => {\n const currentToken = linkedTokenBuilder(monaco, languageDefinition, model, position, this.tokenTypes);\n const statementPosition = this.getStatementPosition(currentToken);\n const suggestionKinds = this.getSuggestionKinds(statementPosition);\n const suggestions = await this.getSuggestions(\n monaco,\n currentToken,\n suggestionKinds,\n statementPosition,\n position\n );\n\n return {\n suggestions,\n };\n },\n };\n }\n}\n","export const TRIGGER_SUGGEST = {\n id: 'editor.action.triggerSuggest',\n title: '',\n};\n","import { LanguageDefinition } from '../monarch/register';\n\nexport const CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID = 'cloudwatch-logs-sql';\n\nconst cloudWatchLogsSqlLanguageDefinition: LanguageDefinition = {\n id: CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID,\n extensions: [],\n aliases: [],\n mimetypes: [],\n loader: () => import('./language'),\n};\nexport default cloudWatchLogsSqlLanguageDefinition;\n","import { TokenTypes } from '../../monarch/types';\nimport { CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID } from '../definition';\n\nexport const SQLTokenTypes: TokenTypes = {\n Parenthesis: `delimiter.parenthesis.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Whitespace: `white.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Keyword: `keyword.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Delimiter: `delimiter.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Operator: `operator.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Identifier: `identifier.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Type: `type.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Function: `predefined.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Number: `number.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n String: `string.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Variable: `variable.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Comment: `comment.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n Regexp: `regexp.${CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID}`,\n};\n","import { LinkedToken } from '../../monarch/LinkedToken';\nimport { StatementPosition } from '../../monarch/types';\nimport {\n ALL,\n DISTINCT,\n AS,\n ASC,\n BY,\n DESC,\n FROM,\n GROUP,\n ORDER,\n SELECT,\n WHERE,\n HAVING,\n ON,\n LOGICAL_OPERATORS,\n PREDICATE_OPERATORS,\n NULL,\n TRUE,\n FALSE,\n IN,\n CASE,\n WHEN,\n THEN,\n ELSE,\n END,\n} from '../language';\n\nimport { SQLTokenTypes } from './types';\n\nexport function getStatementPosition(currentToken: LinkedToken | null): StatementPosition {\n const previousNonWhiteSpace = currentToken?.getPreviousNonWhiteSpaceToken();\n const previousKeyword = currentToken?.getPreviousKeyword();\n\n const normalizedPreviousNonWhiteSpaceValue = previousNonWhiteSpace?.value?.toUpperCase() || '';\n const normalizedPreviousKeywordValue = previousKeyword?.value?.toUpperCase() || '';\n\n let previousNonAliasKeywordValue = previousKeyword;\n let normalizedPreviousNonAliasKeywordValue = normalizedPreviousKeywordValue;\n while (normalizedPreviousNonAliasKeywordValue === AS) {\n previousNonAliasKeywordValue = previousNonAliasKeywordValue?.getPreviousKeyword();\n normalizedPreviousNonAliasKeywordValue = previousNonAliasKeywordValue?.value.toUpperCase() || '';\n }\n\n const isPreviousSelectKeywordGroup =\n normalizedPreviousNonAliasKeywordValue === SELECT ||\n ([ALL, DISTINCT].includes(normalizedPreviousNonAliasKeywordValue) &&\n previousNonAliasKeywordValue?.getPreviousKeyword()?.value.toUpperCase() === SELECT);\n\n if (currentToken?.is(SQLTokenTypes.Comment) || currentToken?.is('comment.quote.cloudwatch-logs-sql')) {\n return StatementPosition.Comment;\n }\n\n if (\n currentToken === null ||\n (currentToken.previous === null && currentToken.isIdentifier()) ||\n (currentToken.previous === null && currentToken.isWhiteSpace()) ||\n (currentToken.previous === null && currentToken.isKeyword() && currentToken.value.toUpperCase() === SELECT)\n ) {\n return StatementPosition.SelectKeyword;\n }\n\n if (\n (currentToken.isWhiteSpace() || currentToken.is(SQLTokenTypes.Parenthesis, ')')) &&\n normalizedPreviousNonWhiteSpaceValue === SELECT\n ) {\n return StatementPosition.AfterSelectKeyword;\n }\n\n if (\n isPreviousSelectKeywordGroup &&\n (currentToken.is(SQLTokenTypes.Delimiter, ',') ||\n (currentToken.isWhiteSpace() && previousNonWhiteSpace?.is(SQLTokenTypes.Delimiter, ',')) ||\n (currentToken.isWhiteSpace() && previousNonWhiteSpace?.isKeyword()) ||\n (currentToken.is(SQLTokenTypes.Parenthesis, ')') &&\n (previousNonWhiteSpace?.isKeyword() || previousNonWhiteSpace?.is(SQLTokenTypes.Delimiter, ','))))\n ) {\n return StatementPosition.SelectExpression;\n }\n\n if (\n isPreviousSelectKeywordGroup &&\n (currentToken.isWhiteSpace() || currentToken.is(SQLTokenTypes.Parenthesis, ')')) &&\n (previousNonWhiteSpace?.isIdentifier() ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, ')') ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, '()') ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Operator, '*'))\n ) {\n return StatementPosition.AfterSelectExpression;\n }\n\n if (\n currentToken.is(SQLTokenTypes.Parenthesis, '()') &&\n normalizedPreviousNonAliasKeywordValue === WHERE &&\n normalizedPreviousNonWhiteSpaceValue === IN\n ) {\n return StatementPosition.Subquery;\n }\n\n if (\n ((currentToken.is(SQLTokenTypes.Parenthesis, '()') || currentToken.is(SQLTokenTypes.Parenthesis, '())')) &&\n previousNonWhiteSpace?.isFunction()) ||\n (currentToken.is(SQLTokenTypes.Delimiter, ',') &&\n currentToken.getPreviousOfType(SQLTokenTypes.Parenthesis, '(')?.getPreviousNonWhiteSpaceToken()?.isFunction()) ||\n (currentToken.isWhiteSpace() &&\n previousNonWhiteSpace?.is(SQLTokenTypes.Delimiter, ',') &&\n currentToken.getPreviousOfType(SQLTokenTypes.Parenthesis, '(')?.getPreviousNonWhiteSpaceToken()?.isFunction()) ||\n (currentToken.is(SQLTokenTypes.Parenthesis, ')') &&\n previousNonWhiteSpace?.is(SQLTokenTypes.Delimiter, ',') &&\n currentToken.getPreviousOfType(SQLTokenTypes.Parenthesis, '(')?.getPreviousNonWhiteSpaceToken()?.isFunction())\n ) {\n return StatementPosition.PredefinedFunctionArgument;\n }\n\n if (\n (currentToken.isWhiteSpace() || currentToken.is(SQLTokenTypes.Parenthesis, ')')) &&\n normalizedPreviousNonWhiteSpaceValue === FROM\n ) {\n return StatementPosition.AfterFromKeyword;\n }\n\n if (\n normalizedPreviousNonAliasKeywordValue === FROM &&\n (previousNonWhiteSpace?.isIdentifier() ||\n previousNonWhiteSpace?.isDoubleQuotedString() ||\n previousNonWhiteSpace?.isVariable() ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, ')'))\n ) {\n return StatementPosition.AfterFromArguments;\n }\n\n if (\n (LOGICAL_OPERATORS.includes(normalizedPreviousNonWhiteSpaceValue) &&\n [WHERE, HAVING, ON, CASE, WHEN].includes(normalizedPreviousKeywordValue)) ||\n ((currentToken.isWhiteSpace() || currentToken.is(SQLTokenTypes.Parenthesis, ')')) &&\n [WHERE, HAVING, ON, CASE, WHEN].includes(normalizedPreviousNonWhiteSpaceValue))\n ) {\n switch (normalizedPreviousKeywordValue) {\n case WHERE:\n return StatementPosition.WhereKey;\n case HAVING:\n return StatementPosition.HavingKey;\n case ON:\n return StatementPosition.OnKey;\n case CASE:\n return StatementPosition.CaseKey;\n case WHEN:\n return StatementPosition.WhenKey;\n }\n }\n\n if (\n (LOGICAL_OPERATORS.includes(normalizedPreviousNonWhiteSpaceValue) &&\n [NULL, TRUE, FALSE].includes(normalizedPreviousKeywordValue)) ||\n ((currentToken.isWhiteSpace() || currentToken.is(SQLTokenTypes.Parenthesis, ')')) &&\n [NULL, TRUE, FALSE].includes(normalizedPreviousNonWhiteSpaceValue))\n ) {\n let nearestPreviousKeyword = previousKeyword;\n let normalizedNearestPreviousKeywordValue = normalizedPreviousKeywordValue;\n while (![WHERE, HAVING, ON, CASE, WHEN].includes(normalizedNearestPreviousKeywordValue)) {\n nearestPreviousKeyword = nearestPreviousKeyword?.getPreviousKeyword();\n normalizedNearestPreviousKeywordValue = nearestPreviousKeyword?.value.toUpperCase() || '';\n }\n\n switch (normalizedNearestPreviousKeywordValue) {\n case WHERE:\n return StatementPosition.WhereKey;\n case HAVING:\n return StatementPosition.HavingKey;\n case ON:\n return StatementPosition.OnKey;\n case CASE:\n return StatementPosition.CaseKey;\n case WHEN:\n return StatementPosition.WhenKey;\n }\n }\n\n if (\n [WHERE, HAVING, ON, CASE, WHEN].includes(normalizedPreviousKeywordValue) &&\n PREDICATE_OPERATORS.includes(normalizedPreviousNonWhiteSpaceValue)\n ) {\n switch (normalizedPreviousKeywordValue) {\n case WHERE:\n return StatementPosition.WhereValue;\n case HAVING:\n return StatementPosition.HavingValue;\n case ON:\n return StatementPosition.OnValue;\n case CASE:\n return StatementPosition.CaseValue;\n case WHEN:\n return StatementPosition.WhenValue;\n }\n }\n\n if (\n [NULL, TRUE, FALSE].includes(normalizedPreviousKeywordValue) &&\n PREDICATE_OPERATORS.includes(normalizedPreviousNonWhiteSpaceValue)\n ) {\n let nearestPreviousKeyword = previousKeyword;\n let normalizedNearestPreviousKeywordValue = normalizedPreviousKeywordValue;\n while (![WHERE, HAVING, ON, CASE, WHEN].includes(normalizedNearestPreviousKeywordValue)) {\n nearestPreviousKeyword = nearestPreviousKeyword?.getPreviousKeyword();\n normalizedNearestPreviousKeywordValue = nearestPreviousKeyword?.value.toUpperCase() || '';\n }\n\n switch (normalizedNearestPreviousKeywordValue) {\n case WHERE:\n return StatementPosition.WhereValue;\n case HAVING:\n return StatementPosition.HavingValue;\n case ON:\n return StatementPosition.OnValue;\n case CASE:\n return StatementPosition.CaseValue;\n case WHEN:\n return StatementPosition.WhenValue;\n }\n }\n\n if (\n [WHERE, HAVING, ON, CASE, WHEN].includes(normalizedPreviousKeywordValue) &&\n (previousNonWhiteSpace?.isIdentifier() ||\n previousNonWhiteSpace?.isDoubleQuotedString() ||\n previousNonWhiteSpace?.isFunction() ||\n previousNonWhiteSpace?.isNumber() ||\n previousNonWhiteSpace?.isString() ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, ')') ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, '()'))\n ) {\n const previousTokens = currentToken.getPreviousUntil(SQLTokenTypes.Keyword, [], normalizedPreviousKeywordValue);\n const numPredicateOperators =\n previousTokens?.filter((token) => PREDICATE_OPERATORS.includes(token.value.toUpperCase())).length || 0;\n const numLogicalOperators =\n previousTokens?.filter((token) => LOGICAL_OPERATORS.includes(token.value.toUpperCase())).length || 0;\n\n if (numPredicateOperators - numLogicalOperators === 0) {\n switch (normalizedPreviousKeywordValue) {\n case WHERE:\n return StatementPosition.WhereComparisonOperator;\n case HAVING:\n return StatementPosition.HavingComparisonOperator;\n case ON:\n return StatementPosition.OnComparisonOperator;\n case CASE:\n return StatementPosition.CaseComparisonOperator;\n case WHEN:\n return StatementPosition.WhenComparisonOperator;\n }\n } else {\n switch (normalizedPreviousKeywordValue) {\n case WHERE:\n return StatementPosition.AfterWhereValue;\n case HAVING:\n return StatementPosition.AfterHavingValue;\n case ON:\n return StatementPosition.AfterOnValue;\n case CASE:\n return StatementPosition.AfterCaseValue;\n case WHEN:\n return StatementPosition.AfterWhenValue;\n }\n }\n }\n\n if (\n [NULL, TRUE, FALSE].includes(normalizedPreviousKeywordValue) &&\n PREDICATE_OPERATORS.includes(previousKeyword?.getPreviousNonWhiteSpaceToken()?.value.toUpperCase() || '')\n ) {\n let nearestPreviousKeyword = previousKeyword?.getPreviousKeyword();\n let normalizedNearestPreviousKeywordValue = nearestPreviousKeyword?.value.toUpperCase() || '';\n while (![WHERE, HAVING, ON, CASE, WHEN].includes(normalizedNearestPreviousKeywordValue)) {\n nearestPreviousKeyword = nearestPreviousKeyword?.getPreviousKeyword();\n normalizedNearestPreviousKeywordValue = nearestPreviousKeyword?.value.toUpperCase() || '';\n }\n\n const previousTokens = currentToken.getPreviousUntil(\n SQLTokenTypes.Keyword,\n [],\n normalizedNearestPreviousKeywordValue\n );\n const numPredicateOperators =\n previousTokens?.filter((token) => PREDICATE_OPERATORS.includes(token.value.toUpperCase())).length || 0;\n const numLogicalOperators =\n previousTokens?.filter((token) => LOGICAL_OPERATORS.includes(token.value.toUpperCase())).length || 0;\n\n if (numPredicateOperators - numLogicalOperators === 0) {\n switch (normalizedNearestPreviousKeywordValue) {\n case WHERE:\n return StatementPosition.WhereComparisonOperator;\n case HAVING:\n return StatementPosition.HavingComparisonOperator;\n case ON:\n return StatementPosition.OnComparisonOperator;\n case CASE:\n return StatementPosition.CaseComparisonOperator;\n case WHEN:\n return StatementPosition.WhenComparisonOperator;\n }\n } else {\n switch (normalizedNearestPreviousKeywordValue) {\n case WHERE:\n return StatementPosition.AfterWhereValue;\n case HAVING:\n return StatementPosition.AfterHavingValue;\n case ON:\n return StatementPosition.AfterOnValue;\n case CASE:\n return StatementPosition.AfterCaseValue;\n case WHEN:\n return StatementPosition.AfterWhenValue;\n }\n }\n }\n\n if (currentToken.isWhiteSpace() && normalizedPreviousNonWhiteSpaceValue === THEN) {\n return StatementPosition.ThenExpression;\n }\n\n if (\n currentToken.isWhiteSpace() &&\n normalizedPreviousKeywordValue === THEN &&\n normalizedPreviousNonWhiteSpaceValue !== THEN\n ) {\n return StatementPosition.AfterThenExpression;\n }\n\n if (currentToken.isWhiteSpace() && normalizedPreviousNonWhiteSpaceValue === ELSE) {\n return StatementPosition.AfterElseKeyword;\n }\n\n if (normalizedPreviousNonWhiteSpaceValue === END && currentToken.isWhiteSpace()) {\n let nearestCaseKeyword = previousKeyword;\n while (CASE !== nearestCaseKeyword?.value.toUpperCase()) {\n nearestCaseKeyword = nearestCaseKeyword?.getPreviousKeyword();\n }\n const nearestKeywordBeforeCaseKeywordValue = nearestCaseKeyword.getPreviousKeyword()?.value.toUpperCase() || '';\n switch (nearestKeywordBeforeCaseKeywordValue) {\n case SELECT:\n return StatementPosition.AfterSelectExpression;\n case WHERE:\n return StatementPosition.AfterWhereValue;\n }\n }\n\n if (\n normalizedPreviousKeywordValue === BY &&\n previousKeyword?.getPreviousKeyword()?.value.toUpperCase() === GROUP &&\n (previousNonWhiteSpace?.value.toUpperCase() === BY || previousNonWhiteSpace?.is(SQLTokenTypes.Delimiter, ','))\n ) {\n return StatementPosition.AfterGroupByKeywords;\n }\n\n if (\n normalizedPreviousKeywordValue === BY &&\n previousKeyword?.getPreviousKeyword()?.value.toUpperCase() === GROUP &&\n (previousNonWhiteSpace?.isIdentifier() ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, ')') ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, '()'))\n ) {\n return StatementPosition.AfterGroupBy;\n }\n\n if (normalizedPreviousKeywordValue === BY && previousKeyword?.getPreviousKeyword()?.value.toUpperCase() === ORDER) {\n return StatementPosition.AfterOrderByKeywords;\n }\n\n if ([DESC, ASC].includes(normalizedPreviousKeywordValue)) {\n return StatementPosition.AfterOrderByDirection;\n }\n\n return StatementPosition.Unknown;\n}\n","import { StatementPosition, SuggestionKind } from '../../monarch/types';\n\nexport function getSuggestionKinds(statementPosition: StatementPosition): SuggestionKind[] {\n switch (statementPosition) {\n case StatementPosition.SelectKeyword:\n return [SuggestionKind.SelectKeyword];\n case StatementPosition.AfterSelectKeyword:\n return [\n SuggestionKind.AfterSelectKeyword,\n SuggestionKind.FunctionsWithArguments,\n SuggestionKind.Field,\n SuggestionKind.CaseKeyword,\n ];\n case StatementPosition.SelectExpression:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field, SuggestionKind.CaseKeyword];\n case StatementPosition.AfterSelectExpression:\n return [\n SuggestionKind.FromKeyword,\n SuggestionKind.FunctionsWithArguments,\n SuggestionKind.Field,\n SuggestionKind.CaseKeyword,\n ];\n\n case StatementPosition.FromKeyword:\n return [SuggestionKind.FromKeyword, SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.AfterFromKeyword:\n return [SuggestionKind.AfterFromKeyword];\n case StatementPosition.AfterFromArguments:\n return [\n SuggestionKind.WhereKeyword,\n SuggestionKind.GroupByKeywords,\n SuggestionKind.OrderByKeywords,\n SuggestionKind.LimitKeyword,\n SuggestionKind.JoinKeywords,\n SuggestionKind.HavingKeywords,\n ];\n\n case StatementPosition.WhereKey:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field, SuggestionKind.CaseKeyword];\n case StatementPosition.WhereComparisonOperator:\n return [SuggestionKind.ComparisonOperators];\n case StatementPosition.WhereValue:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.AfterWhereValue:\n return [\n SuggestionKind.LogicalOperators,\n SuggestionKind.GroupByKeywords,\n SuggestionKind.OrderByKeywords,\n SuggestionKind.LimitKeyword,\n ];\n\n case StatementPosition.HavingKey:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.HavingComparisonOperator:\n return [SuggestionKind.ComparisonOperators];\n case StatementPosition.HavingValue:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.AfterHavingValue:\n return [SuggestionKind.LogicalOperators, SuggestionKind.OrderByKeywords, SuggestionKind.LimitKeyword];\n\n case StatementPosition.OnKey:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.OnComparisonOperator:\n return [SuggestionKind.ComparisonOperators];\n case StatementPosition.OnValue:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.AfterOnValue:\n return [\n SuggestionKind.LogicalOperators,\n SuggestionKind.GroupByKeywords,\n SuggestionKind.OrderByKeywords,\n SuggestionKind.LimitKeyword,\n ];\n\n case StatementPosition.CaseKey:\n return [SuggestionKind.WhenKeyword, SuggestionKind.Field, SuggestionKind.FunctionsWithArguments];\n case StatementPosition.CaseComparisonOperator:\n return [SuggestionKind.ComparisonOperators, SuggestionKind.WhenKeyword];\n case StatementPosition.CaseValue:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.AfterCaseValue:\n return [SuggestionKind.WhenKeyword];\n\n case StatementPosition.WhenKey:\n return [SuggestionKind.Field, SuggestionKind.FunctionsWithArguments];\n case StatementPosition.WhenComparisonOperator:\n return [SuggestionKind.ComparisonOperators, SuggestionKind.ThenKeyword];\n case StatementPosition.WhenValue:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.AfterWhenValue:\n return [SuggestionKind.ThenKeyword];\n\n case StatementPosition.ThenExpression:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n case StatementPosition.AfterThenExpression:\n return [SuggestionKind.WhenKeyword, SuggestionKind.AfterThenExpression];\n\n case StatementPosition.AfterElseKeyword:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n\n case StatementPosition.AfterGroupByKeywords:\n return [SuggestionKind.Field, SuggestionKind.FunctionsWithArguments];\n case StatementPosition.AfterGroupBy:\n return [SuggestionKind.OrderByKeywords, SuggestionKind.LimitKeyword, SuggestionKind.HavingKeywords];\n\n case StatementPosition.AfterOrderByKeywords:\n return [SuggestionKind.SortOrderDirectionKeyword, SuggestionKind.LimitKeyword, SuggestionKind.Field];\n case StatementPosition.AfterOrderByDirection:\n return [SuggestionKind.LimitKeyword];\n\n case StatementPosition.PredefinedFunctionArgument:\n return [SuggestionKind.Field];\n\n case StatementPosition.Subquery:\n return [SuggestionKind.SelectKeyword, SuggestionKind.FunctionsWithArguments, SuggestionKind.Field];\n }\n\n return [];\n}\n","import { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport type { Monaco, monacoTypes } from '@grafana/ui';\n\nimport { ResourcesAPI } from '../../../resources/ResourcesAPI';\nimport { LogGroup } from '../../../types';\nimport { CompletionItemProvider } from '../../monarch/CompletionItemProvider';\nimport { LinkedToken } from '../../monarch/LinkedToken';\nimport { TRIGGER_SUGGEST } from '../../monarch/commands';\nimport { SuggestionKind, CompletionItemPriority, StatementPosition } from '../../monarch/types';\nimport { fetchLogGroupFields } from '../../utils';\nimport {\n ASC,\n BY,\n PREDICATE_OPERATORS,\n DESC,\n FROM,\n ALL_FUNCTIONS,\n ALL,\n DISTINCT,\n GROUP,\n LIMIT,\n INNER,\n LEFT,\n OUTER,\n ON,\n JOIN,\n LOGICAL_OPERATORS,\n ORDER,\n SELECT,\n WHERE,\n HAVING,\n CASE,\n WHEN,\n THEN,\n ELSE,\n END,\n} from '../language';\n\nimport { getStatementPosition } from './statementPosition';\nimport { getSuggestionKinds } from './suggestionKind';\nimport { SQLTokenTypes } from './types';\n\ntype CompletionItem = monacoTypes.languages.CompletionItem;\n\nexport type queryContext = {\n logGroups?: LogGroup[];\n region: string;\n};\n\nexport function LogsSQLCompletionItemProviderFunc(\n resources: ResourcesAPI,\n templateSrv: TemplateSrv = getTemplateSrv()\n) {\n return (queryContext: queryContext) => {\n return new LogsSQLCompletionItemProvider(resources, templateSrv, queryContext);\n };\n}\n\nexport class LogsSQLCompletionItemProvider extends CompletionItemProvider {\n region: string;\n queryContext: queryContext;\n\n constructor(resources: ResourcesAPI, templateSrv: TemplateSrv = getTemplateSrv(), queryContext: queryContext) {\n super(resources, templateSrv);\n this.region = resources.getActualRegion() ?? '';\n this.getStatementPosition = getStatementPosition;\n this.getSuggestionKinds = getSuggestionKinds;\n this.tokenTypes = SQLTokenTypes;\n this.queryContext = queryContext;\n }\n\n async getSuggestions(\n monaco: Monaco,\n currentToken: LinkedToken | null,\n suggestionKinds: SuggestionKind[],\n statementPosition: StatementPosition,\n position: monacoTypes.IPosition\n ): Promise<CompletionItem[]> {\n let suggestions: CompletionItem[] = [];\n const invalidRangeToken = currentToken?.isWhiteSpace() || currentToken?.isParenthesis();\n const range =\n invalidRangeToken || !currentToken?.range ? monaco.Range.fromPositions(position) : currentToken?.range;\n\n const toCompletionItem = (value: string, rest: Partial<CompletionItem> = {}) => {\n const item: CompletionItem = {\n label: value,\n insertText: value,\n kind: monaco.languages.CompletionItemKind.Field,\n range,\n sortText: CompletionItemPriority.Medium,\n ...rest,\n };\n return item;\n };\n\n function addSuggestion(value: string, rest: Partial<CompletionItem> = {}) {\n suggestions = [...suggestions, toCompletionItem(value, rest)];\n }\n\n for (const suggestion of suggestionKinds) {\n switch (suggestion) {\n case SuggestionKind.SelectKeyword:\n addSuggestion(SELECT, {\n insertText: `${SELECT} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.AfterSelectKeyword:\n addSuggestion(ALL, {\n insertText: `${ALL} `,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Keyword,\n });\n addSuggestion(DISTINCT, {\n insertText: `${DISTINCT} `,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Keyword,\n });\n break;\n\n case SuggestionKind.FunctionsWithArguments:\n ALL_FUNCTIONS.map((s) =>\n addSuggestion(s, {\n insertText: `${s}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n })\n );\n break;\n\n case SuggestionKind.FromKeyword:\n addSuggestion(FROM, {\n insertText: `${FROM} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumHigh,\n });\n addSuggestion(`${FROM} \\`logGroups(logGroupIdentifier: [...])\\``, {\n insertText: `${FROM} \\`logGroups(logGroupIdentifier: [$0])\\``,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumHigh,\n });\n break;\n\n case SuggestionKind.AfterFromKeyword:\n addSuggestion('`logGroups(logGroupIdentifier: [...])`', {\n insertText: '`logGroups(logGroupIdentifier: [$0])`',\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Function,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.LogicalOperators:\n LOGICAL_OPERATORS.map((o) =>\n addSuggestion(`${o}`, {\n insertText: `${o} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumHigh,\n })\n );\n break;\n\n case SuggestionKind.WhereKeyword:\n addSuggestion(`${WHERE}`, {\n insertText: `${WHERE} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.High,\n });\n break;\n\n case SuggestionKind.HavingKeywords:\n addSuggestion(`${HAVING}`, {\n insertText: `${HAVING} `,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.ComparisonOperators:\n PREDICATE_OPERATORS.map((o) => addSuggestion(`${o}`, { insertText: `${o} `, command: TRIGGER_SUGGEST }));\n break;\n\n case SuggestionKind.CaseKeyword:\n addSuggestion(CASE, {\n insertText: `${CASE} `,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.WhenKeyword:\n addSuggestion(WHEN, {\n insertText: `${WHEN} `,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.ThenKeyword:\n addSuggestion(THEN, {\n insertText: `${THEN} `,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.AfterThenExpression:\n addSuggestion(`${ELSE} ... ${END}`, {\n insertText: `${ELSE} $0 ${END}`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.GroupByKeywords:\n addSuggestion(`${GROUP} ${BY}`, {\n insertText: `${GROUP} ${BY} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumHigh,\n });\n break;\n\n case SuggestionKind.OrderByKeywords:\n addSuggestion(`${ORDER} ${BY}`, {\n insertText: `${ORDER} ${BY} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.Medium,\n });\n break;\n\n case SuggestionKind.JoinKeywords:\n addSuggestion(`${INNER} ${JOIN} <log group> ${ON} <field>`, {\n insertText: `${INNER} ${JOIN} $1 ${ON} $2`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumLow,\n });\n addSuggestion(`${LEFT} ${OUTER} ${JOIN} <log group> ${ON} <field>`, {\n insertText: `${LEFT} ${OUTER} ${JOIN} $1 ${ON} $2`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumLow,\n });\n break;\n\n case SuggestionKind.LimitKeyword:\n addSuggestion(LIMIT, { insertText: `${LIMIT} ` });\n break;\n\n case SuggestionKind.SortOrderDirectionKeyword:\n [ASC, DESC].map((s) =>\n addSuggestion(s, {\n insertText: `${s} `,\n command: TRIGGER_SUGGEST,\n })\n );\n break;\n\n case SuggestionKind.Field:\n const fields = await fetchLogGroupFields(\n this.queryContext.logGroups || [],\n this.queryContext.region,\n this.templateSrv,\n this.resources\n );\n fields.forEach((field) => {\n if (field !== '') {\n addSuggestion(field, {\n label: field,\n insertText: `\\`${field}\\``,\n kind: monaco.languages.CompletionItemKind.Field,\n });\n }\n });\n break;\n }\n }\n\n this.templateSrv.getVariables().map((v) => {\n const variable = `$${v.name}`;\n addSuggestion(variable, {\n range,\n label: variable,\n insertText: variable,\n kind: monaco.languages.CompletionItemKind.Variable,\n sortText: CompletionItemPriority.Low,\n });\n });\n\n return suggestions;\n }\n}\n","import { TokenTypes } from '../monarch/types';\n\nimport { CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID } from './language';\n\ninterface IpplTokenTypes extends TokenTypes {\n Pipe: string;\n Backtick: string;\n Command: string;\n}\n\nexport const PPLTokenTypes: IpplTokenTypes = {\n Parenthesis: `delimiter.parenthesis.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Whitespace: `white.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Keyword: `keyword.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Command: `keyword.command.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Delimiter: `delimiter.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Pipe: `delimiter.pipe.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Operator: `operator.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Identifier: `identifier.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Type: `type.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Function: `predefined.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Number: `number.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n String: `string.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Variable: `variable.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Comment: `comment.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Regexp: `regexp.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n Backtick: `string.backtick.${CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID}`,\n};\n","import { LinkedToken } from '../../monarch/LinkedToken';\nimport { StatementPosition } from '../../monarch/types';\nimport {\n ARITHMETIC_OPERATORS,\n PARAMETERS_WITH_BOOLEAN_VALUES,\n BY,\n COMPARISON_OPERATORS,\n CONDITION_FUNCTIONS,\n DEDUP,\n EVAL,\n EVENTSTATS,\n FIELD_OPERATORS,\n FIELDS,\n HEAD,\n IN,\n LOGICAL_EXPRESSION_OPERATORS,\n NOT,\n RARE,\n SORT,\n SORT_FIELD_FUNCTIONS,\n SPAN,\n STATS,\n STATS_FUNCTIONS,\n TOP,\n WHERE,\n PARSE,\n BETWEEN,\n EVAL_FUNCTIONS,\n} from '../language';\nimport { PPLTokenTypes } from '../tokenTypes';\n\n// getStatementPosition returns the 'statement position' of the place where the cursor is currently positioned.\n// Statement positions are places that are syntactically and relevant for the evaluated language and are used to determine the suggestionKinds, i.e.\n// suggestions in the dropdown.\n// For example, in PPL, if the cursor is currently at the whitespace after the WHERE keyword, this function returns StatementPosition.BeforeLogicalExpression.\n// In getSuggestionKinds, this position will result in SuggestionKind.LogicalExpression.\n// Lastly, In PPLCompletionItemProvider appropriate suggestions of logical operators are added to the dropdown based on the suggestion kind.\n\nexport const getStatementPosition = (currentToken: LinkedToken | null): StatementPosition => {\n const previousNonWhiteSpace = currentToken?.getPreviousNonWhiteSpaceToken();\n const nextNonWhiteSpace = currentToken?.getNextNonWhiteSpaceToken();\n\n const normalizedPreviousNonWhiteSpace = previousNonWhiteSpace?.value?.toLowerCase();\n\n if (\n currentToken === null ||\n (currentToken?.isWhiteSpace() && previousNonWhiteSpace === null && nextNonWhiteSpace === null) ||\n (previousNonWhiteSpace?.is(PPLTokenTypes.Pipe) && currentToken?.isWhiteSpace()) ||\n previousNonWhiteSpace?.is(PPLTokenTypes.Delimiter, '|')\n ) {\n return StatementPosition.NewCommand;\n }\n\n switch (normalizedPreviousNonWhiteSpace) {\n case WHERE:\n return StatementPosition.BeforeLogicalExpression;\n case DEDUP:\n return StatementPosition.FieldList;\n case FIELDS:\n return StatementPosition.AfterFieldsCommand;\n case EVENTSTATS:\n case STATS:\n return StatementPosition.AfterStatsCommand;\n case SORT:\n return StatementPosition.SortField;\n case PARSE:\n return StatementPosition.Expression;\n }\n\n if (\n currentToken?.isWhiteSpace() ||\n currentToken?.is(PPLTokenTypes.Backtick) ||\n currentToken?.is(PPLTokenTypes.Delimiter, ',') ||\n currentToken?.is(PPLTokenTypes.Parenthesis) // for STATS functions\n ) {\n const nearestFunction = currentToken?.getPreviousOfType(PPLTokenTypes.Function)?.value.toLowerCase();\n const nearestKeyword = currentToken?.getPreviousOfType(PPLTokenTypes.Keyword)?.value.toLowerCase();\n const nearestCommand = currentToken?.getPreviousOfType(PPLTokenTypes.Command)?.value.toLowerCase();\n\n if (normalizedPreviousNonWhiteSpace) {\n if (\n nearestCommand !== FIELDS && // FIELDS and SORT fields can be preceeded by a + or - which are not arithmetic ops\n nearestCommand !== SORT &&\n ARITHMETIC_OPERATORS.includes(normalizedPreviousNonWhiteSpace)\n ) {\n return StatementPosition.AfterArithmeticOperator;\n }\n if (PARAMETERS_WITH_BOOLEAN_VALUES.includes(normalizedPreviousNonWhiteSpace)) {\n return StatementPosition.AfterBooleanArgument;\n }\n }\n\n const isBeforeLogicalExpression =\n (normalizedPreviousNonWhiteSpace &&\n (COMPARISON_OPERATORS.includes(normalizedPreviousNonWhiteSpace) ||\n LOGICAL_EXPRESSION_OPERATORS.includes(normalizedPreviousNonWhiteSpace))) ||\n previousNonWhiteSpace?.is(PPLTokenTypes.Regexp) ||\n normalizedPreviousNonWhiteSpace === NOT || // follows a comparison operator, logical operator, NOT or a regex\n (nearestFunction && CONDITION_FUNCTIONS.includes(nearestFunction) && normalizedPreviousNonWhiteSpace === ')'); // it's not a condition function argument\n\n if (\n nearestCommand !== SORT && // sort command fields can be followed by a field operator, which is handled lower in the block\n nearestCommand !== EVAL && // eval fields can be followed by an eval clause, which is handled lower in the block\n nearestCommand !== STATS && // identifiers in STATS can be followed by a stats function, which is handled lower in the block\n (isListingFields(currentToken) || currentToken?.is(PPLTokenTypes.Backtick))\n ) {\n return StatementPosition.FieldList;\n }\n\n if (\n nearestCommand !== EVAL && // eval can have StatementPosition.Expression after an equal operator\n isBeforeLogicalExpression\n ) {\n return StatementPosition.BeforeLogicalExpression;\n }\n\n if (nearestKeyword === IN) {\n return StatementPosition.AfterINKeyword;\n }\n if (nearestKeyword === BETWEEN) {\n return StatementPosition.FunctionArg;\n }\n\n if (\n nearestFunction &&\n (currentToken?.is(PPLTokenTypes.Parenthesis) || currentToken?.getNextNonWhiteSpaceToken()?.value === ')')\n ) {\n if ([...EVAL_FUNCTIONS, ...CONDITION_FUNCTIONS].includes(nearestFunction)) {\n return StatementPosition.FunctionArg;\n }\n if (STATS_FUNCTIONS.includes(nearestFunction)) {\n return StatementPosition.StatsFunctionArgument;\n }\n if (SORT_FIELD_FUNCTIONS.includes(nearestFunction)) {\n return StatementPosition.SortFieldExpression;\n }\n }\n\n switch (nearestCommand) {\n case SORT: {\n if (previousNonWhiteSpace) {\n if (previousNonWhiteSpace.is(PPLTokenTypes.Delimiter, ',')) {\n return StatementPosition.SortField;\n } else if (FIELD_OPERATORS.includes(previousNonWhiteSpace.value)) {\n return StatementPosition.SortFieldExpression;\n }\n }\n break;\n }\n case DEDUP: {\n // if current active command is DEDUP and there are identifiers (fieldNames) between currentToken and the dedup command\n const fieldNames = currentToken.getPreviousUntil(PPLTokenTypes.Number, [\n PPLTokenTypes.Delimiter,\n PPLTokenTypes.Whitespace,\n ]);\n if (fieldNames?.length && !havePipe(fieldNames)) {\n return StatementPosition.AfterDedupFieldNames;\n }\n return StatementPosition.FieldList;\n }\n case FIELDS: {\n return StatementPosition.FieldList;\n }\n case STATS:\n case EVENTSTATS: {\n if (nearestKeyword === BY && currentToken.isWhiteSpace()) {\n return StatementPosition.AfterStatsBy;\n } else if (nearestFunction === SPAN && currentToken?.is(PPLTokenTypes.Parenthesis)) {\n return StatementPosition.FieldList;\n }\n return StatementPosition.AfterStatsCommand;\n }\n case RARE: {\n return StatementPosition.FieldList;\n }\n case TOP: {\n return StatementPosition.FieldList;\n }\n case HEAD:\n return StatementPosition.AfterHeadCommand;\n\n case EVAL:\n if (previousNonWhiteSpace?.value === '=') {\n return StatementPosition.Expression;\n }\n if (\n currentToken?.isWhiteSpace() &&\n (normalizedPreviousNonWhiteSpace === EVAL || previousNonWhiteSpace?.is(PPLTokenTypes.Delimiter, ','))\n ) {\n return StatementPosition.EvalClause;\n }\n if (isBeforeLogicalExpression) {\n return StatementPosition.BeforeLogicalExpression;\n }\n break;\n }\n }\n\n return StatementPosition.Unknown;\n};\n\nconst havePipe = (fieldNames: LinkedToken[]) => {\n return fieldNames?.some((word) => word.type === PPLTokenTypes.Pipe);\n};\nconst isListingFields = (currentToken: LinkedToken | null) => {\n const tokensUntilFieldName = currentToken?.getPreviousUntil(PPLTokenTypes.Identifier, [PPLTokenTypes.Whitespace]); // tokens until exampleFieldName\n const tokensUntilEscapedFieldName = currentToken?.getPreviousUntil(PPLTokenTypes.Backtick, [\n // tokens until `@exampleFieldName`\n PPLTokenTypes.Whitespace,\n ]);\n const isPreceededByAFieldName =\n (tokensUntilFieldName?.length && tokensUntilFieldName.every((token) => token.is(PPLTokenTypes.Delimiter, ','))) ||\n (tokensUntilEscapedFieldName?.length &&\n tokensUntilEscapedFieldName.every((token) => token.is(PPLTokenTypes.Delimiter, ',')));\n const isAfterComma =\n currentToken?.isWhiteSpace() && currentToken?.getPreviousNonWhiteSpaceToken()?.is(PPLTokenTypes.Delimiter, ',');\n const isFunctionArgument = currentToken?.getNextNonWhiteSpaceToken()?.value === ')'; // is not e.g. span(`@timestamp`, 5m)\n\n return isAfterComma && isPreceededByAFieldName && !isFunctionArgument;\n};\n","import { StatementPosition, SuggestionKind } from '../../monarch/types';\n\nexport function getSuggestionKinds(statementPosition: StatementPosition): SuggestionKind[] {\n switch (statementPosition) {\n case StatementPosition.NewCommand:\n return [SuggestionKind.Command];\n case StatementPosition.AfterHeadCommand:\n return [SuggestionKind.FromKeyword];\n case StatementPosition.AfterStatsCommand:\n return [SuggestionKind.StatsParameter, SuggestionKind.StatsFunctions];\n case StatementPosition.SortField:\n return [SuggestionKind.FieldOperators, SuggestionKind.Field, SuggestionKind.SortFunctions];\n case StatementPosition.EvalClause:\n case StatementPosition.StatsFunctionArgument:\n return [SuggestionKind.Field];\n case StatementPosition.AfterFieldsCommand:\n return [SuggestionKind.FieldOperators, SuggestionKind.Field];\n case StatementPosition.FieldList:\n return [SuggestionKind.Field];\n case StatementPosition.AfterBooleanArgument:\n return [SuggestionKind.BooleanLiteral];\n case StatementPosition.AfterDedupFieldNames:\n return [SuggestionKind.DedupParameter];\n case StatementPosition.AfterStatsBy:\n return [SuggestionKind.Field, SuggestionKind.SpanClause];\n case StatementPosition.SortFieldExpression:\n return [SuggestionKind.Field, SuggestionKind.SortFunctions];\n case StatementPosition.FunctionArg:\n case StatementPosition.AfterArithmeticOperator:\n case StatementPosition.AfterINKeyword:\n return [SuggestionKind.ValueExpression];\n // logical expression can contain comparison expression, which can start with a value expression\n // so we always need to suggest valueExpression when SuggestionKind.LogicalExpression is present\n case StatementPosition.Expression:\n case StatementPosition.BeforeLogicalExpression:\n return [SuggestionKind.LogicalExpression, SuggestionKind.ValueExpression];\n }\n\n return [];\n}\n","import { getTemplateSrv, type TemplateSrv } from '@grafana/runtime';\nimport { Monaco, monacoTypes } from '@grafana/ui';\n\nimport { type ResourcesAPI } from '../../../resources/ResourcesAPI';\nimport { LogGroup } from '../../../types';\nimport { CompletionItemProvider } from '../../monarch/CompletionItemProvider';\nimport { LinkedToken } from '../../monarch/LinkedToken';\nimport { TRIGGER_SUGGEST } from '../../monarch/commands';\nimport { CompletionItem, CompletionItemPriority, StatementPosition, SuggestionKind } from '../../monarch/types';\nimport { fetchLogGroupFields } from '../../utils';\nimport {\n BOOLEAN_LITERALS,\n CONDITION_FUNCTIONS,\n DEDUP_PARAMETERS,\n EVAL_FUNCTIONS,\n FIELD_OPERATORS,\n IN,\n LOGICAL_EXPRESSION_OPERATORS,\n NOT,\n PPL_COMMANDS,\n SORT_FIELD_FUNCTIONS,\n SPAN,\n STATS_PARAMETERS,\n STATS_FUNCTIONS,\n FROM,\n} from '../language';\nimport { PPLTokenTypes } from '../tokenTypes';\n\nimport { getStatementPosition } from './statementPosition';\nimport { getSuggestionKinds } from './suggestionKinds';\n\nexport type queryContext = {\n logGroups?: LogGroup[];\n region: string;\n};\n\nexport function PPLCompletionItemProviderFunc(resources: ResourcesAPI, templateSrv: TemplateSrv = getTemplateSrv()) {\n return (queryContext: queryContext) => {\n return new PPLCompletionItemProvider(resources, templateSrv, queryContext);\n };\n}\n\nexport class PPLCompletionItemProvider extends CompletionItemProvider {\n queryContext: queryContext;\n constructor(resources: ResourcesAPI, templateSrv: TemplateSrv = getTemplateSrv(), queryContext: queryContext) {\n super(resources, templateSrv);\n this.getStatementPosition = getStatementPosition;\n this.getSuggestionKinds = getSuggestionKinds;\n this.tokenTypes = PPLTokenTypes;\n this.queryContext = queryContext;\n }\n\n async getSuggestions(\n monaco: Monaco,\n currentToken: LinkedToken | null,\n suggestionKinds: SuggestionKind[],\n _: StatementPosition,\n position: monacoTypes.IPosition\n ): Promise<CompletionItem[]> {\n const suggestions: CompletionItem[] = [];\n const invalidRangeToken =\n currentToken?.isWhiteSpace() || currentToken?.isParenthesis() || currentToken?.is(PPLTokenTypes.Backtick); // PPLTokenTypes.Backtick for field wrapping\n const range =\n invalidRangeToken || !currentToken?.range ? monaco.Range.fromPositions(position) : currentToken?.range;\n function toCompletionItem(value: string, rest: Partial<CompletionItem> = {}) {\n const item: monacoTypes.languages.CompletionItem = {\n label: value,\n insertText: value,\n kind: monaco.languages.CompletionItemKind.Field,\n range,\n sortText: CompletionItemPriority.Medium,\n ...rest,\n };\n return item;\n }\n\n function addSuggestion(value: string, rest: Partial<CompletionItem> = {}) {\n suggestions.push(toCompletionItem(value, rest));\n }\n\n for (const kind of suggestionKinds) {\n switch (kind) {\n case SuggestionKind.Command:\n PPL_COMMANDS.forEach((command) => {\n addSuggestion(command, {\n insertText: `${command} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Method,\n command: TRIGGER_SUGGEST,\n });\n });\n break;\n\n case SuggestionKind.LogicalExpression:\n // booleanExpression\n CONDITION_FUNCTIONS.forEach((funct) => {\n addSuggestion(funct, {\n insertText: `${funct}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Function,\n command: TRIGGER_SUGGEST,\n });\n });\n addSuggestion(NOT, {\n insertText: `${NOT} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Operator,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.ValueExpression:\n EVAL_FUNCTIONS.forEach((funct) => {\n addSuggestion(funct, {\n insertText: `${funct}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Function,\n command: TRIGGER_SUGGEST,\n });\n });\n await this.addFieldSuggestions(addSuggestion, monaco, range, currentToken);\n break;\n\n case SuggestionKind.FieldOperators:\n FIELD_OPERATORS.forEach((operator) => {\n addSuggestion(operator, {\n insertText: `${operator}$0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Operator,\n command: TRIGGER_SUGGEST,\n });\n });\n break;\n\n case SuggestionKind.BooleanLiteral:\n BOOLEAN_LITERALS.forEach((literal) =>\n addSuggestion(`= ${literal}`, {\n insertText: `= ${literal} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Value,\n command: TRIGGER_SUGGEST,\n })\n );\n break;\n\n case SuggestionKind.DedupParameter:\n DEDUP_PARAMETERS.forEach((keyword) =>\n addSuggestion(keyword, {\n insertText: `${keyword} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Property,\n command: TRIGGER_SUGGEST,\n })\n );\n break;\n\n case SuggestionKind.StatsParameter:\n STATS_PARAMETERS.forEach((keyword) => {\n addSuggestion(keyword, {\n insertText: `${keyword} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Property,\n command: TRIGGER_SUGGEST,\n });\n });\n break;\n\n case SuggestionKind.StatsFunctions:\n STATS_FUNCTIONS.forEach((f) => {\n addSuggestion(f, {\n insertText: `${f}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Function,\n command: TRIGGER_SUGGEST,\n });\n });\n break;\n\n case SuggestionKind.LogicalOperators:\n LOGICAL_EXPRESSION_OPERATORS.forEach((operator) => {\n addSuggestion(operator, {\n insertText: `${operator} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Operator,\n command: TRIGGER_SUGGEST,\n });\n });\n break;\n\n case SuggestionKind.InKeyword:\n addSuggestion(IN, {\n insertText: `${IN} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.SpanClause:\n addSuggestion(SPAN, {\n insertText: `${SPAN}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Function,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.Field:\n await this.addFieldSuggestions(addSuggestion, monaco, range, currentToken);\n break;\n\n case SuggestionKind.FromKeyword:\n addSuggestion(FROM, {\n insertText: `${FROM} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.SortFunctions:\n SORT_FIELD_FUNCTIONS.forEach((funct) => {\n addSuggestion(funct, {\n insertText: `${funct}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Function,\n command: TRIGGER_SUGGEST,\n });\n });\n break;\n }\n }\n // always suggest template variables\n this.templateSrv.getVariables().map((v) => {\n const variable = `$${v.name}`;\n addSuggestion(variable, {\n range,\n label: variable,\n insertText: variable,\n kind: monaco.languages.CompletionItemKind.Variable,\n sortText: CompletionItemPriority.Low,\n });\n });\n\n return suggestions;\n }\n\n private async addFieldSuggestions(\n addSuggestion: (value: string, rest?: Partial<CompletionItem>) => void,\n monaco: typeof monacoTypes,\n range: monacoTypes.IRange | monacoTypes.languages.CompletionItemRanges,\n currentToken?: LinkedToken | null\n ): Promise<void> {\n if (this.queryContext.logGroups && this.queryContext.logGroups.length > 0) {\n try {\n let fields = await fetchLogGroupFields(\n this.queryContext.logGroups,\n this.queryContext.region,\n this.templateSrv,\n this.resources\n );\n fields.forEach((field) => {\n if (field !== '') {\n addSuggestion(field, {\n range,\n label: field,\n insertText: currentToken?.is(PPLTokenTypes.Backtick) ? field : `\\`${field}\\``,\n kind: monaco.languages.CompletionItemKind.Field,\n sortText: CompletionItemPriority.High,\n });\n }\n });\n } catch {\n return;\n }\n }\n }\n}\n","import { TokenTypes } from '../../monarch/types';\n\nexport const SQLTokenTypes: TokenTypes = {\n Parenthesis: 'delimiter.parenthesis.sql',\n Whitespace: 'white.sql',\n Keyword: 'keyword.sql',\n Delimiter: 'delimiter.sql',\n Operator: 'operator.sql',\n Identifier: 'identifier.sql',\n Type: 'type.sql',\n Function: 'predefined.sql',\n Number: 'number.sql',\n String: 'string.sql',\n Variable: 'variable.sql',\n Comment: 'comment.sql',\n Regexp: 'regexp.sql',\n};\n","import { LinkedToken } from '../../monarch/LinkedToken';\nimport { StatementPosition } from '../../monarch/types';\nimport { AND, ASC, BY, DESC, EQUALS, FROM, GROUP, NOT_EQUALS, ORDER, SCHEMA, SELECT, WHERE } from '../language';\n\nimport { SQLTokenTypes } from './types';\n\n// about getStatementPosition: public/app/plugins/datasource/cloudwatch/language/cloudwatch-ppl/completion/statementPosition.ts\n\nexport function getStatementPosition(currentToken: LinkedToken | null): StatementPosition {\n const previousNonWhiteSpace = currentToken?.getPreviousNonWhiteSpaceToken();\n const previousKeyword = currentToken?.getPreviousKeyword();\n\n const previousIsSlash = currentToken?.getPreviousNonWhiteSpaceToken()?.is(SQLTokenTypes.Operator, '/');\n if (\n currentToken === null ||\n (currentToken.isWhiteSpace() && currentToken.previous === null) ||\n (currentToken.is(SQLTokenTypes.Keyword, SELECT) && currentToken.previous === null) ||\n previousIsSlash ||\n (currentToken.isIdentifier() && (previousIsSlash || currentToken?.previous === null))\n ) {\n return StatementPosition.SelectKeyword;\n }\n\n if (previousNonWhiteSpace?.value === SELECT) {\n return StatementPosition.AfterSelectKeyword;\n }\n\n if (\n (previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, '(') || currentToken?.is(SQLTokenTypes.Parenthesis, '()')) &&\n previousKeyword?.value === SELECT\n ) {\n return StatementPosition.AfterSelectFuncFirstArgument;\n }\n\n if (previousKeyword?.value === SELECT && previousNonWhiteSpace?.isParenthesis()) {\n return StatementPosition.FromKeyword;\n }\n\n if (previousNonWhiteSpace?.value === FROM) {\n return StatementPosition.AfterFromKeyword;\n }\n\n if (\n (previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, '(') || currentToken?.is(SQLTokenTypes.Parenthesis, '()')) &&\n previousKeyword?.value === SCHEMA\n ) {\n return StatementPosition.SchemaFuncFirstArgument;\n }\n\n if (previousKeyword?.value === SCHEMA && previousNonWhiteSpace?.is(SQLTokenTypes.Delimiter, ',')) {\n return StatementPosition.SchemaFuncExtraArgument;\n }\n\n if (\n (previousKeyword?.value === FROM && previousNonWhiteSpace?.isDoubleQuotedString()) ||\n (previousKeyword?.value === FROM && previousNonWhiteSpace?.isVariable()) ||\n (previousKeyword?.value === SCHEMA && previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, ')'))\n ) {\n return StatementPosition.AfterFrom;\n }\n\n if (\n previousKeyword?.value === WHERE &&\n (previousNonWhiteSpace?.isKeyword() ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, '(') ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Operator, AND))\n ) {\n return StatementPosition.WhereKey;\n }\n\n if (\n previousKeyword?.value === WHERE &&\n (previousNonWhiteSpace?.isIdentifier() || previousNonWhiteSpace?.isDoubleQuotedString())\n ) {\n return StatementPosition.WhereComparisonOperator;\n }\n\n if (\n previousKeyword?.value === WHERE &&\n (previousNonWhiteSpace?.is(SQLTokenTypes.Operator, EQUALS) ||\n previousNonWhiteSpace?.is(SQLTokenTypes.Operator, NOT_EQUALS))\n ) {\n return StatementPosition.WhereValue;\n }\n\n if (\n previousKeyword?.value === WHERE &&\n (previousNonWhiteSpace?.isString() || previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis, ')'))\n ) {\n return StatementPosition.AfterWhereValue;\n }\n\n if (\n previousKeyword?.is(SQLTokenTypes.Keyword, BY) &&\n previousKeyword?.getPreviousKeyword()?.is(SQLTokenTypes.Keyword, GROUP) &&\n (previousNonWhiteSpace?.is(SQLTokenTypes.Keyword, BY) || previousNonWhiteSpace?.is(SQLTokenTypes.Delimiter, ','))\n ) {\n return StatementPosition.AfterGroupByKeywords;\n }\n\n if (\n previousKeyword?.is(SQLTokenTypes.Keyword, BY) &&\n previousKeyword?.getPreviousKeyword()?.is(SQLTokenTypes.Keyword, GROUP) &&\n (previousNonWhiteSpace?.isIdentifier() || previousNonWhiteSpace?.isDoubleQuotedString())\n ) {\n return StatementPosition.AfterGroupBy;\n }\n\n if (\n previousNonWhiteSpace?.is(SQLTokenTypes.Keyword, BY) &&\n previousNonWhiteSpace?.getPreviousKeyword()?.is(SQLTokenTypes.Keyword, ORDER)\n ) {\n return StatementPosition.AfterOrderByKeywords;\n }\n\n if (\n previousKeyword?.is(SQLTokenTypes.Keyword, BY) &&\n previousKeyword?.getPreviousKeyword()?.is(SQLTokenTypes.Keyword, ORDER) &&\n previousNonWhiteSpace?.is(SQLTokenTypes.Parenthesis) &&\n previousNonWhiteSpace?.getPreviousNonWhiteSpaceToken()?.is(SQLTokenTypes.Function)\n ) {\n return StatementPosition.AfterOrderByFunction;\n }\n\n if (previousKeyword?.is(SQLTokenTypes.Keyword, DESC) || previousKeyword?.is(SQLTokenTypes.Keyword, ASC)) {\n return StatementPosition.AfterOrderByDirection;\n }\n\n return StatementPosition.Unknown;\n}\n","import { StatementPosition, SuggestionKind } from '../../monarch/types';\n\nexport function getSuggestionKinds(statementPosition: StatementPosition): SuggestionKind[] {\n switch (statementPosition) {\n case StatementPosition.SelectKeyword:\n return [SuggestionKind.SelectKeyword];\n case StatementPosition.AfterSelectKeyword:\n return [SuggestionKind.FunctionsWithArguments];\n case StatementPosition.AfterSelectFuncFirstArgument:\n return [SuggestionKind.Metrics];\n case StatementPosition.AfterFromKeyword:\n return [SuggestionKind.Namespaces, SuggestionKind.SchemaKeyword];\n case StatementPosition.SchemaFuncFirstArgument:\n return [SuggestionKind.Namespaces];\n case StatementPosition.SchemaFuncExtraArgument:\n return [SuggestionKind.LabelKeys];\n case StatementPosition.FromKeyword:\n return [SuggestionKind.FromKeyword];\n case StatementPosition.AfterFrom:\n return [\n SuggestionKind.WhereKeyword,\n SuggestionKind.GroupByKeywords,\n SuggestionKind.OrderByKeywords,\n SuggestionKind.LimitKeyword,\n ];\n case StatementPosition.WhereKey:\n return [SuggestionKind.LabelKeys];\n case StatementPosition.WhereComparisonOperator:\n return [SuggestionKind.ComparisonOperators];\n case StatementPosition.WhereValue:\n return [SuggestionKind.LabelValues];\n case StatementPosition.AfterWhereValue:\n return [\n SuggestionKind.LogicalOperators,\n SuggestionKind.GroupByKeywords,\n SuggestionKind.OrderByKeywords,\n SuggestionKind.LimitKeyword,\n ];\n case StatementPosition.AfterGroupByKeywords:\n return [SuggestionKind.LabelKeys];\n case StatementPosition.AfterGroupBy:\n return [SuggestionKind.OrderByKeywords, SuggestionKind.LimitKeyword];\n case StatementPosition.AfterOrderByKeywords:\n return [SuggestionKind.FunctionsWithoutArguments];\n case StatementPosition.AfterOrderByFunction:\n return [SuggestionKind.SortOrderDirectionKeyword, SuggestionKind.LimitKeyword];\n case StatementPosition.AfterOrderByDirection:\n return [SuggestionKind.LimitKeyword];\n }\n\n return [];\n}\n","import { LinkedToken } from '../../monarch/LinkedToken';\nimport { FROM, SCHEMA, SELECT } from '../language';\n\nimport { SQLTokenTypes } from './types';\n\nexport const getSelectToken = (currentToken: LinkedToken | null) =>\n currentToken?.getPreviousOfType(SQLTokenTypes.Keyword, SELECT) ?? null;\n\nexport const getSelectStatisticToken = (currentToken: LinkedToken | null) => {\n const assumedStatisticToken = getSelectToken(currentToken)?.getNextNonWhiteSpaceToken();\n return assumedStatisticToken?.isVariable() || assumedStatisticToken?.isFunction() ? assumedStatisticToken : null;\n};\n\nexport const getMetricNameToken = (currentToken: LinkedToken | null) => {\n // statistic function is followed by `(` and then an argument\n const assumedMetricNameToken = getSelectStatisticToken(currentToken)?.next?.next;\n return assumedMetricNameToken?.isVariable() || assumedMetricNameToken?.isIdentifier() ? assumedMetricNameToken : null;\n};\n\nexport const getFromKeywordToken = (currentToken: LinkedToken | null) => {\n const selectToken = getSelectToken(currentToken);\n return selectToken?.getNextOfType(SQLTokenTypes.Keyword, FROM);\n};\n\nexport const getNamespaceToken = (currentToken: LinkedToken | null) => {\n const fromToken = getFromKeywordToken(currentToken);\n const nextNonWhiteSpace = fromToken?.getNextNonWhiteSpaceToken();\n if (\n nextNonWhiteSpace?.isDoubleQuotedString() ||\n (nextNonWhiteSpace?.isVariable() && nextNonWhiteSpace?.value.toUpperCase() !== SCHEMA)\n ) {\n // schema is not used\n return nextNonWhiteSpace;\n } else if (nextNonWhiteSpace?.isKeyword() && nextNonWhiteSpace.next?.is(SQLTokenTypes.Parenthesis, '(')) {\n // schema is specified\n const assumedNamespaceToken = nextNonWhiteSpace.next?.next;\n if (assumedNamespaceToken?.isDoubleQuotedString() || assumedNamespaceToken?.isVariable()) {\n return assumedNamespaceToken;\n }\n }\n return null;\n};\n","import { uniq } from 'lodash';\n\nimport { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport type { Monaco, monacoTypes } from '@grafana/ui';\n\nimport { ResourcesAPI } from '../../../resources/ResourcesAPI';\nimport { CompletionItemProvider } from '../../monarch/CompletionItemProvider';\nimport { LinkedToken } from '../../monarch/LinkedToken';\nimport { TRIGGER_SUGGEST } from '../../monarch/commands';\nimport { SuggestionKind, CompletionItemPriority, StatementPosition } from '../../monarch/types';\nimport {\n BY,\n FROM,\n GROUP,\n LIMIT,\n ORDER,\n SCHEMA,\n SELECT,\n ASC,\n DESC,\n WHERE,\n COMPARISON_OPERATORS,\n LOGICAL_OPERATORS,\n STATISTICS,\n} from '../language';\n\nimport { getStatementPosition } from './statementPosition';\nimport { getSuggestionKinds } from './suggestionKind';\nimport { getMetricNameToken, getNamespaceToken } from './tokenUtils';\nimport { SQLTokenTypes } from './types';\n\ntype CompletionItem = monacoTypes.languages.CompletionItem;\n\nexport class SQLCompletionItemProvider extends CompletionItemProvider {\n region: string;\n\n constructor(resources: ResourcesAPI, templateSrv: TemplateSrv = getTemplateSrv()) {\n super(resources, templateSrv);\n this.region = resources.getActualRegion() ?? '';\n this.getStatementPosition = getStatementPosition;\n this.getSuggestionKinds = getSuggestionKinds;\n this.tokenTypes = SQLTokenTypes;\n }\n\n setRegion(region: string) {\n this.region = region;\n }\n\n async getSuggestions(\n monaco: Monaco,\n currentToken: LinkedToken | null,\n suggestionKinds: SuggestionKind[],\n statementPosition: StatementPosition,\n position: monacoTypes.IPosition\n ): Promise<CompletionItem[]> {\n let suggestions: CompletionItem[] = [];\n const invalidRangeToken = currentToken?.isWhiteSpace() || currentToken?.isParenthesis();\n const range =\n invalidRangeToken || !currentToken?.range ? monaco.Range.fromPositions(position) : currentToken?.range;\n\n const toCompletionItem = (value: string, rest: Partial<CompletionItem> = {}) => {\n const item: CompletionItem = {\n label: value,\n insertText: value,\n kind: monaco.languages.CompletionItemKind.Field,\n range,\n sortText: CompletionItemPriority.Medium,\n ...rest,\n };\n return item;\n };\n\n function addSuggestion(value: string, rest: Partial<CompletionItem> = {}) {\n suggestions = [...suggestions, toCompletionItem(value, rest)];\n }\n\n for (const suggestion of suggestionKinds) {\n switch (suggestion) {\n case SuggestionKind.SelectKeyword:\n addSuggestion(SELECT, {\n insertText: `${SELECT} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Keyword,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.FunctionsWithArguments:\n STATISTICS.map((s) =>\n addSuggestion(s, {\n insertText: `${s}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n })\n );\n break;\n\n case SuggestionKind.FunctionsWithoutArguments:\n STATISTICS.map((s) =>\n addSuggestion(s, {\n insertText: `${s}() `,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n })\n );\n break;\n\n case SuggestionKind.Metrics:\n {\n const namespaceToken = getNamespaceToken(currentToken);\n if (namespaceToken?.value) {\n // if a namespace is specified, only suggest metrics for the namespace\n const metrics = await this.resources.getMetrics({\n namespace: namespaceToken?.value.replace(/\\\"/g, ''),\n region: this.region,\n });\n metrics.forEach((m) => m.value && addSuggestion(m.value));\n } else {\n // If no namespace is specified in the query, just list all metrics\n const metrics = await this.resources.getAllMetrics({ region: this.region });\n uniq(metrics.map((m) => m.metricName)).forEach((m) => m && addSuggestion(m, { insertText: m }));\n }\n }\n break;\n\n case SuggestionKind.FromKeyword:\n addSuggestion(FROM, {\n insertText: `${FROM} `,\n command: TRIGGER_SUGGEST,\n });\n break;\n\n case SuggestionKind.SchemaKeyword:\n addSuggestion(SCHEMA, {\n sortText: CompletionItemPriority.High,\n insertText: `${SCHEMA}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n });\n break;\n\n case SuggestionKind.Namespaces:\n const metricNameToken = getMetricNameToken(currentToken);\n let namespaces = [];\n if (metricNameToken?.value) {\n // if a metric is specified, only suggest namespaces that actually have that metric\n const metrics = await this.resources.getMetrics({ region: this.region });\n const metricName = this.templateSrv.replace(metricNameToken.value);\n namespaces = metrics.filter((m) => m.metricName === metricName).map((m) => m.namespace);\n } else {\n // if no metric is specified, just suggest all namespaces\n const ns = await this.resources.getNamespaces();\n namespaces = ns.map((n) => n.value);\n }\n namespaces.map((n) => addSuggestion(`\"${n}\"`, { insertText: `\"${n}\"` }));\n break;\n\n case SuggestionKind.LabelKeys:\n {\n const metricNameToken = getMetricNameToken(currentToken);\n const namespaceToken = getNamespaceToken(currentToken);\n if (namespaceToken?.value) {\n let dimensionFilters = {};\n let labelKeyTokens;\n if (statementPosition === StatementPosition.SchemaFuncExtraArgument) {\n labelKeyTokens = namespaceToken?.getNextUntil(this.tokenTypes.Parenthesis, [\n this.tokenTypes.Delimiter,\n this.tokenTypes.Whitespace,\n ]);\n } else if (statementPosition === StatementPosition.AfterGroupByKeywords) {\n labelKeyTokens = currentToken?.getPreviousUntil(this.tokenTypes.Keyword, [\n this.tokenTypes.Delimiter,\n this.tokenTypes.Whitespace,\n ]);\n }\n dimensionFilters = (labelKeyTokens || []).reduce((acc, curr) => {\n return { ...acc, [curr.value]: null };\n }, {});\n const keys = await this.resources.getDimensionKeys(\n {\n namespace: this.templateSrv.replace(namespaceToken.value.replace(/\\\"/g, '')),\n region: this.templateSrv.replace(this.region),\n metricName: metricNameToken?.value,\n dimensionFilters,\n },\n false\n );\n keys.map((m) => {\n const key = /[\\s\\.-]/.test(m.value ?? '') ? `\"${m.value}\"` : m.value;\n key && addSuggestion(key);\n });\n }\n }\n break;\n\n case SuggestionKind.LabelValues:\n {\n const namespaceToken = getNamespaceToken(currentToken);\n const metricNameToken = getMetricNameToken(currentToken);\n const labelKey = currentToken?.getPreviousNonWhiteSpaceToken()?.getPreviousNonWhiteSpaceToken();\n if (namespaceToken?.value && labelKey?.value && metricNameToken?.value) {\n const values = await this.resources.getDimensionValues({\n region: this.region,\n namespace: namespaceToken.value.replace(/\\\"/g, ''),\n metricName: metricNameToken.value,\n dimensionKey: labelKey.value,\n });\n values.map((o) =>\n addSuggestion(`'${o.value}'`, { insertText: `'${o.value}' `, command: TRIGGER_SUGGEST })\n );\n }\n }\n break;\n\n case SuggestionKind.LogicalOperators:\n LOGICAL_OPERATORS.map((o) =>\n addSuggestion(`${o}`, {\n insertText: `${o} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumHigh,\n })\n );\n break;\n\n case SuggestionKind.WhereKeyword:\n addSuggestion(`${WHERE}`, {\n insertText: `${WHERE} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.High,\n });\n break;\n\n case SuggestionKind.ComparisonOperators:\n COMPARISON_OPERATORS.map((o) => addSuggestion(`${o}`, { insertText: `${o} `, command: TRIGGER_SUGGEST }));\n break;\n\n case SuggestionKind.GroupByKeywords:\n addSuggestion(`${GROUP} ${BY}`, {\n insertText: `${GROUP} ${BY} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.MediumHigh,\n });\n break;\n\n case SuggestionKind.OrderByKeywords:\n addSuggestion(`${ORDER} ${BY}`, {\n insertText: `${ORDER} ${BY} `,\n command: TRIGGER_SUGGEST,\n sortText: CompletionItemPriority.Medium,\n });\n break;\n\n case SuggestionKind.LimitKeyword:\n addSuggestion(LIMIT, { insertText: `${LIMIT} `, sortText: CompletionItemPriority.MediumLow });\n break;\n\n case SuggestionKind.SortOrderDirectionKeyword:\n [ASC, DESC].map((s) =>\n addSuggestion(s, {\n insertText: `${s} `,\n command: TRIGGER_SUGGEST,\n })\n );\n break;\n }\n }\n\n this.templateSrv.getVariables().map((v) => {\n const variable = `$${v.name}`;\n addSuggestion(variable, {\n range,\n label: variable,\n insertText: variable,\n kind: monaco.languages.CompletionItemKind.Variable,\n sortText: CompletionItemPriority.Low,\n });\n });\n\n return suggestions;\n }\n}\n","import { LanguageDefinition } from '../monarch/register';\n\nexport const CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID = 'cloudwatch-logs';\n\nconst cloudWatchLogsLanguageDefinition: LanguageDefinition = {\n id: CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID,\n extensions: [],\n aliases: [],\n mimetypes: [],\n loader: () => import('./language'),\n};\nexport default cloudWatchLogsLanguageDefinition;\n","import { TokenTypes } from '../../monarch/types';\nimport { CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID } from '../definition';\n\nexport const LogsTokenTypes: TokenTypes = {\n Parenthesis: `delimiter.parenthesis.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Whitespace: `white.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Keyword: `keyword.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Delimiter: `delimiter.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Operator: `operator.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Identifier: `identifier.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Type: `type.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Function: `predefined.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Number: `number.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n String: `string.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Variable: `variable.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Comment: `comment.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n Regexp: `regexp.${CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID}`,\n};\n","import { LinkedToken } from '../../monarch/LinkedToken';\nimport { StatementPosition } from '../../monarch/types';\nimport {\n DISPLAY,\n FIELDS,\n FILTER,\n STATS,\n SORT,\n LIMIT,\n PARSE,\n DEDUP,\n DIFF,\n LOGS_COMMANDS,\n LOGS_FUNCTION_OPERATORS,\n LOGS_LOGIC_OPERATORS,\n} from '../language';\n\nimport { LogsTokenTypes } from './types';\n\n// about getStatementPosition: public/app/plugins/datasource/cloudwatch/language/cloudwatch-ppl/completion/statementPosition.ts\n\nexport const getStatementPosition = (currentToken: LinkedToken | null): StatementPosition => {\n const previousNonWhiteSpace = currentToken?.getPreviousNonWhiteSpaceToken();\n const nextNonWhiteSpace = currentToken?.getNextNonWhiteSpaceToken();\n\n const normalizedCurrentToken = currentToken?.value?.toLowerCase();\n const normalizedPreviousNonWhiteSpace = previousNonWhiteSpace?.value?.toLowerCase();\n\n if (currentToken?.is(LogsTokenTypes.Comment)) {\n return StatementPosition.Comment;\n }\n\n if (currentToken?.isFunction()) {\n return StatementPosition.Function;\n }\n\n if (\n currentToken === null ||\n (currentToken?.isWhiteSpace() && previousNonWhiteSpace === null && nextNonWhiteSpace === null) ||\n (previousNonWhiteSpace?.is(LogsTokenTypes.Delimiter, '|') && currentToken?.isWhiteSpace()) ||\n (currentToken?.isIdentifier() &&\n (previousNonWhiteSpace?.is(LogsTokenTypes.Delimiter, '|') || previousNonWhiteSpace === null))\n ) {\n return StatementPosition.NewCommand;\n }\n\n if (\n currentToken?.is(LogsTokenTypes.Parenthesis, ')') ||\n (currentToken?.isWhiteSpace() && previousNonWhiteSpace?.is(LogsTokenTypes.Parenthesis, ')'))\n ) {\n const openingParenthesis = currentToken?.getPreviousOfType(LogsTokenTypes.Parenthesis, '(');\n const normalizedNonWhitespacePreceedingOpeningParenthesis = openingParenthesis\n ?.getPreviousNonWhiteSpaceToken()\n ?.value?.toLowerCase();\n\n if (normalizedNonWhitespacePreceedingOpeningParenthesis) {\n if (LOGS_COMMANDS.includes(normalizedNonWhitespacePreceedingOpeningParenthesis)) {\n return StatementPosition.AfterCommand;\n }\n if (LOGS_FUNCTION_OPERATORS.includes(normalizedNonWhitespacePreceedingOpeningParenthesis)) {\n return StatementPosition.AfterFunction;\n }\n }\n }\n\n if (currentToken?.isKeyword() && normalizedCurrentToken) {\n switch (normalizedCurrentToken) {\n case DEDUP:\n return StatementPosition.DedupKeyword;\n case DIFF:\n return StatementPosition.DiffKeyword;\n case DISPLAY:\n return StatementPosition.DisplayKeyword;\n case FIELDS:\n return StatementPosition.FieldsKeyword;\n case FILTER:\n return StatementPosition.FilterKeyword;\n case LIMIT:\n return StatementPosition.LimitKeyword;\n case PARSE:\n return StatementPosition.ParseKeyword;\n case STATS:\n return StatementPosition.StatsKeyword;\n case SORT:\n return StatementPosition.SortKeyword;\n case 'as':\n return StatementPosition.AsKeyword;\n case 'by':\n return StatementPosition.ByKeyword;\n case 'in':\n return StatementPosition.InKeyword;\n case 'like':\n return StatementPosition.LikeKeyword;\n }\n }\n\n if (currentToken?.isWhiteSpace() && previousNonWhiteSpace?.isKeyword && normalizedPreviousNonWhiteSpace) {\n switch (normalizedPreviousNonWhiteSpace) {\n case DEDUP:\n return StatementPosition.AfterDedupKeyword;\n case DIFF:\n return StatementPosition.AfterDiffKeyword;\n case DISPLAY:\n return StatementPosition.AfterDisplayKeyword;\n case FIELDS:\n return StatementPosition.AfterFieldsKeyword;\n case FILTER:\n return StatementPosition.AfterFilterKeyword;\n case LIMIT:\n return StatementPosition.AfterLimitKeyword;\n case PARSE:\n return StatementPosition.AfterParseKeyword;\n case STATS:\n return StatementPosition.AfterStatsKeyword;\n case SORT:\n return StatementPosition.AfterSortKeyword;\n case 'as':\n return StatementPosition.AfterAsKeyword;\n case 'by':\n return StatementPosition.AfterByKeyword;\n case 'in':\n return StatementPosition.AfterInKeyword;\n case 'like':\n return StatementPosition.AfterLikeKeyword;\n }\n }\n\n if (currentToken?.is(LogsTokenTypes.Operator) && normalizedCurrentToken) {\n if (['+', '-', '*', '/', '^', '%'].includes(normalizedCurrentToken)) {\n return StatementPosition.ArithmeticOperator;\n }\n\n if (['=', '!=', '<', '>', '<=', '>='].includes(normalizedCurrentToken)) {\n return StatementPosition.ComparisonOperator;\n }\n\n if (LOGS_LOGIC_OPERATORS.includes(normalizedCurrentToken)) {\n return StatementPosition.BooleanOperator;\n }\n }\n\n if (previousNonWhiteSpace?.is(LogsTokenTypes.Operator) && normalizedPreviousNonWhiteSpace) {\n if (['+', '-', '*', '/', '^', '%'].includes(normalizedPreviousNonWhiteSpace)) {\n return StatementPosition.ArithmeticOperatorArg;\n }\n\n if (['=', '!=', '<', '>', '<=', '>='].includes(normalizedPreviousNonWhiteSpace)) {\n return StatementPosition.ComparisonOperatorArg;\n }\n\n if (LOGS_LOGIC_OPERATORS.includes(normalizedPreviousNonWhiteSpace)) {\n return StatementPosition.BooleanOperatorArg;\n }\n }\n\n if (\n currentToken?.isIdentifier() ||\n currentToken?.isNumber() ||\n currentToken?.is(LogsTokenTypes.Parenthesis, '()') ||\n currentToken?.is(LogsTokenTypes.Delimiter, ',') ||\n currentToken?.is(LogsTokenTypes.Parenthesis, ')') ||\n (currentToken?.isWhiteSpace() && previousNonWhiteSpace?.is(LogsTokenTypes.Delimiter, ',')) ||\n (currentToken?.isWhiteSpace() && previousNonWhiteSpace?.isIdentifier()) ||\n (currentToken?.isWhiteSpace() &&\n previousNonWhiteSpace?.isKeyword() &&\n normalizedPreviousNonWhiteSpace &&\n LOGS_COMMANDS.includes(normalizedPreviousNonWhiteSpace))\n ) {\n const nearestKeyword = currentToken?.getPreviousOfType(LogsTokenTypes.Keyword);\n const nearestFunction = currentToken?.getPreviousOfType(LogsTokenTypes.Function);\n\n if (nearestKeyword !== null && nearestFunction === null) {\n if (nearestKeyword.value === SORT) {\n return StatementPosition.SortArg;\n }\n if (nearestKeyword.value === FILTER) {\n return StatementPosition.FilterArg;\n }\n if (nearestKeyword.value === DIFF) {\n return StatementPosition.DiffModifierArg;\n }\n return StatementPosition.CommandArg;\n }\n\n if (nearestFunction !== null && nearestKeyword === null) {\n return StatementPosition.FunctionArg;\n }\n\n if (nearestKeyword !== null && nearestFunction !== null) {\n if (\n nearestKeyword.range.startLineNumber > nearestFunction.range.startLineNumber ||\n nearestKeyword.range.endColumn > nearestFunction.range.endColumn\n ) {\n if (nearestKeyword.value === SORT) {\n return StatementPosition.SortArg;\n }\n if (nearestKeyword.value === FILTER) {\n return StatementPosition.FilterArg;\n }\n if (nearestKeyword.value === DIFF) {\n return StatementPosition.DiffModifierArg;\n }\n return StatementPosition.CommandArg;\n }\n\n if (\n nearestFunction.range.startLineNumber > nearestKeyword.range.startLineNumber ||\n nearestFunction.range.endColumn > nearestKeyword.range.endColumn\n ) {\n return StatementPosition.FunctionArg;\n }\n }\n }\n\n return StatementPosition.Unknown;\n};\n","import { StatementPosition, SuggestionKind } from '../../monarch/types';\n\nexport function getSuggestionKinds(statementPosition: StatementPosition): SuggestionKind[] {\n switch (statementPosition) {\n case StatementPosition.NewCommand:\n return [SuggestionKind.Command];\n case StatementPosition.AfterSortKeyword:\n case StatementPosition.SortArg:\n return [SuggestionKind.SortOrderDirectionKeyword, SuggestionKind.Function];\n case StatementPosition.AfterDiffKeyword:\n case StatementPosition.DiffModifierArg:\n return [SuggestionKind.DiffModifier];\n case StatementPosition.AfterDisplayKeyword:\n case StatementPosition.AfterFieldsKeyword:\n case StatementPosition.AfterFilterKeyword:\n case StatementPosition.AfterStatsKeyword:\n case StatementPosition.AfterLimitKeyword:\n case StatementPosition.AfterParseKeyword:\n case StatementPosition.AfterDedupKeyword:\n case StatementPosition.CommandArg:\n case StatementPosition.FunctionArg:\n case StatementPosition.ArithmeticOperatorArg:\n case StatementPosition.BooleanOperatorArg:\n case StatementPosition.ComparisonOperatorArg:\n return [SuggestionKind.Function];\n case StatementPosition.FilterArg:\n return [SuggestionKind.InKeyword, SuggestionKind.Function];\n }\n\n return [];\n}\n","import { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport { Monaco, monacoTypes } from '@grafana/ui';\n\nimport { type ResourcesAPI } from '../../../resources/ResourcesAPI';\nimport { LogGroup } from '../../../types';\nimport { CompletionItemProvider } from '../../monarch/CompletionItemProvider';\nimport { LinkedToken } from '../../monarch/LinkedToken';\nimport { TRIGGER_SUGGEST } from '../../monarch/commands';\nimport { CompletionItem, CompletionItemPriority, StatementPosition, SuggestionKind } from '../../monarch/types';\nimport { fetchLogGroupFields } from '../../utils';\nimport { LOGS_COMMANDS, LOGS_FUNCTION_OPERATORS, SORT_DIRECTION_KEYWORDS, DIFF_MODIFIERS } from '../language';\n\nimport { getStatementPosition } from './statementPosition';\nimport { getSuggestionKinds } from './suggestionKinds';\nimport { LogsTokenTypes } from './types';\n\nexport type queryContext = {\n logGroups?: LogGroup[];\n region: string;\n};\n\nexport function LogsCompletionItemProviderFunc(resources: ResourcesAPI, templateSrv: TemplateSrv = getTemplateSrv()) {\n return (queryContext: queryContext) => {\n return new LogsCompletionItemProvider(resources, templateSrv, queryContext);\n };\n}\n\nexport class LogsCompletionItemProvider extends CompletionItemProvider {\n queryContext: queryContext;\n\n constructor(resources: ResourcesAPI, templateSrv: TemplateSrv = getTemplateSrv(), queryContext: queryContext) {\n super(resources, templateSrv);\n this.getStatementPosition = getStatementPosition;\n this.getSuggestionKinds = getSuggestionKinds;\n this.tokenTypes = LogsTokenTypes;\n this.queryContext = queryContext;\n }\n\n async getSuggestions(\n monaco: Monaco,\n currentToken: LinkedToken | null,\n suggestionKinds: SuggestionKind[],\n statementPosition: StatementPosition,\n position: monacoTypes.IPosition\n ): Promise<CompletionItem[]> {\n const suggestions: CompletionItem[] = [];\n const invalidRangeToken = currentToken?.isWhiteSpace() || currentToken?.isParenthesis();\n const range =\n invalidRangeToken || !currentToken?.range ? monaco.Range.fromPositions(position) : currentToken?.range;\n\n function toCompletionItem(value: string, rest: Partial<CompletionItem> = {}) {\n const item: monacoTypes.languages.CompletionItem = {\n label: value,\n insertText: value,\n kind: monaco.languages.CompletionItemKind.Field,\n range,\n sortText: CompletionItemPriority.Medium,\n ...rest,\n };\n return item;\n }\n\n function addSuggestion(value: string, rest: Partial<CompletionItem> = {}) {\n suggestions.push(toCompletionItem(value, rest));\n }\n\n for (const kind of suggestionKinds) {\n switch (kind) {\n case SuggestionKind.Command:\n LOGS_COMMANDS.forEach((command) => {\n addSuggestion(command, {\n insertText: `${command} $0`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Method,\n });\n });\n break;\n case SuggestionKind.Function:\n LOGS_FUNCTION_OPERATORS.forEach((f) => {\n addSuggestion(f, {\n insertText: `${f}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n });\n });\n\n if (this.queryContext.logGroups && this.queryContext.logGroups.length > 0) {\n let fields = await fetchLogGroupFields(\n this.queryContext.logGroups,\n this.queryContext.region,\n this.templateSrv,\n this.resources\n );\n fields.push('@log');\n fields.forEach((field) => {\n if (field !== '') {\n addSuggestion(field, {\n range,\n label: field,\n insertText: field,\n kind: monaco.languages.CompletionItemKind.Field,\n sortText: CompletionItemPriority.High,\n });\n }\n });\n }\n break;\n case SuggestionKind.SortOrderDirectionKeyword:\n SORT_DIRECTION_KEYWORDS.forEach((direction) => {\n addSuggestion(direction, {\n sortText: CompletionItemPriority.High,\n kind: monaco.languages.CompletionItemKind.Operator,\n });\n });\n break;\n case SuggestionKind.DiffModifier:\n DIFF_MODIFIERS.forEach((modifier) => {\n addSuggestion(modifier, {\n sortText: CompletionItemPriority.High,\n kind: monaco.languages.CompletionItemKind.Keyword,\n });\n });\n break;\n case SuggestionKind.InKeyword:\n addSuggestion('in []', {\n insertText: 'in [\"$0\"]',\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n kind: monaco.languages.CompletionItemKind.Snippet,\n sortText: CompletionItemPriority.High,\n });\n break;\n }\n }\n\n this.templateSrv.getVariables().map((v) => {\n const variable = `$${v.name}`;\n addSuggestion(variable, {\n range,\n label: variable,\n insertText: variable,\n kind: monaco.languages.CompletionItemKind.Variable,\n sortText: CompletionItemPriority.Low,\n });\n });\n\n return suggestions;\n }\n}\n","import { TokenTypes } from '../../monarch/types';\n\nexport const MetricMathTokenTypes: TokenTypes = {\n Parenthesis: 'delimiter.parenthesis.cloudwatch-MetricMath',\n Whitespace: 'white.cloudwatch-MetricMath',\n Keyword: 'keyword.cloudwatch-MetricMath',\n Delimiter: 'delimiter.cloudwatch-MetricMath',\n Operator: 'operator.cloudwatch-MetricMath',\n Identifier: 'identifier.cloudwatch-MetricMath',\n Type: 'type.cloudwatch-MetricMath',\n Function: 'predefined.cloudwatch-MetricMath',\n Number: 'number.cloudwatch-MetricMath',\n String: 'string.cloudwatch-MetricMath',\n Variable: 'variable.cloudwatch-MetricMath',\n Comment: 'comment.cloudwatch-MetricMath',\n Regexp: 'regexp.cloudwatch-MetricMath',\n};\n","import { LinkedToken } from '../../monarch/LinkedToken';\nimport { StatementPosition } from '../../monarch/types';\n\nimport { MetricMathTokenTypes } from './types';\n\nexport function getStatementPosition(currentToken: LinkedToken | null): StatementPosition {\n const previousNonWhiteSpace = currentToken?.getPreviousNonWhiteSpaceToken();\n\n if (currentToken && currentToken.isString()) {\n return StatementPosition.WithinString;\n }\n\n if (currentToken && previousNonWhiteSpace) {\n const currentFunction = currentToken.getPreviousOfType(MetricMathTokenTypes.Function);\n const isAfterComma = previousNonWhiteSpace.is(MetricMathTokenTypes.Delimiter, ',');\n const isWithinSearch = currentFunction && currentFunction.value === 'SEARCH';\n const allTokensAfterStartOfSearch =\n currentToken.getPreviousUntil(MetricMathTokenTypes.Function, [], 'SEARCH') || [];\n\n if (isWithinSearch) {\n // if there's only one ' then we're still within the first arg\n if (allTokensAfterStartOfSearch.filter(({ value }) => value === \"'\").length === 1) {\n return StatementPosition.WithinString;\n }\n\n // if there was a , before the last , and it happened after the start of SEARCH\n const lastComma = previousNonWhiteSpace.getPreviousOfType(MetricMathTokenTypes.Delimiter, ',');\n if (lastComma) {\n const lastCommaIsAfterSearch =\n lastComma.range.startColumn > currentFunction.range.startColumn &&\n lastComma.range.startLineNumber >= currentFunction.range.startLineNumber;\n if (lastCommaIsAfterSearch) {\n return StatementPosition.SearchFuncThirdArg;\n }\n }\n\n // otherwise assume it's the second arg\n return StatementPosition.SearchFuncSecondArg;\n }\n\n if (!isWithinSearch && isAfterComma) {\n return StatementPosition.PredefinedFuncSecondArg;\n }\n }\n\n if (previousNonWhiteSpace?.endsWith(')')) {\n return StatementPosition.AfterFunction;\n }\n\n if (!currentToken || !currentToken.isString()) {\n return StatementPosition.PredefinedFunction;\n }\n\n return StatementPosition.Unknown;\n}\n","import { StatementPosition, SuggestionKind } from '../../monarch/types';\n\nexport function getSuggestionKinds(statementPosition: StatementPosition): SuggestionKind[] {\n switch (statementPosition) {\n case StatementPosition.PredefinedFunction:\n return [SuggestionKind.FunctionsWithArguments];\n case StatementPosition.PredefinedFuncSecondArg:\n return [SuggestionKind.FunctionsWithArguments, SuggestionKind.KeywordArguments];\n case StatementPosition.AfterFunction:\n return [SuggestionKind.Operators];\n case StatementPosition.SearchFuncSecondArg:\n return [SuggestionKind.Statistic];\n case StatementPosition.SearchFuncThirdArg:\n return [SuggestionKind.Period];\n }\n\n return [];\n}\n","import { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport type { Monaco, monacoTypes } from '@grafana/ui';\n\nimport { ResourcesAPI } from '../../../resources/ResourcesAPI';\nimport { CompletionItemProvider } from '../../monarch/CompletionItemProvider';\nimport { LinkedToken } from '../../monarch/LinkedToken';\nimport { TRIGGER_SUGGEST } from '../../monarch/commands';\nimport { SuggestionKind, CompletionItemPriority, StatementPosition } from '../../monarch/types';\nimport {\n METRIC_MATH_FNS,\n METRIC_MATH_KEYWORDS,\n METRIC_MATH_OPERATORS,\n METRIC_MATH_PERIODS,\n METRIC_MATH_STATISTIC_KEYWORD_STRINGS,\n} from '../language';\n\nimport { getStatementPosition } from './statementPosition';\nimport { getSuggestionKinds } from './suggestionKind';\nimport { MetricMathTokenTypes } from './types';\n\ntype CompletionItem = monacoTypes.languages.CompletionItem;\n\nexport class MetricMathCompletionItemProvider extends CompletionItemProvider {\n constructor(resources: ResourcesAPI, templateSrv: TemplateSrv = getTemplateSrv()) {\n super(resources, templateSrv);\n this.getStatementPosition = getStatementPosition;\n this.getSuggestionKinds = getSuggestionKinds;\n this.tokenTypes = MetricMathTokenTypes;\n }\n\n async getSuggestions(\n monaco: Monaco,\n currentToken: LinkedToken | null,\n suggestionKinds: SuggestionKind[],\n statementPosition: StatementPosition,\n position: monacoTypes.IPosition\n ): Promise<CompletionItem[]> {\n let suggestions: CompletionItem[] = [];\n const invalidRangeToken = currentToken?.isWhiteSpace() || currentToken?.isParenthesis();\n const range =\n invalidRangeToken || !currentToken?.range ? monaco.Range.fromPositions(position) : currentToken?.range;\n\n const toCompletionItem = (value: string, rest: Partial<CompletionItem> = {}) => {\n const item: CompletionItem = {\n label: value,\n insertText: value,\n kind: monaco.languages.CompletionItemKind.Field,\n range,\n sortText: CompletionItemPriority.Medium,\n ...rest,\n };\n return item;\n };\n\n function addSuggestion(value: string, rest: Partial<CompletionItem> = {}) {\n suggestions = [...suggestions, toCompletionItem(value, rest)];\n }\n\n for (const suggestion of suggestionKinds) {\n switch (suggestion) {\n case SuggestionKind.FunctionsWithArguments:\n METRIC_MATH_FNS.map((f) =>\n addSuggestion(f, {\n insertText: f === 'SEARCH' ? `${f}('$0')` : `${f}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Function,\n })\n );\n break;\n\n case SuggestionKind.KeywordArguments:\n METRIC_MATH_KEYWORDS.map((s) =>\n addSuggestion(s, {\n insertText: s,\n command: TRIGGER_SUGGEST,\n kind: monaco.languages.CompletionItemKind.Keyword,\n sortText: CompletionItemPriority.MediumHigh,\n })\n );\n break;\n\n case SuggestionKind.Statistic:\n METRIC_MATH_STATISTIC_KEYWORD_STRINGS.map((s) =>\n addSuggestion(s, {\n insertText: `'${s}', `,\n command: TRIGGER_SUGGEST,\n })\n );\n break;\n\n case SuggestionKind.Operators:\n METRIC_MATH_OPERATORS.map((s) =>\n addSuggestion(s, {\n insertText: `${s} `,\n command: TRIGGER_SUGGEST,\n })\n );\n break;\n\n case SuggestionKind.Period:\n addSuggestion('$__period_auto', {\n kind: monaco.languages.CompletionItemKind.Variable,\n sortText: 'a',\n detail: 'Sets period dynamically to adjust to selected time range.',\n });\n METRIC_MATH_PERIODS.map((s, idx) =>\n addSuggestion(s.toString(), {\n kind: monaco.languages.CompletionItemKind.Value,\n sortText: String.fromCharCode(97 + idx), // converts index 0, 1 to \"a\", \"b\", etc needed to show the time periods in numerical order\n })\n );\n break;\n }\n }\n\n // always suggest template variables\n this.templateSrv.getVariables().map((v) => {\n const variable = `$${v.name}`;\n addSuggestion(variable, {\n range,\n label: variable,\n insertText: variable,\n kind: monaco.languages.CompletionItemKind.Variable,\n sortText: CompletionItemPriority.Low,\n });\n });\n\n return suggestions;\n }\n}\n","import { debounce, memoize } from 'lodash';\n\nexport default <T>(func: (...args: T[]) => void, wait = 7000) => {\n const mem = memoize(\n (...args) =>\n debounce(func, wait, {\n leading: true,\n }),\n (...args) => JSON.stringify(args)\n );\n\n return (...args: T[]) => mem(...args)(...args);\n};\n","import { Observable } from 'rxjs';\n\nimport { DataSourceInstanceSettings, DataSourceRef, getDataSourceRef, ScopedVars, AppEvents } from '@grafana/data';\nimport { BackendDataSourceResponse, FetchResponse, getBackendSrv, TemplateSrv, getAppEvents } from '@grafana/runtime';\n\nimport memoizedDebounce from '../memoizedDebounce';\nimport { CloudWatchJsonData, Dimensions, MetricRequest, MultiFilters } from '../types';\nimport { getVariableName } from '../utils/templateVariableUtils';\n\nexport abstract class CloudWatchRequest {\n templateSrv: TemplateSrv;\n ref: DataSourceRef;\n dsQueryEndpoint = '/api/ds/query';\n debouncedCustomAlert: (title: string, message: string) => void = memoizedDebounce(displayCustomError);\n\n constructor(\n public instanceSettings: DataSourceInstanceSettings<CloudWatchJsonData>,\n templateSrv: TemplateSrv\n ) {\n this.templateSrv = templateSrv;\n this.ref = getDataSourceRef(instanceSettings);\n }\n\n awsRequest(\n url: string,\n data: MetricRequest,\n headers: Record<string, string> = {}\n ): Observable<FetchResponse<BackendDataSourceResponse>> {\n const options = {\n method: 'POST',\n url,\n data,\n headers,\n };\n\n return getBackendSrv().fetch<BackendDataSourceResponse>(options);\n }\n\n convertDimensionFormat(\n dimensions: Dimensions,\n scopedVars: ScopedVars,\n displayErrorIfIsMultiTemplateVariable = true\n ): Dimensions {\n return Object.entries(dimensions).reduce((result, [key, value]) => {\n key = this.replaceVariableAndDisplayWarningIfMulti(\n key,\n scopedVars,\n displayErrorIfIsMultiTemplateVariable,\n 'dimension keys'\n );\n\n if (Array.isArray(value)) {\n return { ...result, [key]: value };\n }\n\n if (!value) {\n return { ...result, [key]: null };\n }\n\n const newValues = this.expandVariableToArray(value, scopedVars);\n return { ...result, [key]: newValues };\n }, {});\n }\n\n // get the value for a given template variable\n expandVariableToArray(value: string, scopedVars: ScopedVars): string[] {\n const variableName = getVariableName(value);\n const valueVar = this.templateSrv.getVariables().find(({ name }) => {\n return name === variableName;\n });\n\n if (variableName && valueVar) {\n const isMultiVariable =\n valueVar?.type === 'custom' || valueVar?.type === 'query' || valueVar?.type === 'datasource';\n if (isMultiVariable && valueVar.multi) {\n return this.templateSrv.replace(value, scopedVars, 'pipe').split('|');\n }\n return [this.templateSrv.replace(value, scopedVars)];\n }\n return [value];\n }\n\n convertMultiFilterFormat(multiFilters: MultiFilters, fieldName?: string) {\n return Object.entries(multiFilters).reduce((result, [key, values]) => {\n const interpolatedKey = this.replaceVariableAndDisplayWarningIfMulti(key, {}, true, fieldName);\n if (!values) {\n return { ...result, [interpolatedKey]: null };\n }\n const initialVal: string[] = [];\n const newValues = values.reduce((result, value) => {\n const vals = this.expandVariableToArray(value, {});\n return [...result, ...vals];\n }, initialVal);\n return { ...result, [interpolatedKey]: newValues };\n }, {});\n }\n\n isMultiVariable(target?: string) {\n if (target) {\n const variables = this.templateSrv.getVariables();\n const variable = variables.find(({ name }) => name === getVariableName(target));\n const type = variable?.type;\n return (type === 'custom' || type === 'query' || type === 'datasource') && variable?.multi;\n }\n\n return false;\n }\n\n isVariableWithMultipleOptionsSelected(target?: string, scopedVars?: ScopedVars) {\n if (!target || !this.isMultiVariable(target)) {\n return false;\n }\n return this.expandVariableToArray(target, scopedVars || {}).length > 1;\n }\n\n replaceVariableAndDisplayWarningIfMulti(\n target?: string,\n scopedVars?: ScopedVars,\n displayErrorIfIsMultiTemplateVariable?: boolean,\n fieldName?: string\n ) {\n if (displayErrorIfIsMultiTemplateVariable && this.isVariableWithMultipleOptionsSelected(target)) {\n this.debouncedCustomAlert(\n 'CloudWatch templating error',\n `Multi template variables are not supported for ${fieldName || target}`\n );\n }\n\n return this.templateSrv.replace(target, scopedVars);\n }\n\n getActualRegion(region?: string) {\n if (region === 'default' || region === undefined || region === '') {\n return this.instanceSettings.jsonData.defaultRegion ?? '';\n }\n return region;\n }\n\n getVariables() {\n return this.templateSrv.getVariables().map((v) => `$${v.name}`);\n }\n}\n\nconst displayCustomError = (title: string, message: string) =>\n getAppEvents().publish({\n type: AppEvents.alertError.name,\n payload: [title, message],\n });\n","import { Observable } from 'rxjs';\n\nimport { DataQueryRequest, DataQueryResponse, DataSourceInstanceSettings } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\n\nimport { CloudWatchAnnotationQuery, CloudWatchJsonData, CloudWatchQuery } from '../types';\n\nimport { CloudWatchRequest } from './CloudWatchRequest';\n\n// This class handles execution of CloudWatch annotation queries\nexport class CloudWatchAnnotationQueryRunner extends CloudWatchRequest {\n constructor(instanceSettings: DataSourceInstanceSettings<CloudWatchJsonData>, templateSrv: TemplateSrv) {\n super(instanceSettings, templateSrv);\n }\n\n handleAnnotationQuery(\n queries: CloudWatchAnnotationQuery[],\n options: DataQueryRequest<CloudWatchQuery>,\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>\n ): Observable<DataQueryResponse> {\n return queryFn({\n ...options,\n targets: queries.map((query) => ({\n ...query,\n statistic: this.templateSrv.replace(query.statistic),\n region: this.templateSrv.replace(this.getActualRegion(query.region)),\n namespace: this.templateSrv.replace(query.namespace),\n metricName: this.templateSrv.replace(query.metricName),\n dimensions: this.convertDimensionFormat(query.dimensions ?? {}, {}),\n period: query.period ?? '',\n actionPrefix: query.actionPrefix ?? '',\n alarmNamePrefix: query.alarmNamePrefix ?? '',\n type: 'annotationQuery',\n datasource: this.ref,\n })),\n });\n }\n}\n","const JSURL = require('jsurl');\n\nexport interface AwsUrl {\n end: string;\n start: string;\n timeType?: 'ABSOLUTE' | 'RELATIVE';\n tz?: 'local' | 'UTC';\n unit?: string;\n editorString: string;\n isLiveTail: boolean;\n source: string[];\n}\n\nconst defaultURL = 'console.aws.amazon.com';\nconst usGovURL = 'console.amazonaws-us-gov.com';\nconst chinaURL = 'console.amazonaws.cn';\n\nexport function getLogsEndpoint(region: string): string {\n let url = defaultURL;\n if (region.startsWith('us-gov-')) {\n url = usGovURL;\n }\n if (region.startsWith('cn-')) {\n url = chinaURL;\n }\n return `${region}.${url}`;\n}\n\nexport function encodeUrl(obj: AwsUrl, region: string): string {\n return `https://${getLogsEndpoint(\n region\n )}/cloudwatch/home?region=${region}#logs-insights:queryDetail=${JSURL.stringify(obj)}`;\n}\n","import {\n DataFrame,\n DataLink,\n DataQueryRequest,\n DataQueryResponse,\n FieldType,\n ScopedVars,\n TimeRange,\n} from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { AwsUrl, encodeUrl } from '../aws_url';\nimport { CloudWatchLogsQuery, CloudWatchQuery } from '../types';\n\ntype ReplaceFn = (\n target?: string,\n scopedVars?: ScopedVars,\n displayErrorIfIsMultiTemplateVariable?: boolean,\n fieldName?: string\n) => string;\n\nexport async function addDataLinksToLogsResponse(\n response: DataQueryResponse,\n request: DataQueryRequest<CloudWatchQuery>,\n replaceFn: ReplaceFn,\n getVariableValueFn: (value: string, scopedVars: ScopedVars) => string[],\n getRegion: (region: string) => string,\n tracingDatasourceUid?: string\n): Promise<void> {\n const replace = (target: string, fieldName?: string) => replaceFn(target, request.scopedVars, false, fieldName);\n const getVariableValue = (target: string) => getVariableValueFn(target, request.scopedVars);\n\n for (const dataFrame of response.data as DataFrame[]) {\n const curTarget = request.targets.find((target) => target.refId === dataFrame.refId) as CloudWatchLogsQuery;\n const interpolatedRegion = getRegion(replace(curTarget.region ?? '', 'region'));\n\n for (const field of dataFrame.fields) {\n if (field.name === '@xrayTraceId' && tracingDatasourceUid) {\n getRegion(replace(curTarget.region ?? '', 'region'));\n const xrayLink = await createInternalXrayLink(tracingDatasourceUid, interpolatedRegion);\n if (xrayLink) {\n field.config.links = [xrayLink];\n }\n }\n }\n\n // add a link to the cloudwatch console as a separate field that will be displayed as a link\n if (dataFrame.fields.length) {\n dataFrame.fields.push({\n name: '',\n type: FieldType.string,\n values: dataFrame.fields[0]?.values?.length\n ? new Array(dataFrame.fields[0].values.length).fill('View this query in CloudWatch console')\n : [],\n config: {\n links: [createAwsConsoleLink(curTarget, request.range, interpolatedRegion, replace, getVariableValue)],\n },\n });\n }\n }\n}\n\nasync function createInternalXrayLink(datasourceUid: string, region: string): Promise<DataLink | undefined> {\n let ds;\n try {\n ds = await getDataSourceSrv().get(datasourceUid);\n } catch (e) {\n console.error('Could not load linked xray data source, it was probably deleted after it was linked', e);\n return undefined;\n }\n\n return {\n title: ds.name,\n url: '',\n internal: {\n query: { query: '${__value.raw}', queryType: 'getTrace', region: region },\n datasourceUid: datasourceUid,\n datasourceName: ds.name,\n },\n };\n}\n\nfunction createAwsConsoleLink(\n target: CloudWatchLogsQuery,\n range: TimeRange,\n region: string,\n replace: (target: string, fieldName?: string) => string,\n getVariableValue: (value: string) => string[]\n) {\n const arns = (target.logGroups ?? [])\n .filter((group) => group?.arn)\n .map((group) => (group.arn ?? '').replace(/:\\*$/, '')); // remove `:*` from end of arn\n const logGroupNames = target.logGroupNames ?? [];\n const sources = arns?.length ? arns : logGroupNames;\n const interpolatedExpression = target.expression ? replace(target.expression) : '';\n const interpolatedGroups = sources?.flatMap(getVariableValue);\n\n const urlProps: AwsUrl = {\n end: range.to.toISOString(),\n start: range.from.toISOString(),\n timeType: 'ABSOLUTE',\n tz: 'UTC',\n editorString: interpolatedExpression,\n isLiveTail: false,\n source: interpolatedGroups,\n };\n\n const encodedUrl = encodeUrl(urlProps, region);\n return {\n url: encodedUrl,\n title: 'View in CloudWatch console',\n targetBlank: true,\n };\n}\n","import { Observable, Subscription } from 'rxjs';\n\nimport { DataFrame, DataFrameJSON, DataQueryError, DataQueryResponse } from '@grafana/data';\nimport { FetchError } from '@grafana/runtime';\n\nimport { StartQueryRequest } from '../types';\n\ntype Result = { frames: DataFrameJSON[]; error?: string };\n\n/**\n * A retry strategy specifically for cloud watch logs query. Cloud watch logs queries need first starting the query\n * and the polling for the results. The start query can fail because of the concurrent queries rate limit,\n * and so we have to retry the start query call if there is already lot of queries running.\n *\n * As we send multiple queries in a single request some can fail and some can succeed and we have to also handle those\n * cases by only retrying the failed queries. We retry the failed queries until we hit the time limit or all queries\n * succeed and only then we pass the data forward. This means we wait longer but makes the code a bit simpler as we\n * can treat starting the query and polling as steps in a pipeline.\n * @param queryFun\n * @param targets\n * @param options\n */\nexport function runWithRetry(\n queryFun: (targets: StartQueryRequest[]) => Observable<DataQueryResponse>,\n targets: StartQueryRequest[],\n timeoutFunc: (retry: number, startTime: number) => boolean\n): Observable<DataQueryResponse> {\n const startTime = new Date();\n let retries = 0;\n let timerID: ReturnType<typeof setTimeout>;\n let subscription: Subscription;\n let collected: { data: DataFrame[]; errors: DataQueryError[] } = { data: [], errors: [] };\n // This function is used to calculate the time to wait before retrying the query.\n const retryWaitFunction = (retry: number) => {\n return Math.pow(2, retry) * 1000 + Math.random() * 100;\n };\n\n return new Observable((observer) => {\n // Run function is where the logic takes place. We have it in a function so we can call it recursively.\n function run(currentQueryParams: StartQueryRequest[]) {\n subscription = queryFun(currentQueryParams).subscribe({\n next(response: DataQueryResponse) {\n if (response.errors) {\n const { refIdsForRequestsToRetry, errorsNotToRetry } = splitErrorsData(response.errors);\n if (refIdsForRequestsToRetry.length > 0) {\n if (!timeoutFunc(retries, startTime.valueOf())) {\n // store the responses we are not retrying\n collected.data = [...collected.data, ...response.data];\n collected.errors = [...collected.errors, ...errorsNotToRetry];\n\n // We retry only the failed queries\n timerID = setTimeout(\n () => {\n retries++;\n run(currentQueryParams.filter((query) => refIdsForRequestsToRetry.includes(query.refId)));\n },\n // We want to know how long to wait for the next retry. First time this will be 0.\n retryWaitFunction(retries + 1)\n );\n\n // we return early. The observer.next will be called whenever the timeout finisies or there are no errors.\n return;\n }\n }\n }\n\n // if the timeout is done or it was never called we take what we have from past retries and the current round\n collected.data = [...collected.data, ...response.data];\n collected.errors = [\n ...collected.errors,\n ...(response.errors && response.errors.length > 0 ? response.errors : []),\n ];\n observer.next(collected);\n observer.complete();\n },\n // if the server returns a raw string 5xx error, something is very unexpectedly wrong and we just forward it\n error(error: FetchError<{ results?: Record<string, Result> }> | string) {\n observer.error(error);\n },\n });\n }\n\n run(targets);\n return () => {\n // We clear only the latest timer and subscription but the observable should complete after one response so\n // there should not be more things running at the same time.\n clearTimeout(timerID);\n subscription.unsubscribe();\n };\n });\n}\n\nfunction splitErrorsData(errors: DataQueryError[]) {\n const refIdsForRequestsToRetry: string[] = [];\n const errorsNotToRetry: DataQueryError[] = [];\n errors.map((err) => {\n if (\n err?.refId &&\n (err.message?.includes('LimitExceededException') || err.message?.includes('ThrottlingException'))\n ) {\n refIdsForRequestsToRetry.push(err.refId);\n } else {\n errorsNotToRetry.push(err);\n }\n });\n return { refIdsForRequestsToRetry, errorsNotToRetry };\n}\n","import { SchedulerLike, Observable, SchedulerAction, Subscriber, asyncScheduler } from 'rxjs';\n\n/**\n * Creates an Observable that emits sequential numbers after increasing intervals of time\n * starting with `startPeriod`, ending with `endPeriod` and incrementing by `step`.\n */\nexport const increasingInterval = (\n { startPeriod = 0, endPeriod = 5000, step = 1000 },\n scheduler: SchedulerLike = asyncScheduler\n): Observable<number> => {\n return new Observable<number>((subscriber) => {\n const state: IntervalState = {\n subscriber,\n counter: 0,\n period: startPeriod,\n step,\n endPeriod,\n };\n\n subscriber.add(scheduler.schedule(dispatch, startPeriod, state));\n return subscriber;\n });\n};\n\nfunction dispatch(this: SchedulerAction<IntervalState>, state?: IntervalState) {\n if (!state) {\n return;\n }\n const { subscriber, counter, period, step, endPeriod } = state;\n subscriber.next(counter);\n const newPeriod = Math.min(period + step, endPeriod);\n this.schedule({ subscriber, counter: counter + 1, period: newPeriod, step, endPeriod }, newPeriod);\n}\n\ninterface IntervalState {\n subscriber: Subscriber<number>;\n counter: number;\n period: number;\n endPeriod: number;\n step: number;\n}\n","import { set, uniq } from 'lodash';\nimport {\n concatMap,\n finalize,\n from,\n lastValueFrom,\n map,\n mergeMap,\n Observable,\n of,\n repeat,\n scan,\n share,\n takeWhile,\n tap,\n zip,\n} from 'rxjs';\n\nimport {\n DataFrame,\n DataQueryError,\n DataQueryErrorType,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n Field,\n FieldType,\n LoadingState,\n LogRowContextOptions,\n LogRowContextQueryDirection,\n LogRowModel,\n ScopedVars,\n getDefaultTimeRange,\n rangeUtil,\n} from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { type CustomFormatterVariable } from '@grafana/scenes';\nimport { GraphDrawStyle } from '@grafana/schema/dist/esm/index';\nimport { TableCellDisplayMode } from '@grafana/ui';\n\nimport {\n CloudWatchJsonData,\n CloudWatchLogsAnomaliesQuery,\n CloudWatchLogsQuery,\n CloudWatchLogsQueryStatus,\n CloudWatchLogsRequest,\n CloudWatchQuery,\n GetLogEventsRequest,\n LogAction,\n LogsMode,\n LogsQueryLanguage,\n QueryParam,\n StartQueryRequest,\n} from '../types';\nimport { addDataLinksToLogsResponse } from '../utils/datalinks';\nimport { runWithRetry } from '../utils/logsRetry';\nimport { increasingInterval } from '../utils/rxjs/increasingInterval';\nimport { interpolateStringArrayUsingSingleOrMultiValuedVariable } from '../utils/templateVariableUtils';\n\nimport { CloudWatchRequest } from './CloudWatchRequest';\n\nexport const LOG_IDENTIFIER_INTERNAL = '__log__grafana_internal__';\nexport const LOGSTREAM_IDENTIFIER_INTERNAL = '__logstream__grafana_internal__';\n\n// This class handles execution of CloudWatch logs query data queries\nexport class CloudWatchLogsQueryRunner extends CloudWatchRequest {\n logsTimeout: string;\n logQueries: Record<string, { id: string; region: string; statsQuery: boolean }> = {};\n tracingDataSourceUid?: string;\n\n constructor(instanceSettings: DataSourceInstanceSettings<CloudWatchJsonData>, templateSrv: TemplateSrv) {\n super(instanceSettings, templateSrv);\n\n this.tracingDataSourceUid = instanceSettings.jsonData.tracingDatasourceUid;\n this.logsTimeout = instanceSettings.jsonData.logsTimeout || '30m';\n }\n\n // only public so that it is easy to mock out in tests\n public createTimeoutFn = () => {\n const startTime = new Date();\n return () => {\n return Date.now() >= startTime.valueOf() + rangeUtil.intervalToMs(this.logsTimeout);\n };\n };\n\n /**\n * Where all frontend log queries start. Log Queries are started and then we poll for the results.\n * There is a timeout set in the ds configuration that will stop the query if it takes too long.\n * We automatically retry logs queries that hit rate limits from aws.\n * @param logQueries the raw log queries as created by the user\n * @param options the full raw query request which might contain other queries\n * @param queryFn the inherited query function from the datasource that calls /query endpoint\n */\n public handleLogQueries = (\n logQueries: CloudWatchLogsQuery[],\n options: DataQueryRequest<CloudWatchQuery>,\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>\n ): Observable<DataQueryResponse> => {\n const validLogQueries = logQueries.filter(this.filterQuery);\n\n const startQueryRequests: StartQueryRequest[] = validLogQueries.map((target: CloudWatchLogsQuery) => {\n const { expression, logGroups, logGroupNames } = this.interpolateLogsQueryVariables(target, options.scopedVars);\n return {\n refId: target.refId,\n region: this.templateSrv.replace(this.getActualRegion(target.region)),\n queryString: expression ?? '',\n logGroups,\n logGroupNames,\n queryLanguage: target.queryLanguage,\n logsMode: target.logsMode ?? LogsMode.Insights,\n };\n });\n\n const timeoutFunc = this.createTimeoutFn();\n\n // run with retry will retry any failed start queries due to rate limiting\n return runWithRetry(\n (targets) => this.makeLogActionRequest('StartQuery', targets, queryFn, options),\n startQueryRequests,\n timeoutFunc\n ).pipe(\n // once we've started the query, we need to poll for the results\n mergeMap((startQueryResponse) => {\n return this.getQueryResults({ logQueries, timeoutFunc, queryFn, startQueryResponse });\n }),\n // once we get the results, we add data links to the logs\n mergeMap((dataQueryResponse) => {\n return from(\n (async () => {\n await addDataLinksToLogsResponse(\n dataQueryResponse,\n options,\n this.replaceVariableAndDisplayWarningIfMulti.bind(this),\n this.expandVariableToArray.bind(this),\n this.getActualRegion.bind(this),\n this.tracingDataSourceUid\n );\n\n return dataQueryResponse;\n })()\n );\n })\n );\n };\n\n public handleLogAnomaliesQueries = (\n logAnomaliesQueries: CloudWatchLogsAnomaliesQuery[],\n options: DataQueryRequest<CloudWatchQuery>,\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>\n ): Observable<DataQueryResponse> => {\n const logAnomalyTargets: StartQueryRequest[] = logAnomaliesQueries.map((target: CloudWatchLogsAnomaliesQuery) => {\n return {\n refId: target.refId,\n region: this.templateSrv.replace(this.getActualRegion(target.region)),\n queryString: '',\n logGroups: [],\n logsMode: LogsMode.Anomalies,\n suppressionState: target.suppressionState || 'all',\n anomalyDetectionARN: target.anomalyDetectionARN || '',\n };\n });\n\n const range = options?.range || getDefaultTimeRange();\n // append -logsAnomalies to prevent requestId from matching metric or logs queries from the same panel\n const requestId = options?.requestId ? `${options?.requestId}-logsAnomalies` : '';\n\n const requestParams: DataQueryRequest<CloudWatchLogsAnomaliesQuery> = {\n ...options,\n range,\n skipQueryCache: true,\n requestId,\n interval: options?.interval || '', // dummy\n intervalMs: options?.intervalMs || 1, // dummy\n scopedVars: options?.scopedVars || {}, // dummy\n timezone: options?.timezone || '', // dummy\n app: options?.app || '', // dummy\n startTime: options?.startTime || 0, // dummy\n targets: logAnomalyTargets.map((t) => ({\n ...t,\n id: '',\n queryMode: 'Logs',\n refId: t.refId || 'A',\n intervalMs: 1, // dummy\n maxDataPoints: 1, // dummy\n datasource: this.ref,\n type: 'logAction',\n logsMode: LogsMode.Anomalies,\n })),\n };\n\n return queryFn(requestParams).pipe(\n mergeMap((dataQueryResponse) => {\n return from(\n (async () => {\n convertTrendHistogramToSparkline(dataQueryResponse);\n return dataQueryResponse;\n })()\n );\n })\n );\n };\n\n /**\n * Called by datasource.ts, invoked when user clicks on a log row in the logs visualization and the \"show context button\"\n */\n public getLogRowContext = async (\n row: LogRowModel,\n { limit = 10, direction = LogRowContextQueryDirection.Backward }: LogRowContextOptions = {},\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>,\n query?: CloudWatchLogsQuery\n ) => {\n let logStreamField = null;\n let logField = null;\n\n for (const field of row.dataFrame.fields) {\n if (field.name === LOGSTREAM_IDENTIFIER_INTERNAL) {\n logStreamField = field;\n if (logField !== null) {\n break;\n }\n } else if (field.name === LOG_IDENTIFIER_INTERNAL) {\n logField = field;\n if (logStreamField !== null) {\n break;\n }\n }\n }\n\n const requestParams: GetLogEventsRequest = {\n refId: query?.refId || 'A', // dummy\n limit,\n startFromHead: direction !== LogRowContextQueryDirection.Backward,\n region: this.templateSrv.replace(this.getActualRegion(query?.region)),\n logGroupName: parseLogGroupName(logField!.values[row.rowIndex]),\n logStreamName: logStreamField!.values[row.rowIndex],\n };\n\n if (direction === LogRowContextQueryDirection.Backward) {\n requestParams.endTime = row.timeEpochMs;\n } else {\n requestParams.startTime = row.timeEpochMs;\n }\n\n return await lastValueFrom(this.makeLogActionRequest('GetLogEvents', [requestParams], queryFn));\n };\n\n interpolateLogsQueryVariables(\n query: CloudWatchLogsQuery,\n scopedVars: ScopedVars\n ): Pick<CloudWatchLogsQuery, 'expression' | 'logGroups' | 'logGroupNames'> {\n const interpolatedLogGroupArns = interpolateStringArrayUsingSingleOrMultiValuedVariable(\n this.templateSrv,\n (query.logGroups || this.instanceSettings.jsonData.logGroups || []).map((lg) => lg.arn),\n scopedVars\n );\n\n // need to support legacy format variables too\n const interpolatedLogGroupNames = interpolateStringArrayUsingSingleOrMultiValuedVariable(\n this.templateSrv,\n query.logGroupNames || this.instanceSettings.jsonData.defaultLogGroups || [],\n scopedVars,\n 'text'\n );\n\n // if a log group template variable expands to log group that has already been selected in the log group picker, we need to remove duplicates.\n // Otherwise the StartLogQuery API will return a permission error\n const logGroups = uniq(interpolatedLogGroupArns).map((arn) => ({ arn, name: arn }));\n const logGroupNames = uniq(interpolatedLogGroupNames);\n\n const logsSQLCustomerFormatter = (value: unknown, model: Partial<CustomFormatterVariable>) => {\n if (\n (typeof value === 'string' && value.startsWith('arn:') && value.endsWith(':*')) ||\n (Array.isArray(value) && value.every((v) => typeof v === 'string' && v.startsWith('arn:') && v.endsWith(':*')))\n ) {\n const varName = model.name || '';\n const variable = this.templateSrv.getVariables().find(({ name }) => name === varName);\n // checks the raw query string for a log group template variable that occurs inside `logGroups(logGroupIdentifier:[ ... ])\\`\n // to later surround the log group names with backticks\n // this assumes there's only a single template variable used inside the [ ]\n const shouldSurroundInQuotes = query.expression\n ?.replaceAll(/[\\r\\n\\t\\s]+/g, '')\n .includes(`\\`logGroups(logGroupIdentifier:[$${varName}])\\``);\n if (variable && 'current' in variable && 'text' in variable.current) {\n if (Array.isArray(variable.current.text)) {\n return variable.current.text.map((v) => (shouldSurroundInQuotes ? `'${v}'` : v)).join(',');\n }\n return shouldSurroundInQuotes ? `'${variable.current.text}'` : variable.current.text;\n }\n }\n\n return value;\n };\n const formatter = query.queryLanguage === LogsQueryLanguage.SQL ? logsSQLCustomerFormatter : undefined;\n const expression = this.templateSrv.replace(query.expression || '', scopedVars, formatter);\n\n return {\n logGroups,\n logGroupNames,\n expression,\n };\n }\n\n /**\n * Check if an already started query is complete and returns results if it is. Otherwise it will start polling for results.\n */\n private getQueryResults = ({\n logQueries,\n timeoutFunc,\n queryFn,\n startQueryResponse,\n }: {\n logQueries: CloudWatchLogsQuery[];\n timeoutFunc: () => boolean;\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>;\n startQueryResponse: DataQueryResponse;\n }) => {\n if (\n startQueryResponse.data.every((frame) =>\n [\n CloudWatchLogsQueryStatus.Complete,\n CloudWatchLogsQueryStatus.Cancelled,\n CloudWatchLogsQueryStatus.Failed,\n ].includes(frame.meta?.custom?.['Status'])\n )\n ) {\n return of({\n key: 'test-key',\n state: LoadingState.Done,\n ...startQueryResponse,\n });\n }\n\n return this.pollForLogQueryResults(\n startQueryResponse.data.map((dataFrame) => ({\n queryId: dataFrame.fields[0].values[0],\n region: dataFrame.meta?.custom?.['Region'] ?? 'default',\n refId: dataFrame.refId!,\n statsGroups: logQueries.find((target) => target.refId === dataFrame.refId)?.statsGroups,\n })),\n timeoutFunc,\n queryFn,\n startQueryResponse.errors || []\n );\n };\n\n /**\n * Checks progress and polls data of a started logs query with some retry logic.\n * @param queryParams\n */\n private pollForLogQueryResults(\n queryParams: QueryParam[],\n timeoutFunc: () => boolean,\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>,\n errorsFromStartQuery: DataQueryError[]\n ): Observable<DataQueryResponse> {\n this.logQueries = {};\n queryParams.forEach((param) => {\n this.logQueries[param.refId] = {\n id: param.queryId,\n region: param.region,\n statsQuery: (param.statsGroups?.length ?? 0) > 0,\n };\n });\n\n const responses = increasingInterval({ startPeriod: 100, endPeriod: 1000, step: 300 }).pipe(\n concatMap((_) => this.makeLogActionRequest('GetQueryResults', queryParams, queryFn)),\n repeat(),\n share()\n );\n\n let errorsFromGetQuery: DataQueryError[] = [];\n const dataFrames: Observable<DataFrame[]> = responses.pipe(\n map((response) => {\n // TODO: it's not entirely clear to me why but this map gets called twice, but the responses are the same\n // I think it has something to do with lingering subscriptions being opened, it feels like a bug here.\n // In an ideal world we'd push the errors to an array, not reset it\n if (response.errors) {\n errorsFromGetQuery = response.errors;\n }\n return response.data;\n })\n );\n\n const initialValue: { failures: number; prevRecordsMatched: Record<string, number> } = {\n failures: 0,\n prevRecordsMatched: {},\n };\n\n const consecutiveFailedAttempts = dataFrames.pipe(\n scan(({ failures, prevRecordsMatched }, frames) => {\n failures++;\n for (const frame of frames) {\n const recordsMatched = frame.meta?.stats?.find((stat) => stat.displayName === 'Records scanned')?.value!;\n if (recordsMatched > (prevRecordsMatched[frame.refId!] ?? 0)) {\n failures = 0;\n }\n prevRecordsMatched[frame.refId!] = recordsMatched;\n }\n\n return { failures, prevRecordsMatched };\n }, initialValue),\n map(({ failures }) => failures),\n share()\n );\n\n const queryResponse: Observable<DataQueryResponse> = zip(dataFrames, consecutiveFailedAttempts).pipe(\n tap(([dataFrames]) => {\n for (const frame of dataFrames) {\n if (\n [\n CloudWatchLogsQueryStatus.Complete,\n CloudWatchLogsQueryStatus.Cancelled,\n CloudWatchLogsQueryStatus.Failed,\n ].includes(frame.meta?.custom?.['Status']) &&\n this.logQueries.hasOwnProperty(frame.refId!)\n ) {\n delete this.logQueries[frame.refId!];\n }\n }\n }),\n map(([dataFrames, failedAttempts]) => {\n // if we've timed out, we set a status of cancel which will stop the query from being retried again in getQueryResults\n const errors = [...errorsFromStartQuery, ...errorsFromGetQuery];\n if (timeoutFunc()) {\n for (const frame of dataFrames) {\n set(frame, 'meta.custom.Status', CloudWatchLogsQueryStatus.Cancelled);\n errors.push({\n message: `Error: Query hit timeout before completing after ${failedAttempts} attempts, partial results may be shown. To increase the timeout window update your datasource configuration.`,\n type: DataQueryErrorType.Timeout,\n refId: frame.refId,\n });\n }\n }\n\n return {\n data: dataFrames,\n key: 'test-key',\n state: dataFrames.every((dataFrame) =>\n [\n CloudWatchLogsQueryStatus.Complete,\n CloudWatchLogsQueryStatus.Cancelled,\n CloudWatchLogsQueryStatus.Failed,\n ].includes(dataFrame.meta?.custom?.['Status'])\n )\n ? LoadingState.Done\n : LoadingState.Loading,\n errors: errors,\n };\n }),\n takeWhile(({ state }) => state !== LoadingState.Error && state !== LoadingState.Done, true)\n );\n\n return withTeardown(queryResponse, () => this.stopQueries(queryFn));\n }\n\n private stopQueries(queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>) {\n if (Object.keys(this.logQueries).length > 0) {\n this.makeLogActionRequest(\n 'StopQuery',\n Object.values(this.logQueries).map((logQuery) => ({\n queryId: logQuery.id,\n region: logQuery.region,\n queryString: '',\n refId: '',\n })),\n queryFn\n ).pipe(\n finalize(() => {\n this.logQueries = {};\n })\n );\n }\n }\n\n private makeLogActionRequest(\n subtype: LogAction,\n queryParams: CloudWatchLogsRequest[],\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>,\n options?: DataQueryRequest<CloudWatchQuery>\n ): Observable<DataQueryResponse> {\n const range = options?.range || getDefaultTimeRange();\n // append -logs to prevent requestId from matching metric queries from the same panel\n const requestId = options?.requestId ? `${options?.requestId}-logs` : '';\n\n const requestParams: DataQueryRequest<CloudWatchLogsQuery> = {\n ...options,\n range,\n skipQueryCache: true,\n requestId,\n interval: options?.interval || '', // dummy\n intervalMs: options?.intervalMs || 1, // dummy\n scopedVars: options?.scopedVars || {}, // dummy\n timezone: options?.timezone || '', // dummy\n app: options?.app || '', // dummy\n startTime: options?.startTime || 0, // dummy\n targets: queryParams.map((param) => ({\n ...param,\n id: '',\n queryMode: 'Logs',\n refId: param.refId || 'A',\n intervalMs: 1, // dummy\n maxDataPoints: 1, // dummy\n datasource: this.ref,\n type: 'logAction',\n subtype: subtype,\n })),\n };\n\n return queryFn(requestParams);\n }\n\n private filterQuery(query: CloudWatchLogsQuery) {\n const hasMissingLegacyLogGroupNames = !query.logGroupNames?.length;\n const hasMissingLogGroups = !query.logGroups?.length;\n const hasMissingQueryString = !query.expression?.length;\n\n // log groups are not mandatory if language is SQL and LogsMode is not Insights\n const isInvalidCWLIQuery = query.queryLanguage !== 'SQL' && hasMissingLogGroups && hasMissingLegacyLogGroupNames;\n if (isInvalidCWLIQuery || hasMissingQueryString) {\n return false;\n }\n\n return true;\n }\n}\n\nfunction withTeardown<T = DataQueryResponse>(observable: Observable<T>, onUnsubscribe: () => void): Observable<T> {\n return new Observable<T>((subscriber) => {\n const innerSub = observable.subscribe({\n next: (val) => subscriber.next(val),\n error: (err) => subscriber.next(err),\n complete: () => subscriber.complete(),\n });\n\n return () => {\n innerSub.unsubscribe();\n onUnsubscribe();\n };\n });\n}\n\nfunction parseLogGroupName(logIdentifier: string): string {\n const colonIndex = logIdentifier.lastIndexOf(':');\n return logIdentifier.slice(colonIndex + 1);\n}\n\nconst LOG_TREND_FIELD_NAME = 'logTrend';\n\n/**\n * Takes DataQueryResponse and converts any \"log trend\" fields (that are in JSON.rawMessage form)\n * into data frame fields that the table vis will be able to display\n */\nexport function convertTrendHistogramToSparkline(dataQueryResponse: DataQueryResponse): void {\n dataQueryResponse.data.forEach((frame) => {\n let fieldIndexToReplace = null;\n // log trend histogram field from CW API is of shape Record<timestamp as string, value>\n const sparklineRawData: Field<Record<string, number>> = frame.fields.find((field: Field, index: number) => {\n if (field.name === LOG_TREND_FIELD_NAME && field.type === FieldType.other) {\n fieldIndexToReplace = index;\n return true;\n }\n return false;\n });\n\n if (sparklineRawData) {\n const sparklineField: Field = {\n name: 'Log trend',\n type: FieldType.frame,\n config: {\n custom: {\n drawStyle: GraphDrawStyle.Bars,\n cellOptions: {\n type: TableCellDisplayMode.Sparkline,\n // hiding the value here as it's not useful or clear on what it represents for log trend\n hideValue: true,\n },\n },\n },\n values: [],\n };\n\n sparklineRawData.values.forEach((sparklineValue, rowIndex) => {\n const timestamps: number[] = [];\n const values: number[] = [];\n Object.keys(sparklineValue).map((t, i) => {\n let n = Number(t);\n if (!isNaN(n)) {\n timestamps.push(n);\n values.push(sparklineValue[t]);\n }\n });\n\n const sparklineFieldFrame: DataFrame = {\n name: `Trend_row_${rowIndex}`,\n length: timestamps.length,\n fields: [\n { name: 'time', type: FieldType.time, values: timestamps, config: {} },\n { name: 'value', type: FieldType.number, values, config: {} },\n ],\n };\n\n sparklineField.values.push(sparklineFieldFrame);\n });\n\n if (fieldIndexToReplace) {\n // Make sure sparkline field is placed in the same order as coming from BE\n frame.fields[fieldIndexToReplace] = sparklineField;\n }\n }\n });\n}\n","import { TextLink } from '@grafana/ui';\n\nexport interface Props {\n region: string;\n}\n\nexport const ThrottlingErrorMessage = ({ region }: Props) => (\n <p>\n Please visit the \n <TextLink\n external\n href={`https://${region}.console.aws.amazon.com/servicequotas/home?region=${region}#!/services/monitoring/quotas/L-5E141212`}\n >\n AWS Service Quotas console\n </TextLink>\n to request a quota increase or see our \n <TextLink external href=\"https://grafana.com/docs/grafana/latest/datasources/cloudwatch/#manage-service-quotas\">\n documentation\n </TextLink>\n to learn more.\n </p>\n);\n","import { isEmpty } from 'lodash';\nimport { createElement } from 'react';\nimport { catchError, map, Observable, of } from 'rxjs';\n\nimport {\n AppEvents,\n DataFrame,\n DataQueryError,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n dateTimeFormat,\n FieldType,\n rangeUtil,\n ScopedVars,\n} from '@grafana/data';\nimport { TemplateSrv, getAppEvents } from '@grafana/runtime';\n\nimport { ThrottlingErrorMessage } from '../components/Errors/ThrottlingErrorMessage';\nimport memoizedDebounce from '../memoizedDebounce';\nimport { migrateMetricQuery } from '../migrations/metricQueryMigrations';\nimport { CloudWatchJsonData, CloudWatchMetricsQuery, CloudWatchQuery } from '../types';\nimport { filterMetricsQuery } from '../utils/utils';\n\nimport { CloudWatchRequest } from './CloudWatchRequest';\n\nconst getThrottlingErrorMessage = (region: string, message: string) =>\n `Please visit the AWS Service Quotas console at https://${region}.console.aws.amazon.com/servicequotas/home?region=${region}#!/services/monitoring/quotas/L-5E141212 to request a quota increase or see our documentation at https://grafana.com/docs/grafana/latest/datasources/cloudwatch/#manage-service-quotas to learn more. ${message}`;\n\nconst displayAlert = (datasourceName: string, region: string) =>\n getAppEvents().publish({\n type: AppEvents.alertError.name,\n payload: [\n `CloudWatch request limit reached in ${region} for data source ${datasourceName}`,\n '',\n undefined,\n createElement(ThrottlingErrorMessage, { region }, null),\n ],\n });\n\n// This class handles execution of CloudWatch metrics query data queries\nexport class CloudWatchMetricsQueryRunner extends CloudWatchRequest {\n debouncedThrottlingAlert: (datasourceName: string, region: string) => void = memoizedDebounce(displayAlert);\n\n constructor(instanceSettings: DataSourceInstanceSettings<CloudWatchJsonData>, templateSrv: TemplateSrv) {\n super(instanceSettings, templateSrv);\n }\n\n handleMetricQueries = (\n metricQueries: CloudWatchMetricsQuery[],\n options: DataQueryRequest<CloudWatchQuery>,\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>\n ): Observable<DataQueryResponse> => {\n const timezoneUTCOffset = dateTimeFormat(Date.now(), {\n timeZone: options.timezone,\n format: 'Z',\n }).replace(':', '');\n\n const validMetricsQueries = metricQueries.filter(this.filterMetricQuery).map((q) => {\n const migratedQuery = migrateMetricQuery(q);\n const migratedAndIterpolatedQuery = this.replaceMetricQueryVars(migratedQuery, options.scopedVars);\n\n return {\n timezoneUTCOffset,\n intervalMs: options.intervalMs,\n maxDataPoints: options.maxDataPoints,\n ...migratedAndIterpolatedQuery,\n type: 'timeSeriesQuery',\n datasource: this.ref,\n };\n });\n\n // No valid targets, return the empty result to save a round trip.\n if (isEmpty(validMetricsQueries)) {\n return of({ data: [] });\n }\n\n const request: DataQueryRequest<CloudWatchQuery> = {\n ...options,\n requestId: options.requestId + '-metrics', // adding -metrics to prevent requestId from matching logs queries sent from the same panel\n targets: validMetricsQueries,\n };\n\n return this.performTimeSeriesQuery(request, queryFn);\n };\n\n interpolateMetricsQueryVariables(\n query: CloudWatchMetricsQuery,\n scopedVars: ScopedVars\n ): Pick<\n CloudWatchMetricsQuery,\n 'alias' | 'metricName' | 'namespace' | 'period' | 'dimensions' | 'sqlExpression' | 'expression'\n > {\n return {\n alias: this.replaceVariableAndDisplayWarningIfMulti(query.alias, scopedVars),\n metricName: this.replaceVariableAndDisplayWarningIfMulti(query.metricName, scopedVars),\n namespace: this.replaceVariableAndDisplayWarningIfMulti(query.namespace, scopedVars),\n period: this.replaceVariableAndDisplayWarningIfMulti(query.period, scopedVars),\n expression: this.templateSrv.replace(query.expression, scopedVars),\n sqlExpression: this.replaceVariableAndDisplayWarningIfMulti(query.sqlExpression, scopedVars),\n dimensions: this.convertDimensionFormat(query.dimensions ?? {}, scopedVars),\n };\n }\n\n performTimeSeriesQuery(\n request: DataQueryRequest<CloudWatchQuery>,\n queryFn: (request: DataQueryRequest<CloudWatchQuery>) => Observable<DataQueryResponse>\n ): Observable<DataQueryResponse> {\n return queryFn(request).pipe(\n map((res) => {\n const dataframes: DataFrame[] = res.data || [];\n\n dataframes.forEach((frame) => {\n frame.fields.forEach((field) => {\n if (field.type === FieldType.time) {\n // field.config.interval is populated in order for Grafana to fill in null values at frame intervals\n field.config.interval = frame.meta?.custom?.period * 1000;\n }\n });\n });\n\n if (res.errors?.length) {\n this.alertOnThrottlingErrors(res.errors, request);\n }\n\n return {\n data: dataframes,\n // DataSourceWithBackend will not throw an error, instead it will return \"errors\" field along with the response\n errors: this.enrichThrottlingErrorMessages(request, res.errors),\n };\n }),\n catchError((err: unknown) => {\n if (Array.isArray(err)) {\n return of({ data: [], errors: err });\n } else {\n return of({ data: [], errors: [{ message: err }] });\n }\n })\n );\n }\n\n enrichThrottlingErrorMessages(request: DataQueryRequest<CloudWatchQuery>, errors?: DataQueryError[]) {\n if (!errors || errors.length === 0) {\n return errors;\n }\n const result: DataQueryError[] = [];\n errors.forEach((error) => {\n if (error.message && (/^Throttling:.*/.test(error.message) || /^Rate exceeded.*/.test(error.message))) {\n const region = this.getActualRegion(request.targets.find((target) => target.refId === error.refId)?.region);\n result.push({ ...error, message: getThrottlingErrorMessage(region, error.message) });\n } else {\n result.push(error);\n }\n });\n return result;\n }\n\n alertOnThrottlingErrors(errors: DataQueryError[], request: DataQueryRequest<CloudWatchQuery>) {\n const hasThrottlingError = errors.some(\n (err) => err.message && (/^Throttling:.*/.test(err.message) || /^Rate exceeded.*/.test(err.message))\n );\n if (hasThrottlingError) {\n const failedRefIds = errors.map((error) => error.refId).filter((refId) => refId);\n if (failedRefIds.length > 0) {\n const regionsAffected = Object.values(request.targets).reduce(\n (res: string[], { refId, region }) =>\n (refId && !failedRefIds.includes(refId)) || res.includes(region) ? res : [...res, region],\n []\n );\n regionsAffected.forEach((region) => {\n const actualRegion = this.getActualRegion(region);\n if (actualRegion) {\n this.debouncedThrottlingAlert(this.instanceSettings.name, actualRegion);\n }\n });\n }\n }\n }\n\n filterMetricQuery(query: CloudWatchMetricsQuery): boolean {\n return filterMetricsQuery(query);\n }\n\n replaceMetricQueryVars(query: CloudWatchMetricsQuery, scopedVars: ScopedVars): CloudWatchMetricsQuery {\n query.region = this.templateSrv.replace(this.getActualRegion(query.region), scopedVars);\n query.namespace = this.replaceVariableAndDisplayWarningIfMulti(query.namespace, scopedVars, true, 'namespace');\n query.metricName = this.replaceVariableAndDisplayWarningIfMulti(query.metricName, scopedVars, true, 'metric name');\n query.dimensions = this.convertDimensionFormat(query.dimensions ?? {}, scopedVars);\n query.statistic = this.templateSrv.replace(query.statistic, scopedVars);\n query.period = String(this.getPeriod(query, scopedVars)); // use string format for period in graph query, and alerting\n query.id = this.templateSrv.replace(query.id, scopedVars);\n query.expression = this.templateSrv.replace(query.expression, scopedVars);\n query.sqlExpression = this.templateSrv.replace(query.sqlExpression, scopedVars, 'raw');\n if (query.accountId) {\n query.accountId = this.templateSrv.replace(query.accountId, scopedVars);\n }\n\n return query;\n }\n\n getPeriod(target: CloudWatchMetricsQuery, scopedVars: ScopedVars) {\n let period = this.templateSrv.replace(target.period, scopedVars);\n if (period && period.toLowerCase() !== 'auto') {\n let p: number;\n if (/^\\d+$/.test(period)) {\n p = parseInt(period, 10);\n } else {\n p = rangeUtil.intervalToSeconds(period);\n }\n\n if (p < 1) {\n p = 1;\n }\n\n return String(p);\n }\n\n return period;\n }\n}\n","import { memoize } from 'lodash';\n\nimport { DataSourceInstanceSettings, SelectableValue } from '@grafana/data';\nimport { getBackendSrv, TemplateSrv } from '@grafana/runtime';\n\nimport { CloudWatchRequest } from '../query-runner/CloudWatchRequest';\nimport { CloudWatchJsonData, LogGroupField, MultiFilters } from '../types';\n\nimport {\n ResourceRequest,\n Account,\n ResourceResponse,\n DescribeLogGroupsRequest,\n LogGroupResponse,\n GetMetricsRequest,\n GetDimensionKeysRequest,\n GetDimensionValuesRequest,\n MetricResponse,\n SelectableResourceValue,\n RegionResponse,\n} from './types';\n\nexport class ResourcesAPI extends CloudWatchRequest {\n private memoizedGetRequest;\n\n constructor(instanceSettings: DataSourceInstanceSettings<CloudWatchJsonData>, templateSrv: TemplateSrv) {\n super(instanceSettings, templateSrv);\n this.memoizedGetRequest = memoize(this.getRequest.bind(this), (path, parameters) =>\n JSON.stringify({ path, parameters })\n );\n }\n\n private getRequest<T>(subtype: string, parameters?: Record<string, string | string[] | number>): Promise<T> {\n return getBackendSrv().get(`/api/datasources/${this.instanceSettings.id}/resources/${subtype}`, parameters);\n }\n\n async getExternalId(): Promise<string> {\n return await this.memoizedGetRequest<{ externalId: string }>('external-id').then(({ externalId }) => externalId);\n }\n\n getAccounts({ region }: ResourceRequest): Promise<Account[]> {\n return this.memoizedGetRequest<Array<ResourceResponse<Account>>>('accounts', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n }).then((accounts) => accounts.map((a) => a.value));\n }\n\n isMonitoringAccount(region: string): Promise<boolean> {\n return this.getAccounts({ region })\n .then((accounts) => accounts.some((account) => account.isMonitoringAccount))\n .catch(() => false);\n }\n\n getRegions(): Promise<SelectableResourceValue[]> {\n return this.memoizedGetRequest<Array<ResourceResponse<RegionResponse>>>('regions').then((regions) => {\n return [\n { label: 'default', value: 'default', text: 'default' },\n ...regions.map((r) => ({\n label: r.value.name,\n value: r.value.name,\n text: r.value.name,\n })),\n ].filter((r) => r.value);\n });\n }\n\n getNamespaces() {\n return this.memoizedGetRequest<Array<ResourceResponse<string>>>('namespaces').then((namespaces) =>\n namespaces.map((n) => ({ label: n.value, value: n.value }))\n );\n }\n\n getLogGroups(params: DescribeLogGroupsRequest): Promise<Array<ResourceResponse<LogGroupResponse>>> {\n return this.memoizedGetRequest<Array<ResourceResponse<LogGroupResponse>>>('log-groups', {\n ...params,\n region: this.templateSrv.replace(this.getActualRegion(params.region)),\n accountId: this.templateSrv.replace(params.accountId),\n listAllLogGroups: params.listAllLogGroups ? 'true' : 'false',\n });\n }\n\n getLogGroupFields(region: string, logGroupName: string): Promise<Array<ResourceResponse<LogGroupField>>> {\n return this.memoizedGetRequest<Array<ResourceResponse<LogGroupField>>>('log-group-fields', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n logGroupName: logGroupName,\n });\n }\n\n getMetrics({ region, namespace, accountId }: GetMetricsRequest): Promise<Array<SelectableValue<string>>> {\n if (!namespace) {\n return Promise.resolve([]);\n }\n\n return this.memoizedGetRequest<Array<ResourceResponse<MetricResponse>>>('metrics', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n namespace: this.templateSrv.replace(namespace),\n accountId: this.templateSrv.replace(accountId),\n }).then((metrics) => metrics.map((m) => ({ label: m.value.name, value: m.value.name })));\n }\n\n getAllMetrics({ region, accountId }: GetMetricsRequest): Promise<Array<{ metricName?: string; namespace: string }>> {\n return this.memoizedGetRequest<Array<ResourceResponse<MetricResponse>>>('metrics', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n accountId: this.templateSrv.replace(accountId),\n }).then((metrics) => metrics.map((m) => ({ metricName: m.value.name, namespace: m.value.namespace })));\n }\n\n getDimensionKeys(\n { region, namespace = '', dimensionFilters = {}, metricName = '', accountId }: GetDimensionKeysRequest,\n displayErrorIfIsMultiTemplateVariable?: boolean\n ): Promise<Array<SelectableValue<string>>> {\n return this.memoizedGetRequest<Array<ResourceResponse<string>>>('dimension-keys', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n namespace: this.templateSrv.replace(namespace),\n accountId: this.templateSrv.replace(accountId),\n metricName: this.templateSrv.replace(metricName),\n dimensionFilters: JSON.stringify(\n this.convertDimensionFormat(dimensionFilters, {}, displayErrorIfIsMultiTemplateVariable)\n ),\n }).then((r) => r.map((r) => ({ label: r.value, value: r.value })));\n }\n\n getDimensionValues({\n dimensionKey,\n region,\n namespace,\n dimensionFilters = {},\n metricName = '',\n accountId,\n }: GetDimensionValuesRequest) {\n if (!namespace || !metricName) {\n return Promise.resolve([]);\n }\n\n return this.memoizedGetRequest<Array<ResourceResponse<string>>>('dimension-values', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n namespace: this.templateSrv.replace(namespace),\n metricName: this.templateSrv.replace(metricName.trim()),\n dimensionKey: this.replaceVariableAndDisplayWarningIfMulti(dimensionKey, {}, true),\n dimensionFilters: JSON.stringify(this.convertDimensionFormat(dimensionFilters, {})),\n accountId: this.templateSrv.replace(accountId),\n }).then((r) => r.map((r) => ({ label: r.value, value: r.value })));\n }\n\n getEbsVolumeIds(region: string, instanceId: string) {\n return this.memoizedGetRequest<SelectableResourceValue[]>('ebs-volume-ids', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n instanceId: this.templateSrv.replace(instanceId),\n });\n }\n\n getEc2InstanceAttribute(region: string, attributeName: string, filters: MultiFilters) {\n return this.memoizedGetRequest<SelectableResourceValue[]>('ec2-instance-attribute', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n attributeName: this.templateSrv.replace(attributeName),\n filters: JSON.stringify(this.convertMultiFilterFormat(filters, 'filter key')),\n });\n }\n\n getResourceARNs(region: string, resourceType: string, tags: MultiFilters) {\n return this.memoizedGetRequest<SelectableResourceValue[]>('resource-arns', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n resourceType: this.templateSrv.replace(resourceType),\n tags: JSON.stringify(this.convertMultiFilterFormat(tags, 'tag name')),\n });\n }\n\n legacyDescribeLogGroups(region: string, logGroupNamePrefix?: string) {\n return this.memoizedGetRequest<SelectableResourceValue[]>('legacy-log-groups', {\n region: this.templateSrv.replace(this.getActualRegion(region)),\n logGroupNamePrefix: logGroupNamePrefix || '',\n });\n }\n}\n","import { omit } from 'lodash';\n\nimport { Dimensions, VariableQuery, VariableQueryType, OldVariableQuery, MultiFilters } from '../types';\n\nconst jsonVariable = /\\${(\\w+):json}/g;\n\nfunction isVariableQuery(rawQuery: string | VariableQuery | OldVariableQuery): rawQuery is VariableQuery {\n return typeof rawQuery !== 'string' && typeof rawQuery.ec2Filters !== 'string' && typeof rawQuery.tags !== 'string';\n}\n\nfunction migrateMultiFilters(oldFilters: string): MultiFilters {\n const tempFilters = oldFilters.replace(jsonVariable, '\"$$$1\"');\n const parsedFilters: Dimensions = JSON.parse(tempFilters);\n const newFilters: MultiFilters = {};\n // if the old filter was {key:value} transform it to {key:[value]}\n Object.keys(parsedFilters).forEach((key) => {\n const value = parsedFilters[key];\n if (typeof value === 'string') {\n newFilters[key] = [value];\n } else if (value !== undefined) {\n newFilters[key] = value;\n }\n });\n return newFilters;\n}\n\nexport function migrateVariableQuery(rawQuery: string | VariableQuery | OldVariableQuery): VariableQuery {\n if (isVariableQuery(rawQuery)) {\n return rawQuery;\n }\n\n // rawQuery is OldVariableQuery\n if (typeof rawQuery !== 'string') {\n const newQuery: VariableQuery = omit(rawQuery, ['dimensionFilters', 'ec2Filters', 'tags']);\n newQuery.dimensionFilters = {};\n newQuery.ec2Filters = {};\n newQuery.tags = {};\n\n if (rawQuery.dimensionFilters !== '' && rawQuery.ec2Filters !== '[]') {\n const tempFilters = rawQuery.dimensionFilters.replace(jsonVariable, '\"$$$1\"');\n try {\n newQuery.dimensionFilters = JSON.parse(tempFilters);\n } catch {\n throw new Error(`unable to migrate poorly formed filters: ${rawQuery.dimensionFilters}`);\n }\n }\n if (rawQuery.ec2Filters !== '' && rawQuery.ec2Filters !== '[]') {\n try {\n newQuery.ec2Filters = migrateMultiFilters(rawQuery.ec2Filters);\n } catch {\n throw new Error(`unable to migrate poorly formed filters: ${rawQuery.ec2Filters}`);\n }\n }\n if (rawQuery.tags !== '' && rawQuery.tags !== '[]') {\n try {\n newQuery.tags = migrateMultiFilters(rawQuery.tags);\n } catch {\n throw new Error(`unable to migrate poorly formed filters: ${rawQuery.tags}`);\n }\n }\n return newQuery;\n }\n\n const newQuery: VariableQuery = {\n refId: 'CloudWatchVariableQueryEditor-VariableQuery',\n queryType: VariableQueryType.Regions,\n namespace: '',\n region: '',\n metricName: '',\n dimensionKey: '',\n dimensionFilters: {},\n ec2Filters: {},\n instanceID: '',\n attributeName: '',\n resourceType: '',\n tags: {},\n };\n\n if (rawQuery === '') {\n return newQuery;\n }\n\n if (rawQuery.match(/^regions\\(\\)/)) {\n return newQuery;\n }\n if (rawQuery.match(/^namespaces\\(\\)/)) {\n newQuery.queryType = VariableQueryType.Namespaces;\n return newQuery;\n }\n const metricNameQuery = rawQuery.match(/^metrics\\(([^\\)]+?)(,\\s?([^,]+?))?\\)/);\n if (metricNameQuery) {\n newQuery.queryType = VariableQueryType.Metrics;\n newQuery.namespace = metricNameQuery[1];\n newQuery.region = metricNameQuery[3] || '';\n return newQuery;\n }\n const dimensionKeysQuery = rawQuery.match(/^dimension_keys\\(([^\\)]+?)(,\\s?([^,]+?))?\\)/);\n if (dimensionKeysQuery) {\n newQuery.queryType = VariableQueryType.DimensionKeys;\n newQuery.namespace = dimensionKeysQuery[1];\n newQuery.region = dimensionKeysQuery[3] || '';\n return newQuery;\n }\n\n const dimensionValuesQuery = rawQuery.match(\n /^dimension_values\\(([^,]+?),\\s?([^,]+?),\\s?([^,]+?),\\s?([^,]+?)(,\\s?(.+))?\\)/\n );\n if (dimensionValuesQuery) {\n newQuery.queryType = VariableQueryType.DimensionValues;\n newQuery.region = dimensionValuesQuery[1];\n newQuery.namespace = dimensionValuesQuery[2];\n newQuery.metricName = dimensionValuesQuery[3];\n newQuery.dimensionKey = dimensionValuesQuery[4];\n newQuery.dimensionFilters = {};\n if (!!dimensionValuesQuery[6] && dimensionValuesQuery[6] !== '[]') {\n const tempFilters = dimensionValuesQuery[6].replace(jsonVariable, '\"$$$1\"');\n try {\n newQuery.dimensionFilters = JSON.parse(tempFilters);\n } catch {\n throw new Error(`unable to migrate poorly formed filters: ${dimensionValuesQuery[6]}`);\n }\n }\n return newQuery;\n }\n\n const ebsVolumeIdsQuery = rawQuery.match(/^ebs_volume_ids\\(([^,]+?),\\s?([^,]+?)\\)/);\n if (ebsVolumeIdsQuery) {\n newQuery.queryType = VariableQueryType.EBSVolumeIDs;\n newQuery.region = ebsVolumeIdsQuery[1];\n newQuery.instanceID = ebsVolumeIdsQuery[2];\n return newQuery;\n }\n\n const ec2InstanceAttributeQuery = rawQuery.match(/^ec2_instance_attribute\\(([^,]+?),\\s?([^,]+?),\\s?(.+?)\\)/);\n if (ec2InstanceAttributeQuery) {\n newQuery.queryType = VariableQueryType.EC2InstanceAttributes;\n newQuery.region = ec2InstanceAttributeQuery[1];\n newQuery.attributeName = ec2InstanceAttributeQuery[2];\n if (ec2InstanceAttributeQuery[3] && ec2InstanceAttributeQuery[3] !== '[]') {\n try {\n newQuery.ec2Filters = migrateMultiFilters(ec2InstanceAttributeQuery[3]);\n } catch {\n throw new Error(`unable to migrate poorly formed filters: ${ec2InstanceAttributeQuery[3]}`);\n }\n }\n return newQuery;\n }\n\n const resourceARNsQuery = rawQuery.match(/^resource_arns\\(([^,]+?),\\s?([^,]+?),\\s?(.+?)\\)/);\n if (resourceARNsQuery) {\n newQuery.queryType = VariableQueryType.ResourceArns;\n newQuery.region = resourceARNsQuery[1];\n newQuery.resourceType = resourceARNsQuery[2];\n if (resourceARNsQuery[3] && resourceARNsQuery[3] !== '[]') {\n try {\n newQuery.tags = migrateMultiFilters(resourceARNsQuery[3]);\n } catch {\n throw new Error(`unable to migrate poorly formed filters: ${resourceARNsQuery[3]}`);\n }\n }\n return newQuery;\n }\n\n const statsQuery = rawQuery.match(/^statistics\\(\\)/);\n if (statsQuery) {\n newQuery.queryType = VariableQueryType.Statistics;\n return newQuery;\n }\n throw new Error('unable to parse old variable query');\n}\n","import { css, cx } from '@emotion/css';\nimport { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { AccessoryButton, InputGroup } from '@grafana/plugin-ui';\nimport { Alert, Input, useStyles2 } from '@grafana/ui';\n\nimport { type CloudWatchDatasource } from '../../datasource';\nimport { useEnsureVariableHasSingleSelection } from '../../hooks';\n\nimport { MultiFilterCondition } from './MultiFilter';\n\nexport interface Props {\n filter: MultiFilterCondition;\n onChange: (value: MultiFilterCondition) => void;\n onDelete: () => void;\n keyPlaceholder?: string;\n datasource: CloudWatchDatasource;\n}\n\nexport const MultiFilterItem = ({ filter, onChange, onDelete, keyPlaceholder, datasource }: Props) => {\n const [localKey, setLocalKey] = useState(filter.key || '');\n const [localValue, setLocalValue] = useState(filter.value?.join(', ') || '');\n const error = useEnsureVariableHasSingleSelection(datasource, filter.key);\n const styles = useStyles2(getOperatorStyles);\n\n return (\n <div data-testid=\"cloudwatch-multifilter-item\">\n <InputGroup>\n <Input\n data-testid=\"cloudwatch-multifilter-item-key\"\n aria-label=\"Filter key\"\n value={localKey}\n placeholder={keyPlaceholder ?? 'key'}\n onChange={(e) => setLocalKey(e.currentTarget.value)}\n onBlur={() => {\n if (localKey && localKey !== filter.key) {\n onChange({ ...filter, key: localKey });\n }\n }}\n />\n\n <span className={cx(styles.root)}>=</span>\n\n <Input\n data-testid=\"cloudwatch-multifilter-item-value\"\n aria-label=\"Filter value\"\n value={localValue}\n placeholder=\"value1, value2,...\"\n onChange={(e) => setLocalValue(e.currentTarget.value)}\n onBlur={() => {\n const newValues = localValue.split(',').map((v) => v.trim());\n if (localValue && newValues !== filter.value) {\n onChange({ ...filter, value: newValues });\n }\n setLocalValue(newValues.join(', '));\n }}\n />\n\n <AccessoryButton aria-label=\"remove\" icon=\"times\" variant=\"secondary\" onClick={onDelete} type=\"button\" />\n </InputGroup>\n {error && <Alert title={error} severity=\"error\" topSpacing={1} />}\n </div>\n );\n};\n\nconst getOperatorStyles = (theme: GrafanaTheme2) => ({\n root: css({\n padding: theme.spacing(0, 1),\n alignSelf: 'center',\n }),\n});\n","import { isEqual } from 'lodash';\nimport { useEffect, useState } from 'react';\n\nimport { EditorList } from '@grafana/plugin-ui';\n\nimport { type CloudWatchDatasource } from '../../datasource';\nimport { MultiFilters } from '../../types';\n\nimport { MultiFilterItem } from './MultiFilterItem';\n\nexport interface Props {\n filters?: MultiFilters;\n onChange: (filters: MultiFilters) => void;\n keyPlaceholder?: string;\n datasource: CloudWatchDatasource;\n}\n\nexport interface MultiFilterCondition {\n key?: string;\n operator?: string;\n value?: string[];\n}\n\nconst multiFiltersToFilterConditions = (filters: MultiFilters) =>\n Object.keys(filters).map((key) => ({ key, value: filters[key], operator: '=' }));\n\nconst filterConditionsToMultiFilters = (filters: MultiFilterCondition[]) => {\n const res: MultiFilters = {};\n filters.forEach(({ key, value }) => {\n if (key && value) {\n res[key] = value;\n }\n });\n return res;\n};\n\nexport const MultiFilter = ({ filters, onChange, keyPlaceholder, datasource }: Props) => {\n const [items, setItems] = useState<MultiFilterCondition[]>([]);\n useEffect(() => setItems(filters ? multiFiltersToFilterConditions(filters) : []), [filters]);\n const onFiltersChange = (newItems: Array<Partial<MultiFilterCondition>>) => {\n setItems(newItems);\n\n // The onChange event should only be triggered in the case there is a complete dimension object.\n // So when a new key is added that does not yet have a value, it should not trigger an onChange event.\n const newMultifilters = filterConditionsToMultiFilters(newItems);\n if (!isEqual(newMultifilters, filters)) {\n onChange(newMultifilters);\n }\n };\n\n return (\n <EditorList items={items} onChange={onFiltersChange} renderItem={makeRenderFilter(datasource, keyPlaceholder)} />\n );\n};\n\nfunction makeRenderFilter(datasource: CloudWatchDatasource, keyPlaceholder?: string) {\n function renderFilter(\n item: MultiFilterCondition,\n onChange: (item: MultiFilterCondition) => void,\n onDelete: () => void\n ) {\n return (\n <MultiFilterItem\n filter={item}\n onChange={(item) => onChange(item)}\n onDelete={onDelete}\n keyPlaceholder={keyPlaceholder}\n datasource={datasource}\n />\n );\n }\n return renderFilter;\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n table: css({\n width: '100%',\n tableLayout: 'fixed',\n }),\n\n selectedLogGroupsContainer: css({\n marginLeft: theme.spacing(0.5),\n marginBottom: theme.spacing(0.5),\n display: 'flex',\n flexFlow: 'wrap',\n gap: theme.spacing(1),\n button: {\n margin: 'unset',\n },\n }),\n\n limitLabel: css({\n color: theme.colors.text.secondary,\n textAlign: 'center',\n maxWidth: 'none',\n svg: {\n marginRight: theme.spacing(0.5),\n },\n fontSize: 12,\n }),\n\n logGroupCountLabel: css({\n color: theme.colors.text.secondary,\n maxWidth: 'none',\n }),\n\n tableScroller: css({\n maxHeight: '40vh',\n overflow: 'auto',\n }),\n\n row: css({\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n\n '&:last-of-type': {\n borderBottomColor: theme.colors.border.medium,\n },\n }),\n\n cell: css({\n padding: theme.spacing(1, 1, 1, 0),\n width: '25%',\n '&:first-of-type': {\n width: '80%',\n padding: theme.spacing(1, 1, 1, 2),\n },\n }),\n\n nestedEntry: css({\n display: 'flex',\n alignItems: 'center',\n }),\n\n logGroupSearchResults: css({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n width: '90%',\n verticalAlign: 'middle',\n }),\n\n modal: css({\n width: theme.breakpoints.values.lg,\n }),\n\n selectAccountId: css({\n maxWidth: '100px',\n }),\n\n logGroupSelectionArea: css({\n display: 'flex',\n }),\n\n searchField: css({\n width: '100%',\n marginRight: theme.spacing(1),\n }),\n\n resultLimit: css({\n margin: '4px 0',\n fontStyle: 'italic',\n }),\n\n removeButton: css({\n verticalAlign: 'middle',\n marginLeft: theme.spacing(0.5),\n }),\n});\nexport const removeMarginBottom = css({ marginBottom: 8 });\n\nexport default getStyles;\n","import { SelectableValue } from '@grafana/data';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { Alert, PopoverContent, Select } from '@grafana/ui';\n\nimport { VariableQueryType } from '../../types';\nimport { removeMarginBottom } from '../styles';\n\ninterface VariableQueryFieldProps<T> {\n onChange: (value: T) => void;\n options: SelectableValue[];\n value: T | null;\n label: string;\n inputId?: string;\n allowCustomValue?: boolean;\n isLoading?: boolean;\n tooltip?: PopoverContent;\n interactive?: boolean;\n error?: string;\n}\n\nexport const VariableQueryField = <T extends string | VariableQueryType>({\n label,\n onChange,\n value,\n options,\n allowCustomValue = false,\n isLoading = false,\n inputId = label,\n tooltip,\n interactive,\n error,\n}: VariableQueryFieldProps<T>) => {\n return (\n <>\n <EditorField\n label={label}\n tooltip={tooltip}\n tooltipInteractive={interactive}\n htmlFor={inputId}\n className={removeMarginBottom}\n >\n <Select\n aria-label={label}\n allowCustomValue={allowCustomValue}\n value={value}\n onChange={({ value }) => onChange(value!)}\n options={options}\n isLoading={isLoading}\n inputId={inputId}\n />\n </EditorField>\n {error && <Alert title={error} severity=\"error\" topSpacing={1} />}\n </>\n );\n};\n","import { useState } from 'react';\n\nimport { EditorField } from '@grafana/plugin-ui';\nimport { Input, PopoverContent } from '@grafana/ui';\n\nimport { removeMarginBottom } from '../styles';\n\ninterface Props {\n onBlur: (value: string) => void;\n value: string;\n label: string;\n placeholder?: string;\n tooltip?: PopoverContent;\n interactive?: boolean;\n}\n\nexport const VariableTextField = ({ interactive, label, onBlur, placeholder, value, tooltip }: Props) => {\n const [localValue, setLocalValue] = useState(value);\n return (\n <EditorField label={label} tooltip={tooltip} tooltipInteractive={interactive} className={removeMarginBottom}>\n <Input\n aria-label={label}\n placeholder={placeholder}\n value={localValue}\n onChange={(e) => setLocalValue(e.currentTarget.value)}\n onBlur={() => onBlur(localValue)}\n />\n </EditorField>\n );\n};\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2, QueryEditorProps, SelectableValue, toOption } from '@grafana/data';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { TextLink, useStyles2 } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport {\n useAccountOptions,\n useDimensionKeys,\n useMetrics,\n useNamespaces,\n useRegions,\n useEnsureVariableHasSingleSelection,\n} from '../../hooks';\nimport { migrateVariableQuery } from '../../migrations/variableQueryMigrations';\nimport { CloudWatchJsonData, CloudWatchQuery, VariableQuery, VariableQueryType } from '../../types';\nimport { ALL_ACCOUNTS_OPTION } from '../shared/Account';\nimport { Dimensions } from '../shared/Dimensions/Dimensions';\n\nimport { MultiFilter } from './MultiFilter';\nimport { VariableQueryField } from './VariableQueryField';\nimport { VariableTextField } from './VariableTextField';\n\nexport type Props = QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData, VariableQuery>;\n\nconst queryTypes: Array<{ value: string; label: string }> = [\n { value: VariableQueryType.Regions, label: 'Regions' },\n { value: VariableQueryType.Namespaces, label: 'Namespaces' },\n { value: VariableQueryType.Metrics, label: 'Metrics' },\n { value: VariableQueryType.DimensionKeys, label: 'Dimension Keys' },\n { value: VariableQueryType.DimensionValues, label: 'Dimension Values' },\n { value: VariableQueryType.EBSVolumeIDs, label: 'EBS Volume IDs' },\n { value: VariableQueryType.EC2InstanceAttributes, label: 'EC2 Instance Attributes' },\n { value: VariableQueryType.ResourceArns, label: 'Resource ARNs' },\n { value: VariableQueryType.Statistics, label: 'Statistics' },\n { value: VariableQueryType.LogGroups, label: 'Log Groups' },\n ...(config.featureToggles.cloudWatchCrossAccountQuerying\n ? [{ value: VariableQueryType.Accounts, label: 'Accounts' }]\n : []),\n];\n\nconst attributeNames: string[] = [\n 'AmiLaunchIndex',\n 'Architecture',\n 'ClientToken',\n 'EbsOptimized',\n 'EnaSupport',\n 'Hypervisor',\n 'IamInstanceProfile',\n 'ImageId',\n 'InstanceId',\n 'InstanceLifecycle',\n 'InstanceType',\n 'KernelId',\n 'KeyName',\n 'LaunchTime',\n 'Platform',\n 'PrivateDnsName',\n 'PrivateIpAddress',\n 'PublicDnsName',\n 'PublicIpAddress',\n 'RamdiskId',\n 'RootDeviceName',\n 'RootDeviceType',\n 'SourceDestCheck',\n 'SpotInstanceRequestId',\n 'SriovNetSupport',\n 'SubnetId',\n 'VirtualizationType',\n 'VpcId',\n];\n\nexport const VariableQueryEditor = ({ query, datasource, onChange }: Props) => {\n const parsedQuery = migrateVariableQuery(query);\n\n const { region, namespace, metricName, dimensionKey } = parsedQuery;\n const [regions, regionIsLoading] = useRegions(datasource);\n const namespaces = useNamespaces(datasource);\n const metrics = useMetrics(datasource, { region, namespace });\n const dimensionKeys = useDimensionKeys(datasource, { region, namespace, metricName });\n const accountState = useAccountOptions(datasource.resources, query.region);\n const dimensionKeyError = useEnsureVariableHasSingleSelection(datasource, dimensionKey);\n\n const onRegionChange = async (region: string) => {\n const validatedQuery = await sanitizeQuery({\n ...parsedQuery,\n region,\n accountId: undefined,\n });\n onQueryChange(validatedQuery);\n };\n\n const onNamespaceChange = async (namespace: string) => {\n const validatedQuery = await sanitizeQuery({\n ...parsedQuery,\n namespace,\n });\n onQueryChange(validatedQuery);\n };\n\n const onQueryChange = (newQuery: VariableQuery) => {\n onChange({\n ...newQuery,\n refId: 'CloudWatchVariableQueryEditor-VariableQuery',\n });\n };\n\n // Reset dimensionValue parameters if namespace or region change\n const sanitizeQuery = async (query: VariableQuery) => {\n let { metricName, dimensionKey, dimensionFilters, namespace, region } = query;\n if (metricName) {\n await datasource.resources.getMetrics({ namespace, region }).then((result: Array<SelectableValue<string>>) => {\n if (!result.find((metric) => metric.value === metricName)) {\n metricName = '';\n }\n });\n }\n if (dimensionKey) {\n await datasource.resources\n .getDimensionKeys({ namespace, region })\n .then((result: Array<SelectableValue<string>>) => {\n if (!result.find((key) => key.value === dimensionKey)) {\n dimensionKey = '';\n dimensionFilters = {};\n }\n });\n }\n return { ...query, metricName, dimensionKey, dimensionFilters };\n };\n const allAttributeNames = attributeNames.includes(parsedQuery.attributeName)\n ? attributeNames\n : [...attributeNames, parsedQuery.attributeName];\n const attributeOptions = allAttributeNames.map(toOption);\n\n const hasRegionField = [\n VariableQueryType.Metrics,\n VariableQueryType.DimensionKeys,\n VariableQueryType.DimensionValues,\n VariableQueryType.EBSVolumeIDs,\n VariableQueryType.EC2InstanceAttributes,\n VariableQueryType.ResourceArns,\n VariableQueryType.LogGroups,\n VariableQueryType.Accounts,\n ].includes(parsedQuery.queryType);\n const hasAccountIDField = [\n VariableQueryType.Metrics,\n VariableQueryType.DimensionKeys,\n VariableQueryType.DimensionValues,\n VariableQueryType.LogGroups,\n ].includes(parsedQuery.queryType);\n const hasNamespaceField = [\n VariableQueryType.Metrics,\n VariableQueryType.DimensionKeys,\n VariableQueryType.DimensionValues,\n ].includes(parsedQuery.queryType);\n\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.formStyles}>\n <VariableQueryField\n value={parsedQuery.queryType}\n options={queryTypes}\n onChange={(value: VariableQueryType) =>\n onQueryChange({ ...parsedQuery, queryType: value, accountId: undefined })\n }\n label=\"Query type\"\n inputId={`variable-query-type-${query.refId}`}\n />\n {hasRegionField && (\n <VariableQueryField\n value={region}\n options={regions}\n onChange={(value: string) => onRegionChange(value)}\n label=\"Region\"\n isLoading={regionIsLoading}\n inputId={`variable-query-region-${query.refId}`}\n />\n )}\n {hasAccountIDField &&\n accountState.value &&\n accountState.value?.length > 0 &&\n config.featureToggles.cloudWatchCrossAccountQuerying && (\n <VariableQueryField\n label=\"Account\"\n value={query.accountId ?? null}\n onChange={(accountId?: string) => onQueryChange({ ...parsedQuery, accountId })}\n options={[ALL_ACCOUNTS_OPTION, ...accountState?.value]}\n allowCustomValue={false}\n />\n )}\n {hasNamespaceField && (\n <VariableQueryField\n value={namespace}\n options={namespaces}\n onChange={(value: string) => onNamespaceChange(value)}\n label=\"Namespace\"\n inputId={`variable-query-namespace-${query.refId}`}\n allowCustomValue\n />\n )}\n {parsedQuery.queryType === VariableQueryType.DimensionValues && (\n <>\n <VariableQueryField\n value={metricName || null}\n options={metrics}\n onChange={(value: string) => onQueryChange({ ...parsedQuery, metricName: value })}\n label=\"Metric\"\n inputId={`variable-query-metric-${query.refId}`}\n allowCustomValue\n />\n <VariableQueryField\n value={dimensionKey || null}\n options={dimensionKeys}\n onChange={(value: string) => onQueryChange({ ...parsedQuery, dimensionKey: value })}\n label=\"Dimension key\"\n inputId={`variable-query-dimension-key-${query.refId}`}\n allowCustomValue\n error={dimensionKeyError}\n />\n <EditorField\n label=\"Dimensions\"\n className={styles.dimensionsWidth}\n tooltip=\"Dimensions to filter the returned values on\"\n >\n <Dimensions\n metricStat={{ ...parsedQuery, dimensions: parsedQuery.dimensionFilters }}\n onChange={(dimensions) => {\n onChange({ ...parsedQuery, dimensionFilters: dimensions });\n }}\n disableExpressions={true}\n datasource={datasource}\n />\n </EditorField>\n </>\n )}\n {parsedQuery.queryType === VariableQueryType.EBSVolumeIDs && (\n <VariableTextField\n value={query.instanceID}\n placeholder=\"i-XXXXXXXXXXXXXXXXX\"\n onBlur={(value: string) => onQueryChange({ ...parsedQuery, instanceID: value })}\n label=\"Instance ID\"\n />\n )}\n {parsedQuery.queryType === VariableQueryType.EC2InstanceAttributes && (\n <>\n <VariableQueryField\n value={parsedQuery.attributeName}\n options={attributeOptions}\n onChange={(value: string) => onQueryChange({ ...parsedQuery, attributeName: value })}\n label=\"Attribute name\"\n inputId={`variable-query-instance-attribute-${query.refId}`}\n allowCustomValue\n interactive={true}\n tooltip={\n <>\n {'Attribute or tag to query on. Tags should be formatted \"Tags.<name>\". '}\n <TextLink\n href=\"https://grafana.com/docs/grafana/latest/datasources/aws-cloudwatch/template-queries-cloudwatch/#selecting-attributes\"\n external\n >\n See the documentation for more details\n </TextLink>\n </>\n }\n />\n <EditorField\n label=\"Filters\"\n tooltipInteractive\n tooltip={\n <>\n <TextLink\n href=\"https://grafana.com/docs/grafana/latest/datasources/aws-cloudwatch/template-queries-cloudwatch/#selecting-attributes\"\n external\n >\n Pre-defined ec2:DescribeInstances filters/tags\n </TextLink>\n {' and the values to filter on. Tags should be formatted tag:<name>.'}\n </>\n }\n >\n <MultiFilter\n filters={parsedQuery.ec2Filters ?? {}}\n onChange={(filters) => {\n onChange({ ...parsedQuery, ec2Filters: filters });\n }}\n keyPlaceholder=\"filter/tag\"\n datasource={datasource}\n />\n </EditorField>\n </>\n )}\n {parsedQuery.queryType === VariableQueryType.ResourceArns && (\n <>\n <VariableTextField\n value={parsedQuery.resourceType}\n onBlur={(value: string) => onQueryChange({ ...parsedQuery, resourceType: value })}\n label=\"Resource type\"\n />\n <EditorField label=\"Tags\" tooltip=\"Tags to filter the returned values on.\">\n <MultiFilter\n filters={parsedQuery.tags}\n onChange={(filters) => {\n onChange({ ...parsedQuery, tags: filters });\n }}\n keyPlaceholder=\"tag\"\n datasource={datasource}\n />\n </EditorField>\n </>\n )}\n {parsedQuery.queryType === VariableQueryType.LogGroups && (\n <VariableTextField\n value={query.logGroupPrefix ?? ''}\n onBlur={(value: string) => onQueryChange({ ...parsedQuery, logGroupPrefix: value })}\n label=\"Log group prefix\"\n />\n )}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n formStyles: css({\n maxWidth: theme.spacing(30),\n }),\n dimensionsWidth: css({\n width: theme.spacing(50),\n }),\n});\n","import { from, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport {\n CustomVariableSupport,\n DataQueryRequest,\n DataQueryResponse,\n MetricFindValue,\n SelectableValue,\n} from '@grafana/data';\n\nimport { VariableQueryEditor } from './components/VariableQueryEditor/VariableQueryEditor';\nimport { ALL_ACCOUNTS_OPTION } from './components/shared/Account';\nimport { CloudWatchDatasource } from './datasource';\nimport { DEFAULT_VARIABLE_QUERY } from './defaultQueries';\nimport { migrateVariableQuery } from './migrations/variableQueryMigrations';\nimport { ResourcesAPI } from './resources/ResourcesAPI';\nimport { standardStatistics } from './standardStatistics';\nimport { VariableQuery, VariableQueryType } from './types';\n\nexport class CloudWatchVariableSupport extends CustomVariableSupport<CloudWatchDatasource, VariableQuery> {\n constructor(private readonly resources: ResourcesAPI) {\n super();\n }\n\n editor = VariableQueryEditor;\n\n query(request: DataQueryRequest<VariableQuery>): Observable<DataQueryResponse> {\n const queryObj = migrateVariableQuery(request.targets[0]);\n return from(this.execute(queryObj)).pipe(map((data) => ({ data })));\n }\n\n async execute(query: VariableQuery) {\n try {\n switch (query.queryType) {\n case VariableQueryType.Regions:\n return this.handleRegionsQuery();\n case VariableQueryType.Namespaces:\n return this.handleNamespacesQuery();\n case VariableQueryType.Metrics:\n return this.handleMetricsQuery(query);\n case VariableQueryType.DimensionKeys:\n return this.handleDimensionKeysQuery(query);\n case VariableQueryType.DimensionValues:\n return this.handleDimensionValuesQuery(query);\n case VariableQueryType.EBSVolumeIDs:\n return this.handleEbsVolumeIdsQuery(query);\n case VariableQueryType.EC2InstanceAttributes:\n return this.handleEc2InstanceAttributeQuery(query);\n case VariableQueryType.ResourceArns:\n return this.handleResourceARNsQuery(query);\n case VariableQueryType.Statistics:\n return this.handleStatisticsQuery();\n case VariableQueryType.LogGroups:\n return this.handleLogGroupsQuery(query);\n case VariableQueryType.Accounts:\n return this.handleAccountsQuery(query);\n }\n } catch (error) {\n console.error(`Could not run CloudWatchMetricFindQuery ${query}`, error);\n return [];\n }\n }\n\n async handleLogGroupsQuery({ region, logGroupPrefix, accountId }: VariableQuery) {\n const interpolatedPrefix = this.resources.templateSrv.replace(logGroupPrefix);\n return this.resources\n .getLogGroups({\n accountId,\n region,\n logGroupNamePrefix: interpolatedPrefix,\n listAllLogGroups: true,\n })\n .then((logGroups) =>\n logGroups.map((lg) => {\n return {\n text: lg.value.name,\n value: lg.value.arn,\n expandable: true,\n };\n })\n );\n }\n\n async handleRegionsQuery() {\n return this.resources.getRegions().then((regions) => regions.map(selectableValueToMetricFindOption));\n }\n\n async handleNamespacesQuery() {\n return this.resources.getNamespaces().then((namespaces) => namespaces.map(selectableValueToMetricFindOption));\n }\n\n async handleMetricsQuery({ namespace, region, accountId }: VariableQuery) {\n return this.resources\n .getMetrics({ namespace, region, accountId })\n .then((metrics) => metrics.map(selectableValueToMetricFindOption));\n }\n\n async handleDimensionKeysQuery({ namespace, region, accountId }: VariableQuery) {\n return this.resources\n .getDimensionKeys({ namespace, region, accountId })\n .then((keys) => keys.map(selectableValueToMetricFindOption));\n }\n\n async handleDimensionValuesQuery({\n namespace,\n accountId,\n region,\n dimensionKey,\n metricName,\n dimensionFilters,\n }: VariableQuery) {\n if (!dimensionKey || !metricName) {\n return [];\n }\n return this.resources\n .getDimensionValues({\n region,\n accountId,\n namespace,\n metricName,\n dimensionKey,\n dimensionFilters,\n })\n .then((values) => values.map(selectableValueToMetricFindOption));\n }\n\n async handleEbsVolumeIdsQuery({ region, instanceID }: VariableQuery) {\n if (!instanceID) {\n return [];\n }\n return this.resources.getEbsVolumeIds(region, instanceID).then((ids) => ids.map(selectableValueToMetricFindOption));\n }\n\n async handleEc2InstanceAttributeQuery({ region, attributeName, ec2Filters }: VariableQuery) {\n if (!attributeName) {\n return [];\n }\n return this.resources\n .getEc2InstanceAttribute(region, attributeName, ec2Filters ?? {})\n .then((values) => values.map(selectableValueToMetricFindOption));\n }\n\n async handleResourceARNsQuery({ region, resourceType, tags }: VariableQuery) {\n if (!resourceType) {\n return [];\n }\n const keys = await this.resources.getResourceARNs(region, resourceType, tags ?? {});\n return keys.map(selectableValueToMetricFindOption);\n }\n\n async handleStatisticsQuery() {\n return standardStatistics.map((s: string) => ({\n text: s,\n value: s,\n expandable: true,\n }));\n }\n\n allMetricFindValue: MetricFindValue = { text: 'All', value: ALL_ACCOUNTS_OPTION.value, expandable: true };\n async handleAccountsQuery({ region }: VariableQuery) {\n return this.resources.getAccounts({ region }).then((accounts) => {\n const metricFindOptions = accounts.map((account) => ({\n text: account.label,\n value: account.id,\n expandable: true,\n }));\n\n return metricFindOptions.length ? [this.allMetricFindValue, ...metricFindOptions] : [];\n });\n }\n\n getDefaultQuery(): Partial<VariableQuery> {\n return DEFAULT_VARIABLE_QUERY;\n }\n}\n\nfunction selectableValueToMetricFindOption({ label, value }: SelectableValue<string>): MetricFindValue {\n return { text: label ?? value ?? '', value: value, expandable: true };\n}\n","import { cloneDeep, find, isEmpty } from 'lodash';\nimport { merge, Observable, of } from 'rxjs';\n\nimport {\n CoreApp,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n DataSourceWithLogsContextSupport,\n LoadingState,\n LogRowContextOptions,\n LogRowModel,\n ScopedVars,\n} from '@grafana/data';\nimport { DataSourceWithBackend, TemplateSrv, getTemplateSrv } from '@grafana/runtime';\n\nimport { CloudWatchAnnotationSupport } from './annotationSupport';\nimport { DEFAULT_METRICS_QUERY, getDefaultLogsQuery } from './defaultQueries';\nimport {\n isCloudWatchAnnotationQuery,\n isCloudWatchLogsQuery,\n isCloudWatchMetricsQuery,\n isLogsAnomaliesQuery,\n} from './guards';\nimport { CloudWatchLogsLanguageProvider } from './language/cloudwatch-logs/CloudWatchLogsLanguageProvider';\nimport {\n LogsSQLCompletionItemProvider,\n LogsSQLCompletionItemProviderFunc,\n} from './language/cloudwatch-logs-sql/completion/CompletionItemProvider';\nimport {\n PPLCompletionItemProvider,\n PPLCompletionItemProviderFunc,\n} from './language/cloudwatch-ppl/completion/PPLCompletionItemProvider';\nimport { SQLCompletionItemProvider } from './language/cloudwatch-sql/completion/CompletionItemProvider';\nimport {\n LogsCompletionItemProvider,\n LogsCompletionItemProviderFunc,\n queryContext,\n} from './language/logs/completion/CompletionItemProvider';\nimport { MetricMathCompletionItemProvider } from './language/metric-math/completion/CompletionItemProvider';\nimport { CloudWatchAnnotationQueryRunner } from './query-runner/CloudWatchAnnotationQueryRunner';\nimport { CloudWatchLogsQueryRunner } from './query-runner/CloudWatchLogsQueryRunner';\nimport { CloudWatchMetricsQueryRunner } from './query-runner/CloudWatchMetricsQueryRunner';\nimport { ResourcesAPI } from './resources/ResourcesAPI';\nimport {\n CloudWatchAnnotationQuery,\n CloudWatchJsonData,\n CloudWatchLogsAnomaliesQuery,\n CloudWatchLogsQuery,\n CloudWatchMetricsQuery,\n CloudWatchQuery,\n} from './types';\nimport { CloudWatchVariableSupport } from './variables';\n\nexport class CloudWatchDatasource\n extends DataSourceWithBackend<CloudWatchQuery, CloudWatchJsonData>\n implements DataSourceWithLogsContextSupport<CloudWatchLogsQuery>\n{\n defaultRegion?: string;\n languageProvider: CloudWatchLogsLanguageProvider;\n sqlCompletionItemProvider: SQLCompletionItemProvider;\n metricMathCompletionItemProvider: MetricMathCompletionItemProvider;\n defaultLogGroups?: string[];\n logsSqlCompletionItemProviderFunc: (queryContext: queryContext) => LogsSQLCompletionItemProvider;\n logsCompletionItemProviderFunc: (queryContext: queryContext) => LogsCompletionItemProvider;\n pplCompletionItemProviderFunc: (queryContext: queryContext) => PPLCompletionItemProvider;\n\n type = 'cloudwatch';\n\n private metricsQueryRunner: CloudWatchMetricsQueryRunner;\n private annotationQueryRunner: CloudWatchAnnotationQueryRunner;\n logsQueryRunner: CloudWatchLogsQueryRunner;\n resources: ResourcesAPI;\n\n constructor(\n private instanceSettings: DataSourceInstanceSettings<CloudWatchJsonData>,\n readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n this.defaultRegion = instanceSettings.jsonData.defaultRegion;\n this.resources = new ResourcesAPI(instanceSettings, templateSrv);\n this.languageProvider = new CloudWatchLogsLanguageProvider(this);\n this.sqlCompletionItemProvider = new SQLCompletionItemProvider(this.resources, this.templateSrv);\n this.metricsQueryRunner = new CloudWatchMetricsQueryRunner(instanceSettings, templateSrv);\n this.logsQueryRunner = new CloudWatchLogsQueryRunner(instanceSettings, templateSrv);\n this.annotationQueryRunner = new CloudWatchAnnotationQueryRunner(instanceSettings, templateSrv);\n this.variables = new CloudWatchVariableSupport(this.resources);\n this.annotations = CloudWatchAnnotationSupport;\n this.defaultLogGroups = instanceSettings.jsonData.defaultLogGroups;\n\n this.metricMathCompletionItemProvider = new MetricMathCompletionItemProvider(this.resources, this.templateSrv);\n this.logsCompletionItemProviderFunc = LogsCompletionItemProviderFunc(this.resources, this.templateSrv);\n this.logsSqlCompletionItemProviderFunc = LogsSQLCompletionItemProviderFunc(this.resources, templateSrv);\n this.pplCompletionItemProviderFunc = PPLCompletionItemProviderFunc(this.resources, this.templateSrv);\n }\n\n filterQuery(query: CloudWatchQuery) {\n return query.hide !== true || (isCloudWatchMetricsQuery(query) && query.id !== '');\n }\n\n // reminder: when queries are made on the backend through alerting they will not go through this function\n // we have duplicated code here to retry queries on the frontend so that the we can show partial results to users\n // but ultimately anytime we add special error handling or logic retrying here we should ask ourselves\n // could it only live in the backend? if so let's implement it there. If not, should it also live in the backend or just in the frontend?\n // another note that at the end of the day all of these queries call super.query which is what forwards the request to the backend through /query\n query(options: DataQueryRequest<CloudWatchQuery>): Observable<DataQueryResponse> {\n options = cloneDeep(options);\n\n let queries = options.targets.filter(this.filterQuery);\n\n const logQueries: CloudWatchLogsQuery[] = [];\n const metricsQueries: CloudWatchMetricsQuery[] = [];\n const logsAnomaliesQueries: CloudWatchLogsAnomaliesQuery[] = [];\n const annotationQueries: CloudWatchAnnotationQuery[] = [];\n\n queries.forEach((query) => {\n if (isCloudWatchAnnotationQuery(query)) {\n annotationQueries.push(query);\n } else if (isLogsAnomaliesQuery(query)) {\n logsAnomaliesQueries.push(query);\n } else if (isCloudWatchLogsQuery(query)) {\n logQueries.push(query);\n } else {\n metricsQueries.push(query);\n }\n });\n\n const dataQueryResponses: Array<Observable<DataQueryResponse>> = [];\n if (logQueries.length) {\n dataQueryResponses.push(this.logsQueryRunner.handleLogQueries(logQueries, options, super.query.bind(this)));\n }\n\n if (metricsQueries.length) {\n dataQueryResponses.push(\n this.metricsQueryRunner.handleMetricQueries(metricsQueries, options, super.query.bind(this))\n );\n }\n\n if (logsAnomaliesQueries.length) {\n dataQueryResponses.push(\n this.logsQueryRunner.handleLogAnomaliesQueries(logsAnomaliesQueries, options, super.query.bind(this))\n );\n }\n\n if (annotationQueries.length) {\n dataQueryResponses.push(\n this.annotationQueryRunner.handleAnnotationQuery(annotationQueries, options, super.query.bind(this))\n );\n }\n // No valid targets, return the empty result to save a round trip.\n if (isEmpty(dataQueryResponses)) {\n return of({\n data: [],\n state: LoadingState.Done,\n });\n }\n\n return merge(...dataQueryResponses);\n }\n\n interpolateVariablesInQueries(queries: CloudWatchQuery[], scopedVars: ScopedVars): CloudWatchQuery[] {\n if (!queries.length) {\n return queries;\n }\n\n return queries.map((query) => ({\n ...query,\n region: this.metricsQueryRunner.replaceVariableAndDisplayWarningIfMulti(\n this.getActualRegion(query.region),\n scopedVars\n ),\n ...(isCloudWatchMetricsQuery(query) &&\n this.metricsQueryRunner.interpolateMetricsQueryVariables(query, scopedVars)),\n ...(isCloudWatchLogsQuery(query) && this.logsQueryRunner.interpolateLogsQueryVariables(query, scopedVars)),\n }));\n }\n\n /**\n * Get log row context for a given log row. This is called when the user clicks on a log row in the logs visualization and the \"show context button\"\n * it shows the surrounding logs.\n */\n getLogRowContext(row: LogRowModel, context?: LogRowContextOptions, query?: CloudWatchLogsQuery) {\n return this.logsQueryRunner.getLogRowContext(row, context, super.query.bind(this), query);\n }\n\n targetContainsTemplate(target: any) {\n return (\n this.templateSrv.containsTemplate(target.region) ||\n this.templateSrv.containsTemplate(target.namespace) ||\n this.templateSrv.containsTemplate(target.metricName) ||\n this.templateSrv.containsTemplate(target.expression!) ||\n target.logGroupNames?.some((logGroup: string) => this.templateSrv.containsTemplate(logGroup)) ||\n find(target.dimensions, (v, k) => this.templateSrv.containsTemplate(k) || this.templateSrv.containsTemplate(v))\n );\n }\n\n getQueryDisplayText(query: CloudWatchQuery) {\n if (isCloudWatchLogsQuery(query)) {\n return query.expression ?? '';\n } else {\n return JSON.stringify(query);\n }\n }\n\n // public\n getVariables() {\n return this.resources.getVariables();\n }\n\n getActualRegion(region?: string) {\n if (region === 'default' || region === undefined || region === '') {\n return this.defaultRegion ?? '';\n }\n return region;\n }\n\n getDefaultQuery(_: CoreApp): Partial<CloudWatchQuery> {\n return {\n ...getDefaultLogsQuery(this.instanceSettings.jsonData.logGroups, this.instanceSettings.jsonData.defaultLogGroups),\n ...DEFAULT_METRICS_QUERY,\n };\n }\n}\n","import { debounce, unionBy } from 'lodash';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport * as React from 'react';\n\nimport { AppEvents, SelectableValue, toOption } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\nimport { MultiSelect, InputActionMeta } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { appendTemplateVariables } from '../../../utils/utils';\n\nconst MAX_LOG_GROUPS = 20;\nconst MAX_VISIBLE_LOG_GROUPS = 4;\nconst DEBOUNCE_TIMER = 300;\n\nexport interface LogGroupSelectorProps {\n region: string;\n selectedLogGroups: string[];\n onChange: (logGroups: string[]) => void;\n\n datasource?: CloudWatchDatasource;\n onOpenMenu?: () => Promise<void>;\n width?: number | 'auto';\n saved?: boolean; // is only used in the config editor\n}\n\nexport const LogGroupSelector: React.FC<LogGroupSelectorProps> = ({\n region,\n selectedLogGroups,\n onChange,\n datasource,\n onOpenMenu,\n width,\n saved = true,\n}) => {\n const [loadingLogGroups, setLoadingLogGroups] = useState(false);\n const [availableLogGroups, setAvailableLogGroups] = useState<Array<SelectableValue<string>>>([]);\n const logGroupOptions = useMemo(\n () => unionBy(availableLogGroups, selectedLogGroups?.map(toOption), 'value'),\n [availableLogGroups, selectedLogGroups]\n );\n\n const fetchLogGroupOptions = useCallback(\n async (region: string, logGroupNamePrefix?: string) => {\n if (!datasource) {\n return [];\n }\n try {\n const logGroups = await datasource.resources.legacyDescribeLogGroups(region, logGroupNamePrefix);\n return logGroups;\n } catch (err) {\n getAppEvents().publish({\n type: AppEvents.alertError.name,\n payload: [typeof err === 'string' ? err : JSON.stringify(err)],\n });\n return [];\n }\n },\n [datasource]\n );\n\n const onLogGroupSearch = async (searchTerm: string, region: string, actionMeta: InputActionMeta) => {\n if (actionMeta.action !== 'input-change' || !datasource) {\n return;\n }\n\n // No need to fetch matching log groups if the search term isn't valid\n // This is also useful for preventing searches when a user is typing out a log group with template vars\n // See https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_LogGroup.html for the source of the pattern below\n const logGroupNamePattern = /^[\\.\\-_/#A-Za-z0-9]+$/;\n if (!logGroupNamePattern.test(searchTerm)) {\n if (searchTerm !== '') {\n getAppEvents().publish({\n type: AppEvents.alertError.name,\n payload: ['Invalid Log Group name: ' + searchTerm],\n });\n }\n return;\n }\n\n setLoadingLogGroups(true);\n const matchingLogGroups = await fetchLogGroupOptions(region, searchTerm);\n setAvailableLogGroups(unionBy(availableLogGroups, matchingLogGroups, 'value'));\n setLoadingLogGroups(false);\n };\n\n // Reset the log group options if the datasource or region change and are saved\n useEffect(() => {\n async function getAvailableLogGroupOptions() {\n // Don't call describeLogGroups if datasource or region is undefined\n if (!datasource || !datasource.getActualRegion(region)) {\n setAvailableLogGroups([]);\n return;\n }\n\n setLoadingLogGroups(true);\n return fetchLogGroupOptions(datasource.getActualRegion(region))\n .then((logGroups) => {\n setAvailableLogGroups(logGroups);\n })\n .finally(() => {\n setLoadingLogGroups(false);\n });\n }\n\n // Config editor does not fetch new log group options unless changes have been saved\n saved && getAvailableLogGroupOptions();\n\n // if component unmounts in the middle of setting state, we reset state and unsubscribe from fetchLogGroupOptions\n return () => {\n setAvailableLogGroups([]);\n setLoadingLogGroups(false);\n };\n // this hook shouldn't get called every time selectedLogGroups or onChange updates\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [datasource, region, saved]);\n\n const onOpenLogGroupMenu = async () => {\n if (onOpenMenu) {\n await onOpenMenu();\n }\n };\n\n const onLogGroupSearchDebounced = debounce(onLogGroupSearch, DEBOUNCE_TIMER);\n\n return (\n <MultiSelect\n inputId=\"default-log-groups\"\n aria-label=\"Log Groups\"\n allowCustomValue\n options={datasource ? appendTemplateVariables(datasource, logGroupOptions) : logGroupOptions}\n value={selectedLogGroups}\n onChange={(v) => onChange(v.filter(({ value }) => value).map(({ value }) => value))}\n closeMenuOnSelect={false}\n isClearable\n isOptionDisabled={() => selectedLogGroups.length >= MAX_LOG_GROUPS}\n placeholder=\"Choose Log Groups\"\n maxVisibleValues={MAX_VISIBLE_LOG_GROUPS}\n noOptionsMessage=\"No log groups available\"\n isLoading={loadingLogGroups}\n onOpenMenu={onOpenLogGroupMenu}\n onInputChange={(value, actionMeta) => {\n onLogGroupSearchDebounced(value, region, actionMeta);\n }}\n width={width}\n />\n );\n};\n","import { css } from '@emotion/css';\n\nimport { CloudWatchDatasource } from '../../../datasource';\n\nimport { LogGroupSelector } from './LegacyLogGroupSelector';\n\ntype Props = {\n datasource: CloudWatchDatasource;\n onChange: (logGroups: string[]) => void;\n region: string;\n legacyLogGroupNames: string[];\n};\n\nconst rowGap = css({\n gap: '3px',\n});\n\nexport const LegacyLogGroupSelection = ({ datasource, region, legacyLogGroupNames, onChange }: Props) => {\n return (\n <div className={`gf-form gf-form--grow flex-grow-1 ${rowGap}`}>\n <LogGroupSelector\n region={region}\n selectedLogGroups={legacyLogGroupNames}\n datasource={datasource}\n onChange={onChange}\n />\n </div>\n );\n};\n","import { debounce } from 'lodash';\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { Icon, Input } from '@grafana/ui';\n\n// TODO: consider moving search into grafana/ui, this is mostly the same as that in azure monitor\nconst Search = ({ searchFn, searchPhrase }: { searchPhrase: string; searchFn: (searchPhrase: string) => void }) => {\n const [searchFilter, setSearchFilter] = useState(searchPhrase);\n\n const debouncedSearch = useMemo(() => debounce(searchFn, 600), [searchFn]);\n\n useEffect(() => {\n return () => {\n // Stop the invocation of the debounced function after unmounting\n debouncedSearch?.cancel();\n };\n }, [debouncedSearch]);\n\n return (\n <Input\n aria-label=\"log group search\"\n prefix={<Icon name=\"search\" />}\n value={searchFilter}\n onChange={(event) => {\n const searchPhrase = event.currentTarget.value;\n setSearchFilter(searchPhrase);\n debouncedSearch(searchPhrase);\n }}\n placeholder=\"search by log group name prefix\"\n />\n );\n};\n\nexport default Search;\n","import { useEffect, useMemo, useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { EditorField } from '@grafana/plugin-ui';\nimport {\n Button,\n Checkbox,\n Icon,\n Label,\n LoadingPlaceholder,\n Modal,\n Select,\n Space,\n TextLink,\n useStyles2,\n} from '@grafana/ui';\n\nimport { DescribeLogGroupsRequest, ResourceResponse, LogGroupResponse } from '../../../resources/types';\nimport { LogGroup } from '../../../types';\nimport getStyles from '../../styles';\nimport { Account, ALL_ACCOUNTS_OPTION } from '../Account';\n\nimport Search from './Search';\n\ntype CrossAccountLogsQueryProps = {\n selectedLogGroups?: LogGroup[];\n accountOptions?: Array<SelectableValue<string>>;\n fetchLogGroups: (params: Partial<DescribeLogGroupsRequest>) => Promise<Array<ResourceResponse<LogGroupResponse>>>;\n variables?: string[];\n onChange: (selectedLogGroups: LogGroup[]) => void;\n onBeforeOpen?: () => void;\n};\n\nexport const LogGroupsSelector = ({\n accountOptions = [],\n variables = [],\n fetchLogGroups,\n onChange,\n onBeforeOpen,\n ...props\n}: CrossAccountLogsQueryProps) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [selectableLogGroups, setSelectableLogGroups] = useState<LogGroup[]>([]);\n const [selectedLogGroups, setSelectedLogGroups] = useState(props.selectedLogGroups ?? []);\n const [searchPhrase, setSearchPhrase] = useState('');\n const [searchAccountId, setSearchAccountId] = useState(ALL_ACCOUNTS_OPTION.value);\n const [isLoading, setIsLoading] = useState(false);\n const styles = useStyles2(getStyles);\n const selectedLogGroupsCounter = useMemo(\n () => selectedLogGroups.filter((lg) => !lg.name?.startsWith('$')).length,\n [selectedLogGroups]\n );\n const variableOptions = useMemo(() => variables.map((v) => ({ label: v, value: v })), [variables]);\n const selectedVariable = useMemo(\n () => selectedLogGroups.find((lg) => lg.name?.startsWith('$'))?.name,\n [selectedLogGroups]\n );\n const currentVariableOption = {\n label: selectedVariable,\n value: selectedVariable,\n };\n\n useEffect(() => {\n setSelectedLogGroups(props.selectedLogGroups ?? []);\n }, [props.selectedLogGroups]);\n\n const toggleModal = () => {\n setIsModalOpen(!isModalOpen);\n if (isModalOpen) {\n } else {\n setSelectedLogGroups(selectedLogGroups);\n searchFn(searchPhrase, searchAccountId);\n }\n };\n\n const accountNameById = useMemo(() => {\n const idsToNames: Record<string, string> = {};\n accountOptions.forEach((a) => {\n if (a.value && a.label) {\n idsToNames[a.value] = a.label;\n }\n });\n return idsToNames;\n }, [accountOptions]);\n\n const searchFn = async (searchTerm?: string, accountId?: string) => {\n setIsLoading(true);\n try {\n const possibleLogGroups = await fetchLogGroups({\n logGroupPattern: searchTerm,\n accountId: accountId,\n });\n setSelectableLogGroups(\n possibleLogGroups.map((lg) => ({\n arn: lg.value.arn,\n name: lg.value.name,\n accountId: lg.accountId,\n accountLabel: lg.accountId ? accountNameById[lg.accountId] : undefined,\n }))\n );\n } catch (err) {\n setSelectableLogGroups([]);\n }\n setIsLoading(false);\n };\n\n const handleSelectCheckbox = (row: LogGroup, isChecked: boolean) => {\n if (isChecked) {\n setSelectedLogGroups([...selectedLogGroups, row]);\n } else {\n setSelectedLogGroups(selectedLogGroups.filter((lg) => lg.arn !== row.arn));\n }\n };\n\n const handleApply = () => {\n onChange(selectedLogGroups);\n toggleModal();\n };\n\n const handleCancel = () => {\n setSelectedLogGroups(selectedLogGroups);\n toggleModal();\n };\n\n return (\n <>\n <Modal className={styles.modal} title=\"Select log groups\" isOpen={isModalOpen} onDismiss={toggleModal}>\n <div className={styles.logGroupSelectionArea}>\n <div className={styles.searchField}>\n <EditorField label=\"Log group name prefix\">\n <Search\n searchFn={(phrase) => {\n searchFn(phrase, searchAccountId);\n setSearchPhrase(phrase);\n }}\n searchPhrase={searchPhrase}\n />\n </EditorField>\n </div>\n\n <Account\n onChange={(accountId?: string) => {\n searchFn(searchPhrase, accountId);\n setSearchAccountId(accountId || ALL_ACCOUNTS_OPTION.value);\n }}\n accountOptions={accountOptions}\n accountId={searchAccountId}\n />\n </div>\n <Space layout=\"block\" v={2} />\n <div>\n {!isLoading && selectableLogGroups.length >= 25 && (\n <>\n <div className={styles.limitLabel}>\n <Icon name=\"info-circle\"></Icon>\n Only the first 50 results can be shown. If you do not see an expected log group, try narrowing down your\n search.\n <p>\n A{' '}\n <TextLink\n external\n href=\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html\"\n >\n maximum{' '}\n </TextLink>{' '}\n of 50 Cloudwatch log groups can be queried at one time.\n </p>\n </div>\n <Space layout=\"block\" v={1} />\n </>\n )}\n <div className={styles.tableScroller}>\n <table className={styles.table}>\n <thead>\n <tr className={styles.row}>\n <td className={styles.cell}>Log Group</td>\n {accountOptions.length > 0 && <td className={styles.cell}>Account label</td>}\n <td className={styles.cell}>Account ID</td>\n </tr>\n </thead>\n <tbody>\n {isLoading && (\n <tr className={styles.row}>\n <td className={styles.cell}>\n <LoadingPlaceholder text={'Loading...'} />\n </td>\n </tr>\n )}\n {!isLoading && selectableLogGroups.length === 0 && (\n <tr className={styles.row}>\n <td className={styles.cell}>No log groups found</td>\n </tr>\n )}\n {!isLoading &&\n selectableLogGroups.map((row) => (\n <tr className={styles.row} key={`${row.arn}`}>\n <td className={styles.cell}>\n <div className={styles.nestedEntry}>\n <Checkbox\n id={row.arn}\n onChange={(ev) => handleSelectCheckbox(row, ev.currentTarget.checked)}\n value={!!(row.arn && selectedLogGroups.some((lg) => lg.arn === row.arn))}\n />\n <Space layout=\"inline\" h={2} />\n <label className={styles.logGroupSearchResults} htmlFor={row.arn} title={row.name}>\n {row.name}\n </label>\n </div>\n </td>\n {accountOptions.length > 0 && <td className={styles.cell}>{row.accountLabel}</td>}\n <td className={styles.cell}>{row.accountId}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n <Space layout=\"block\" v={2} />\n <Label className={styles.logGroupCountLabel}>\n {selectedLogGroupsCounter} log group{selectedLogGroupsCounter !== 1 && 's'} selected\n </Label>\n <Space layout=\"block\" v={1} />\n <EditorField\n label=\"Template variable\"\n width={26}\n tooltip=\"Optionally you can specify a single or multi-valued template variable. Select a variable separately or in conjunction with log groups.\"\n >\n <Select\n isClearable\n aria-label=\"Template variable\"\n value={currentVariableOption}\n allowCustomValue\n options={variableOptions}\n onChange={(option) => {\n const newValues = selectedLogGroups.filter((lg) => !lg.name?.startsWith('$'));\n if (option?.label) {\n newValues.push({ name: option.label, arn: option.label });\n }\n setSelectedLogGroups(newValues);\n }}\n />\n </EditorField>\n\n <Modal.ButtonRow>\n <Button onClick={handleCancel} variant=\"secondary\" type=\"button\" fill=\"outline\">\n Cancel\n </Button>\n <Button onClick={handleApply} type=\"button\">\n Add log groups\n </Button>\n </Modal.ButtonRow>\n </Modal>\n\n <div>\n <Button\n variant=\"secondary\"\n onClick={() => {\n try {\n onBeforeOpen?.();\n toggleModal();\n } catch (err) {}\n }}\n type=\"button\"\n >\n Select log groups\n </Button>\n </div>\n </>\n );\n};\n","import { useEffect, useState } from 'react';\n\nimport { Button, ConfirmModal, useStyles2 } from '@grafana/ui';\n\nimport { LogGroup } from '../../../types';\nimport getStyles from '../../styles';\n\ntype CrossAccountLogsQueryProps = {\n selectedLogGroups?: LogGroup[];\n onChange: (selectedLogGroups: LogGroup[]) => void;\n maxNoOfVisibleLogGroups?: number;\n};\n\nconst MAX_NO_OF_VISIBLE_LOG_GROUPS = 6;\n\nexport const SelectedLogGroups = ({\n selectedLogGroups = [],\n onChange,\n maxNoOfVisibleLogGroups = MAX_NO_OF_VISIBLE_LOG_GROUPS,\n}: CrossAccountLogsQueryProps) => {\n const styles = useStyles2(getStyles);\n const [showConfirm, setShowConfirm] = useState(false);\n const [visibleSelectecLogGroups, setVisibleSelectecLogGroups] = useState(\n selectedLogGroups.slice(0, MAX_NO_OF_VISIBLE_LOG_GROUPS)\n );\n\n useEffect(() => {\n setVisibleSelectecLogGroups(selectedLogGroups.slice(0, maxNoOfVisibleLogGroups));\n }, [selectedLogGroups, maxNoOfVisibleLogGroups]);\n\n return (\n <>\n <div className={styles.selectedLogGroupsContainer}>\n {visibleSelectecLogGroups.map((lg) => (\n <Button\n key={lg.arn}\n size=\"sm\"\n variant=\"secondary\"\n icon=\"times\"\n className={styles.removeButton}\n onClick={() => {\n onChange(selectedLogGroups.filter((slg) => slg.arn !== lg.arn));\n }}\n >\n {`${lg.name}${lg.accountLabel ? `(${lg.accountLabel})` : ''}`}\n </Button>\n ))}\n {visibleSelectecLogGroups.length !== selectedLogGroups.length && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n icon=\"plus\"\n fill=\"outline\"\n className={styles.removeButton}\n onClick={() => setVisibleSelectecLogGroups(selectedLogGroups)}\n >\n Show all\n </Button>\n )}\n {selectedLogGroups.length > 0 && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n icon=\"times\"\n fill=\"outline\"\n className={styles.removeButton}\n onClick={() => setShowConfirm(true)}\n >\n Clear selection\n </Button>\n )}\n </div>\n <ConfirmModal\n isOpen={showConfirm}\n title=\"Clear Log Group Selection\"\n body=\"Are you sure you want to clear all log groups?\"\n confirmText=\"Yes\"\n dismissText=\"No\"\n icon=\"exclamation-triangle\"\n onConfirm={() => {\n setShowConfirm(false);\n onChange([]);\n }}\n onDismiss={() => setShowConfirm(false)}\n />\n </>\n );\n};\n","import { css } from '@emotion/css';\nimport { useEffect, useState } from 'react';\n\nimport { config } from '@grafana/runtime';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { useAccountOptions } from '../../../hooks';\nimport { DescribeLogGroupsRequest } from '../../../resources/types';\nimport { LogGroup } from '../../../types';\nimport { isTemplateVariable } from '../../../utils/templateVariableUtils';\n\nimport { LegacyLogGroupSelection } from './LegacyLogGroupNamesSelection';\nimport { LogGroupsSelector } from './LogGroupsSelector';\nimport { SelectedLogGroups } from './SelectedLogGroups';\n\ntype Props = {\n datasource: CloudWatchDatasource;\n onChange: (logGroups: LogGroup[]) => void;\n legacyLogGroupNames?: string[];\n logGroups?: LogGroup[];\n region: string;\n maxNoOfVisibleLogGroups?: number;\n onBeforeOpen?: () => void;\n};\n\nconst logGroupStyles = css({\n display: 'flex',\n flexDirection: 'column',\n marginTop: 8,\n '& div:first-child': {\n marginBottom: 8,\n },\n});\n// used in Config Editor and in Log Query Editor\nexport const LogGroupsField = ({\n datasource,\n onChange,\n legacyLogGroupNames,\n logGroups,\n region,\n maxNoOfVisibleLogGroups,\n onBeforeOpen,\n}: Props) => {\n const accountState = useAccountOptions(datasource?.resources, region);\n const [loadingLogGroupsStarted, setLoadingLogGroupsStarted] = useState(false);\n\n useEffect(() => {\n // If log group names are stored in the query model, make a new DescribeLogGroups request for each log group to load the arn. Then update the query model.\n if (datasource && !loadingLogGroupsStarted && !logGroups?.length && legacyLogGroupNames?.length) {\n setLoadingLogGroupsStarted(true);\n\n // there's no need to migrate variables, they will be taken care of in the logs query runner\n const variables = legacyLogGroupNames.filter((lgn) => isTemplateVariable(datasource.resources.templateSrv, lgn));\n const legacyLogGroupNameValues = legacyLogGroupNames.filter(\n (lgn) => !isTemplateVariable(datasource.resources.templateSrv, lgn)\n );\n\n Promise.all(\n legacyLogGroupNameValues.map((lg) =>\n datasource.resources.getLogGroups({ region: region, logGroupNamePrefix: lg })\n )\n )\n .then((results) => {\n const logGroups = results.flatMap((r) =>\n r.map((lg) => ({\n arn: lg.value.arn,\n name: lg.value.name,\n accountId: lg.accountId,\n }))\n );\n\n onChange([...logGroups, ...variables.map((v) => ({ name: v, arn: v }))]);\n })\n .catch((err) => {\n console.error(err);\n });\n }\n }, [datasource, legacyLogGroupNames, logGroups, onChange, region, loadingLogGroupsStarted]);\n\n return (\n <div className={logGroupStyles}>\n <LogGroupsSelector\n fetchLogGroups={async (params: Partial<DescribeLogGroupsRequest>) =>\n datasource?.resources.getLogGroups({ region: region, ...params }) ?? []\n }\n onChange={onChange}\n accountOptions={accountState.value}\n selectedLogGroups={logGroups}\n onBeforeOpen={onBeforeOpen}\n variables={datasource?.getVariables()}\n />\n <SelectedLogGroups\n selectedLogGroups={logGroups ?? []}\n onChange={onChange}\n maxNoOfVisibleLogGroups={maxNoOfVisibleLogGroups}\n ></SelectedLogGroups>\n </div>\n );\n};\n\n// We had to bring back the Legacy Log Group selector to support due to an issue where GovClouds do not support the new Log Group API\n// when that is fixed we can get rid of this wrapper component and just export the LogGroupsField\ntype WrapperProps = {\n datasource: CloudWatchDatasource;\n onChange: (logGroups: LogGroup[]) => void;\n legacyLogGroupNames?: string[]; // will need this for a while for migration purposes\n logGroups?: LogGroup[];\n region: string;\n maxNoOfVisibleLogGroups?: number;\n onBeforeOpen?: () => void;\n\n // Legacy Props, can remove once we remove support for Legacy Log Group Selector\n legacyOnChange: (logGroups: string[]) => void;\n};\n\nexport const LogGroupsFieldWrapper = (props: WrapperProps) => {\n if (!config.featureToggles.cloudWatchCrossAccountQuerying) {\n return (\n <LegacyLogGroupSelection\n {...props}\n onChange={props.legacyOnChange}\n legacyLogGroupNames={props.legacyLogGroupNames || []}\n />\n );\n }\n\n return <LogGroupsField {...props} />;\n};\n","import { DataSourceJsonData, DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { ConfigSection } from '@grafana/plugin-ui';\nimport { Field, Switch } from '@grafana/ui';\n\nexport interface Props<T extends DataSourceJsonData>\n extends Pick<DataSourcePluginOptionsEditorProps<T>, 'options' | 'onOptionsChange'> {}\n\nexport interface SecureSocksProxyConfig extends DataSourceJsonData {\n enableSecureSocksProxy?: boolean;\n}\n\nexport function SecureSocksProxySettingsNewStyling<T extends SecureSocksProxyConfig>({\n options,\n onOptionsChange,\n}: Props<T>): JSX.Element {\n return (\n <ConfigSection title=\"Secure Socks Proxy\">\n <Field label=\"Enabled\" description=\"Connect to this datasource via the secure socks proxy.\">\n <Switch\n value={options.jsonData.enableSecureSocksProxy ?? false}\n onChange={(event) =>\n onOptionsChange({\n ...options,\n jsonData: { ...options.jsonData, enableSecureSocksProxy: event.currentTarget.checked },\n })\n }\n />\n </Field>\n </ConfigSection>\n );\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2, DataSourceInstanceSettings } from '@grafana/data';\nimport { ConfigSection } from '@grafana/plugin-ui';\nimport { DataSourcePicker, getDataSourceSrv } from '@grafana/runtime';\nimport { Alert, Field, InlineField, useStyles2 } from '@grafana/ui';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n infoText: css({\n paddingBottom: theme.spacing(2),\n color: theme.colors.text.secondary,\n }),\n});\n\ninterface Props {\n datasourceUid?: string;\n onChange: (uid: string) => void;\n newFormStyling?: boolean;\n}\n\nconst xRayDsId = 'grafana-x-ray-datasource';\n\nexport function XrayLinkConfig({ newFormStyling, datasourceUid, onChange }: Props) {\n const hasXrayDatasource = Boolean(getDataSourceSrv().getList({ pluginId: xRayDsId }).length);\n\n const styles = useStyles2(getStyles);\n\n return newFormStyling ? (\n <ConfigSection\n title=\"X-ray trace link\"\n description=\"Grafana will automatically create a link to a trace in X-ray data source if logs contain @xrayTraceId field\"\n >\n {!hasXrayDatasource && (\n <Alert\n title={\n 'There is no X-ray datasource to link to. First add an X-ray data source and then link it to Cloud Watch. '\n }\n severity=\"info\"\n />\n )}\n <Field htmlFor=\"data-source-picker\" label=\"Data source\" description=\"X-ray data source containing traces\">\n <DataSourcePicker\n pluginId={xRayDsId}\n onChange={(ds: DataSourceInstanceSettings) => onChange(ds.uid)}\n current={datasourceUid}\n noDefault={true}\n />\n </Field>\n </ConfigSection>\n ) : (\n <>\n <h3 className=\"page-heading\">X-ray trace link</h3>\n\n <div className={styles.infoText}>\n Grafana will automatically create a link to a trace in X-ray data source if logs contain @xrayTraceId field\n </div>\n\n {!hasXrayDatasource && (\n <Alert\n title={\n 'There is no X-ray datasource to link to. First add an X-ray data source and then link it to Cloud Watch. '\n }\n severity=\"info\"\n />\n )}\n\n <div className=\"gf-form-group\">\n <InlineField\n htmlFor=\"data-source-picker\"\n label=\"Data source\"\n labelWidth={28}\n tooltip=\"X-ray data source containing traces\"\n >\n <DataSourcePicker\n pluginId={xRayDsId}\n onChange={(ds: DataSourceInstanceSettings) => onChange(ds.uid)}\n current={datasourceUid}\n noDefault={true}\n />\n </InlineField>\n </div>\n </>\n );\n}\n","import { css } from '@emotion/css';\nimport { useEffect, useState } from 'react';\nimport { useDebounce } from 'react-use';\n\nimport { ConnectionConfig } from '@grafana/aws-sdk';\nimport {\n rangeUtil,\n DataSourcePluginOptionsEditorProps,\n onUpdateDatasourceJsonDataOption,\n updateDatasourcePluginJsonDataOption,\n DataSourceTestSucceeded,\n DataSourceTestFailed,\n GrafanaTheme2,\n} from '@grafana/data';\nimport { ConfigSection } from '@grafana/plugin-ui';\nimport { getAppEvents, usePluginInteractionReporter, getDataSourceSrv, config } from '@grafana/runtime';\nimport { Alert, Input, FieldProps, Field, Divider, useStyles2 } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { SelectableResourceValue } from '../../resources/types';\nimport { CloudWatchJsonData, CloudWatchSecureJsonData } from '../../types';\nimport { LogGroupsFieldWrapper } from '../shared/LogGroups/LogGroupsField';\n\nimport { SecureSocksProxySettingsNewStyling } from './SecureSocksProxySettingsNewStyling';\nimport { XrayLinkConfig } from './XrayLinkConfig';\n\nexport type Props = DataSourcePluginOptionsEditorProps<CloudWatchJsonData, CloudWatchSecureJsonData>;\n\ntype LogGroupFieldState = Pick<FieldProps, 'invalid'> & { error?: string | null };\n\nexport const ARN_DEPRECATION_WARNING_MESSAGE =\n 'Since grafana 7.3 authentication type \"arn\" is deprecated, falling back to default SDK provider';\nexport const CREDENTIALS_AUTHENTICATION_WARNING_MESSAGE =\n 'As of grafana 7.3 authentication type \"credentials\" should be used only for shared file credentials. \\\nIf you don\\'t have a credentials file, switch to the default SDK provider for extracting credentials \\\nfrom environment variables or IAM roles';\n\nexport const ConfigEditor = (props: Props) => {\n const { options, onOptionsChange } = props;\n const { defaultLogGroups, logsTimeout, defaultRegion, logGroups } = options.jsonData;\n const datasource = useDatasource(props);\n const logsTimeoutError = useTimoutValidation(logsTimeout);\n const saved = useDataSourceSavedState(props);\n const [logGroupFieldState, setLogGroupFieldState] = useState<LogGroupFieldState>({\n invalid: false,\n });\n\n useEffect(() => setLogGroupFieldState({ invalid: false }), [props.options]);\n const report = usePluginInteractionReporter();\n useEffect(() => {\n const successSubscription = getAppEvents().subscribe<DataSourceTestSucceeded>(DataSourceTestSucceeded, () => {\n report('grafana_plugin_cloudwatch_save_succeeded', {\n auth_type: options.jsonData.authType,\n });\n });\n const failSubscription = getAppEvents().subscribe<DataSourceTestFailed>(DataSourceTestFailed, () => {\n report('grafana_plugin_cloudwatch_save_failed', {\n auth_type: options.jsonData.authType,\n });\n });\n return () => {\n successSubscription.unsubscribe();\n failSubscription.unsubscribe();\n };\n }, [options.jsonData.authType, report]);\n const [externalId, setExternalId] = useState('');\n useEffect(() => {\n if (!externalId && datasource) {\n datasource.resources\n .getExternalId()\n .then(setExternalId)\n .catch(() => setExternalId('Unable to fetch externalId'));\n }\n }, [datasource, externalId]);\n\n const [warning, setWarning] = useState<string | null>(null);\n const dismissWarning = () => {\n setWarning(null);\n };\n useEffect(() => {\n if (options.jsonData.authType === 'arn') {\n setWarning(ARN_DEPRECATION_WARNING_MESSAGE);\n } else if (options.jsonData.authType === 'credentials' && !options.jsonData.profile && !options.jsonData.database) {\n setWarning(CREDENTIALS_AUTHENTICATION_WARNING_MESSAGE);\n }\n }, [options.jsonData.authType, options.jsonData.database, options.jsonData.profile]);\n\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.formStyles}>\n {warning && (\n <Alert title=\"CloudWatch Authentication\" severity=\"warning\" onRemove={dismissWarning}>\n {warning}\n </Alert>\n )}\n <ConnectionConfig\n {...props}\n loadRegions={\n datasource &&\n (async () => {\n return datasource.resources\n .getRegions()\n .then((regions) =>\n regions.reduce(\n (acc: string[], curr: SelectableResourceValue) => (curr.value ? [...acc, curr.value] : acc),\n []\n )\n );\n })\n }\n externalId={externalId}\n >\n <Field label=\"Namespaces of Custom Metrics\">\n <Input\n placeholder=\"Namespace1,Namespace2\"\n value={options.jsonData.customMetricsNamespaces || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'customMetricsNamespaces')}\n />\n </Field>\n </ConnectionConfig>\n {config.secureSocksDSProxyEnabled && (\n <SecureSocksProxySettingsNewStyling options={options} onOptionsChange={onOptionsChange} />\n )}\n <Divider />\n <ConfigSection title=\"Cloudwatch Logs\">\n <Field\n htmlFor=\"logsTimeout\"\n label=\"Query Result Timeout\"\n description='Grafana will poll for Cloudwatch Logs results every second until Done status is returned from AWS or timeout is exceeded, in which case Grafana will return an error. Note: For Alerting, the timeout from Grafana config file will take precedence. Must be a valid duration string, such as \"30m\" (default) \"30s\" \"2000ms\" etc.'\n invalid={Boolean(logsTimeoutError)}\n >\n <Input\n id=\"logsTimeout\"\n width={60}\n placeholder=\"30m\"\n value={options.jsonData.logsTimeout || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'logsTimeout')}\n title={'The timeout must be a valid duration string, such as \"15m\" \"30s\" \"2000ms\" etc.'}\n />\n </Field>\n <Field\n label=\"Default Log Groups\"\n description=\"Optionally, specify default log groups for CloudWatch Logs queries.\"\n {...logGroupFieldState}\n >\n {datasource ? (\n <LogGroupsFieldWrapper\n region={defaultRegion ?? ''}\n datasource={datasource}\n onBeforeOpen={() => {\n if (saved) {\n return;\n }\n\n let error = 'You need to save the data source before adding log groups.';\n if (props.options.version && props.options.version > 1) {\n error =\n 'You have unsaved connection detail changes. You need to save the data source before adding log groups.';\n }\n setLogGroupFieldState({\n invalid: true,\n error,\n });\n throw new Error(error);\n }}\n legacyLogGroupNames={defaultLogGroups}\n logGroups={logGroups}\n onChange={(updatedLogGroups) => {\n onOptionsChange({\n ...props.options,\n jsonData: {\n ...props.options.jsonData,\n logGroups: updatedLogGroups,\n defaultLogGroups: undefined,\n },\n });\n }}\n maxNoOfVisibleLogGroups={2}\n //legacy props\n legacyOnChange={(logGroups) => {\n updateDatasourcePluginJsonDataOption(props, 'defaultLogGroups', logGroups);\n }}\n />\n ) : (\n <></>\n )}\n </Field>\n </ConfigSection>\n <Divider />\n <XrayLinkConfig\n newFormStyling={true}\n onChange={(uid) => updateDatasourcePluginJsonDataOption(props, 'tracingDatasourceUid', uid)}\n datasourceUid={options.jsonData.tracingDatasourceUid}\n />\n </div>\n );\n};\n\nfunction useDatasource(props: Props) {\n const [datasource, setDatasource] = useState<CloudWatchDatasource>();\n\n useEffect(() => {\n if (props.options.version) {\n getDataSourceSrv()\n .get(props.options.name)\n .then((datasource) => {\n if (datasource instanceof CloudWatchDatasource) {\n setDatasource(datasource);\n }\n });\n }\n }, [props.options.version, props.options.name]);\n\n return datasource;\n}\n\nfunction useTimoutValidation(value: string | undefined) {\n const [err, setErr] = useState<undefined | string>(undefined);\n useDebounce(\n () => {\n if (value) {\n try {\n rangeUtil.describeInterval(value);\n setErr(undefined);\n } catch (e) {\n if (e instanceof Error) {\n setErr(e.toString());\n }\n }\n } else {\n setErr(undefined);\n }\n },\n 350,\n [value]\n );\n return err;\n}\n\nfunction useDataSourceSavedState(props: Props) {\n const [saved, setSaved] = useState(!!props.options.version && props.options.version > 1);\n useEffect(() => {\n setSaved(false);\n }, [\n props.options.jsonData.assumeRoleArn,\n props.options.jsonData.authType,\n props.options.jsonData.defaultRegion,\n props.options.jsonData.endpoint,\n props.options.jsonData.externalId,\n props.options.jsonData.profile,\n props.options.secureJsonData?.accessKey,\n props.options.secureJsonData?.secretKey,\n ]);\n\n useEffect(() => {\n props.options.version && props.options.version > 1 && setSaved(true);\n }, [props.options.version]);\n\n return saved;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n formStyles: css({\n maxWidth: theme.spacing(50),\n }),\n});\n","import { groupBy } from 'lodash';\nimport { useMemo } from 'react';\n\nimport { MetadataInspectorProps } from '@grafana/data';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { CloudWatchQuery, CloudWatchJsonData } from '../../types';\n\nexport type Props = MetadataInspectorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>;\n\n// To view: Query Editor in Dashboard -> Query Inspector -> Meta Data\nexport function MetaInspector({ data = [] }: Props) {\n const rows = useMemo(() => groupBy(data, 'refId'), [data]);\n\n return (\n <>\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n <th>RefId</th>\n <th>Metric Data Query ID</th>\n <th>Metric Data Query Expression</th>\n <th>Period</th>\n <th />\n </tr>\n </thead>\n {Object.entries(rows).map(([refId, frames], idx) => {\n if (!frames.length) {\n return null;\n }\n\n const frame = frames[0];\n const custom = frame.meta?.custom;\n if (!custom) {\n return null;\n }\n\n return (\n <tbody key={idx}>\n <tr>\n <td>{refId}</td>\n <td>{custom.id}</td>\n <td>{frame.meta?.executedQueryString}</td>\n <td>{custom.period}</td>\n </tr>\n </tbody>\n );\n })}\n </table>\n </>\n );\n}\n","import deepEqual from 'fast-deep-equal';\nimport { useEffect, useMemo } from 'react';\n\nimport { CloudWatchQuery } from '../types';\n\n/**\n * Returns queries with migrations, and calls onChange function to notify if it changes\n */\nconst useMigratedQuery = (query: CloudWatchQuery, onChangeQuery: (newQuery: CloudWatchQuery) => void) => {\n const migratedQuery = useMemo(() => migrateQuery(query), [query]);\n\n useEffect(() => {\n if (migratedQuery !== query) {\n onChangeQuery(migratedQuery);\n }\n }, [migratedQuery, query, onChangeQuery]);\n\n return migratedQuery;\n};\n\n// The frontend doesn't run legacy queries if we don't set the queryMode and region\nexport function migrateQuery(query: CloudWatchQuery): CloudWatchQuery {\n const newQuery = { ...query };\n if (!newQuery.queryMode) {\n newQuery.queryMode = 'Metrics';\n }\n if (!newQuery.region) {\n newQuery.region = 'default';\n }\n return deepEqual(newQuery, query) ? query : newQuery;\n}\n\nexport default useMigratedQuery;\n","import { useEffect, useState } from 'react';\nimport { usePrevious } from 'react-use';\n\nimport { PanelData } from '@grafana/data';\nimport { LinkButton } from '@grafana/ui';\n\nimport { AwsUrl, encodeUrl } from '../../../aws_url';\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { CloudWatchLogsQuery } from '../../../types';\n\ninterface Props {\n query: CloudWatchLogsQuery;\n panelData?: PanelData;\n datasource: CloudWatchDatasource;\n}\n\nexport function CloudWatchLink({ panelData, query, datasource }: Props) {\n const [href, setHref] = useState('');\n const prevPanelData = usePrevious<PanelData | undefined>(panelData);\n\n useEffect(() => {\n if (prevPanelData !== panelData && panelData?.request?.range) {\n const arns = (query.logGroups ?? [])\n .filter((group) => group?.arn)\n .map((group) => (group.arn ?? '').replace(/:\\*$/, '')); // remove `:*` from end of arn\n const logGroupNames = query.logGroupNames;\n let sources = arns?.length ? arns : logGroupNames;\n\n const range = panelData?.request?.range;\n const start = range.from.toISOString();\n const end = range.to.toISOString();\n\n const urlProps: AwsUrl = {\n end,\n start,\n timeType: 'ABSOLUTE',\n tz: 'UTC',\n editorString: query.expression ?? '',\n isLiveTail: false,\n source: sources ?? [],\n };\n\n setHref(encodeUrl(urlProps, datasource.resources.getActualRegion(query.region)));\n }\n }, [panelData, prevPanelData, datasource, query]);\n\n return (\n <LinkButton variant=\"secondary\" icon=\"share-alt\" href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n CloudWatch Logs Insights\n </LinkButton>\n );\n}\n","import { EditorField, EditorRow } from '@grafana/plugin-ui';\nimport { Combobox, Input } from '@grafana/ui';\n\nimport { CloudWatchLogsAnomaliesQuery } from '../../../dataquery.gen';\n\ninterface Props {\n query: CloudWatchLogsAnomaliesQuery;\n onChange: (value: CloudWatchLogsAnomaliesQuery) => void;\n}\n\nconst supressionStateOptions = [\n { label: 'All', value: 'all' },\n { label: 'Suppressed', value: 'suppressed' },\n { label: 'Unsuppressed', value: 'unsuppressed' },\n];\n\nexport const LogsAnomaliesQueryEditor = (props: Props) => {\n return (\n <>\n <EditorRow>\n <EditorField label=\"Anomaly Detection ARN\">\n <Input\n value={props.query.anomalyDetectionARN || ''}\n onChange={(e) => {\n props.onChange({ ...props.query, anomalyDetectionARN: e.currentTarget.value });\n }}\n />\n </EditorField>\n <EditorField label=\"Supression state\">\n <Combobox\n value={props.query.suppressionState ?? 'all'}\n options={supressionStateOptions}\n onChange={(e) => {\n props.onChange({ ...props.query, suppressionState: e.value });\n }}\n />\n </EditorField>\n </EditorRow>\n </>\n );\n};\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\nimport { Monaco } from '@grafana/ui';\n\nimport { Completeable } from './types';\n\nexport type LanguageDefinition = {\n id: string;\n extensions: string[];\n aliases: string[];\n mimetypes: string[];\n loader: () => Promise<{\n language: monacoType.languages.IMonarchLanguage;\n conf: monacoType.languages.LanguageConfiguration;\n }>;\n};\n\nexport const reRegisterCompletionProvider = async (\n monaco: Monaco,\n language: LanguageDefinition,\n completionItemProvider: Completeable,\n disposal?: monacoType.IDisposable\n) => {\n const { id, loader } = language;\n disposal?.dispose();\n return loader().then((monarch) => {\n return monaco.languages.registerCompletionItemProvider(\n id,\n completionItemProvider.getCompletionProvider(monaco, language)\n );\n });\n};\n\nexport const registerLanguage = async (\n monaco: Monaco,\n language: LanguageDefinition,\n completionItemProvider: Completeable\n) => {\n const { id, loader } = language;\n\n const languages = monaco.languages.getLanguages();\n if (languages.find((l) => l.id === id)) {\n return;\n }\n\n monaco.languages.register({ id });\n return loader().then((monarch) => {\n monaco.languages.setMonarchTokensProvider(id, monarch.language);\n monaco.languages.setLanguageConfiguration(id, monarch.conf);\n return monaco.languages.registerCompletionItemProvider(\n id,\n completionItemProvider.getCompletionProvider(monaco, language)\n );\n });\n};\n","const byRE = /\\s+by\\s+/im;\n\n/**\n * groups look like this: (@a.foo)( as )(bar),\n * group 1 is the field, group 2 is \" as \" and group 3 is the alias\n * this regex will not advance past any non-identifier or whitespace characters, e.g. |\n */\nconst groupsRE = /([\\w$@().]+)(?:(\\s+as\\s+)([\\w$]+))?\\s*,?\\s*/iy;\n\nexport function getStatsGroups(query: string): string[] {\n let groups = [];\n\n // find \" by \"\n let b;\n if ((b = query.match(byRE))) {\n // continue incremental scanning from there for groups & aliases\n groupsRE.lastIndex = b.index! + b[0].length;\n\n let g;\n while ((g = groupsRE.exec(query))) {\n groups.push(g[2] ? g[3] : g[1]);\n groupsRE.lastIndex = g.index + g[0].length;\n }\n }\n\n return groups;\n}\n","import { LanguageDefinition } from '../monarch/register';\n\nimport { CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID } from './language';\n\nconst cloudWatchPPLLanguageDefinition: LanguageDefinition = {\n id: CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID,\n extensions: [],\n aliases: [],\n mimetypes: [],\n loader: () => import('./language'),\n};\nexport default cloudWatchPPLLanguageDefinition;\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { useCallback, useRef } from 'react';\n\nimport { CodeEditor, Monaco } from '@grafana/ui';\nimport { CodeEditorProps } from '@grafana/ui/internal';\n\nimport { CloudWatchDatasource } from '../../../../datasource';\nimport language from '../../../../language/cloudwatch-ppl/definition';\nimport { TRIGGER_SUGGEST } from '../../../../language/monarch/commands';\nimport { registerLanguage, reRegisterCompletionProvider } from '../../../../language/monarch/register';\nimport { CloudWatchLogsQuery } from '../../../../types';\nimport { getStatsGroups } from '../../../../utils/query/getStatsGroups';\n\nexport const codeEditorCommonProps: Partial<CodeEditorProps> = {\n height: '150px',\n width: '100%',\n showMiniMap: false,\n monacoOptions: {\n // without this setting, the auto-resize functionality causes an infinite loop, don't remove it!\n scrollBeyondLastLine: false,\n\n // These additional options are style focused and are a subset of those in the query editor in Prometheus\n fontSize: 14,\n lineNumbers: 'off',\n renderLineHighlight: 'none',\n scrollbar: {\n vertical: 'hidden',\n horizontal: 'hidden',\n },\n suggestFontSize: 12,\n wordWrap: 'on',\n padding: {\n top: 6,\n },\n },\n};\ninterface LogsCodeEditorProps {\n query: CloudWatchLogsQuery;\n datasource: CloudWatchDatasource;\n onChange: (query: CloudWatchLogsQuery) => void;\n}\nexport const PPLQueryEditor = (props: LogsCodeEditorProps) => {\n const { query, datasource, onChange } = props;\n\n const monacoRef = useRef<Monaco>();\n const disposalRef = useRef<monacoType.IDisposable>();\n\n const onFocus = useCallback(async () => {\n disposalRef.current = await reRegisterCompletionProvider(\n monacoRef.current!,\n language,\n datasource.pplCompletionItemProviderFunc({\n region: query.region,\n logGroups: query.logGroups,\n }),\n disposalRef.current\n );\n }, [datasource, query.logGroups, query.region]);\n\n const onChangeQuery = useCallback(\n (value: string) => {\n const nextQuery = {\n ...query,\n expression: value,\n statsGroups: getStatsGroups(value),\n };\n onChange(nextQuery);\n },\n [onChange, query]\n );\n const onEditorMount = useCallback(\n (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n editor.onDidChangeModelContent(() => {\n const model = editor.getModel();\n if (model?.getValue().trim() === '') {\n editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {});\n }\n });\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n const text = editor.getValue();\n onChangeQuery(text);\n });\n },\n [onChangeQuery]\n );\n const onBeforeEditorMount = async (monaco: Monaco) => {\n monacoRef.current = monaco;\n disposalRef.current = await registerLanguage(\n monaco,\n language,\n datasource.pplCompletionItemProviderFunc({\n region: query.region,\n logGroups: query.logGroups,\n })\n );\n };\n return (\n <CodeEditor\n {...codeEditorCommonProps}\n language={language.id}\n value={query.expression ?? ''}\n onBlur={(value: string) => {\n if (value !== query.expression) {\n onChangeQuery(value);\n }\n disposalRef.current?.dispose();\n }}\n onFocus={onFocus}\n onBeforeEditorMount={onBeforeEditorMount}\n onEditorDidMount={onEditorMount}\n onEditorWillUnmount={() => disposalRef.current?.dispose()}\n />\n );\n};\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { useCallback, useRef } from 'react';\n\nimport { CodeEditor, Monaco } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../../datasource';\nimport language from '../../../../language/logs/definition';\nimport { TRIGGER_SUGGEST } from '../../../../language/monarch/commands';\nimport { registerLanguage, reRegisterCompletionProvider } from '../../../../language/monarch/register';\nimport { CloudWatchLogsQuery } from '../../../../types';\nimport { getStatsGroups } from '../../../../utils/query/getStatsGroups';\n\nimport { codeEditorCommonProps } from './PPLQueryEditor';\n\ninterface CodeEditorProps {\n query: CloudWatchLogsQuery;\n datasource: CloudWatchDatasource;\n onChange: (query: CloudWatchLogsQuery) => void;\n}\nexport const LogsQLCodeEditor = (props: CodeEditorProps) => {\n const { query, datasource, onChange } = props;\n\n const monacoRef = useRef<Monaco>();\n const disposalRef = useRef<monacoType.IDisposable>();\n\n const onFocus = useCallback(async () => {\n disposalRef.current = await reRegisterCompletionProvider(\n monacoRef.current!,\n language,\n datasource.logsCompletionItemProviderFunc({\n region: query.region,\n logGroups: query.logGroups,\n }),\n disposalRef.current\n );\n }, [datasource, query.logGroups, query.region]);\n\n const onChangeQuery = useCallback(\n (value: string) => {\n const nextQuery = {\n ...query,\n expression: value,\n statsGroups: getStatsGroups(value),\n };\n onChange(nextQuery);\n },\n [onChange, query]\n );\n const onEditorMount = useCallback(\n (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n editor.onDidChangeModelContent(() => {\n const model = editor.getModel();\n if (model?.getValue().trim() === '') {\n editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {});\n }\n });\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n const text = editor.getValue();\n onChangeQuery(text);\n });\n },\n [onChangeQuery]\n );\n const onBeforeEditorMount = async (monaco: Monaco) => {\n monacoRef.current = monaco;\n disposalRef.current = await registerLanguage(\n monaco,\n language,\n datasource.logsCompletionItemProviderFunc({\n region: query.region,\n logGroups: query.logGroups,\n })\n );\n };\n return (\n <CodeEditor\n {...codeEditorCommonProps}\n language={language.id}\n value={query.expression ?? ''}\n onBlur={(value: string) => {\n if (value !== query.expression) {\n onChangeQuery(value);\n }\n disposalRef.current?.dispose();\n }}\n onFocus={onFocus}\n onBeforeEditorMount={onBeforeEditorMount}\n onEditorDidMount={onEditorMount}\n onEditorWillUnmount={() => disposalRef.current?.dispose()}\n />\n );\n};\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { useCallback, useRef } from 'react';\n\nimport { CodeEditor, Monaco } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../../datasource';\nimport language from '../../../../language/cloudwatch-logs-sql/definition';\nimport { TRIGGER_SUGGEST } from '../../../../language/monarch/commands';\nimport { registerLanguage, reRegisterCompletionProvider } from '../../../../language/monarch/register';\nimport { CloudWatchLogsQuery } from '../../../../types';\nimport { getStatsGroups } from '../../../../utils/query/getStatsGroups';\n\nimport { codeEditorCommonProps } from './PPLQueryEditor';\n\ninterface SQLCodeEditorProps {\n query: CloudWatchLogsQuery;\n datasource: CloudWatchDatasource;\n onChange: (query: CloudWatchLogsQuery) => void;\n}\nexport const SQLQueryEditor = (props: SQLCodeEditorProps) => {\n const { query, datasource, onChange } = props;\n\n const monacoRef = useRef<Monaco>();\n const disposalRef = useRef<monacoType.IDisposable>();\n\n const onFocus = useCallback(async () => {\n disposalRef.current = await reRegisterCompletionProvider(\n monacoRef.current!,\n language,\n datasource.logsSqlCompletionItemProviderFunc({\n region: query.region,\n logGroups: query.logGroups,\n }),\n disposalRef.current\n );\n }, [datasource, query.logGroups, query.region]);\n\n const onChangeQuery = useCallback(\n (value: string) => {\n const nextQuery = {\n ...query,\n expression: value,\n statsGroups: getStatsGroups(value),\n };\n onChange(nextQuery);\n },\n [onChange, query]\n );\n const onEditorMount = useCallback(\n (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n editor.onDidChangeModelContent(() => {\n const model = editor.getModel();\n if (model?.getValue().trim() === '') {\n editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {});\n }\n });\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n const text = editor.getValue();\n onChangeQuery(text);\n });\n },\n [onChangeQuery]\n );\n const onBeforeEditorMount = async (monaco: Monaco) => {\n monacoRef.current = monaco;\n disposalRef.current = await registerLanguage(\n monaco,\n language,\n datasource.logsSqlCompletionItemProviderFunc({\n region: query.region,\n logGroups: query.logGroups,\n })\n );\n };\n return (\n <CodeEditor\n {...codeEditorCommonProps}\n language={language.id}\n value={query.expression ?? ''}\n onBlur={(value: string) => {\n if (value !== query.expression) {\n onChangeQuery(value);\n }\n disposalRef.current?.dispose();\n }}\n onFocus={onFocus}\n onBeforeEditorMount={onBeforeEditorMount}\n onEditorDidMount={onEditorMount}\n onEditorWillUnmount={() => disposalRef.current?.dispose()}\n />\n );\n};\n","import { css } from '@emotion/css';\nimport { ReactNode, useCallback } from 'react';\n\nimport { GrafanaTheme2, QueryEditorProps } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { CloudWatchJsonData, CloudWatchLogsQuery, CloudWatchQuery, LogsQueryLanguage } from '../../../types';\nimport { LogGroupsFieldWrapper } from '../../shared/LogGroups/LogGroupsField';\n\nimport { LogsQLCodeEditor } from './code-editors/LogsQLCodeEditor';\nimport { PPLQueryEditor } from './code-editors/PPLQueryEditor';\nimport { SQLQueryEditor } from './code-editors/SQLCodeEditor';\n\nexport interface CloudWatchLogsQueryFieldProps\n extends QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData> {\n ExtraFieldElement?: ReactNode;\n query: CloudWatchLogsQuery;\n}\nexport const CloudWatchLogsQueryField = (props: CloudWatchLogsQueryFieldProps) => {\n const { query, datasource, onChange, ExtraFieldElement } = props;\n\n const styles = useStyles2(getStyles);\n\n const onChangeLogs = useCallback(\n async (query: CloudWatchLogsQuery) => {\n onChange(query);\n },\n [onChange]\n );\n\n return (\n <>\n <LogGroupsFieldWrapper\n region={query.region}\n datasource={datasource}\n legacyLogGroupNames={query.logGroupNames}\n logGroups={query.logGroups}\n onChange={(logGroups) => {\n onChangeLogs({ ...query, logGroups, logGroupNames: undefined });\n }}\n //legacy props\n legacyOnChange={(logGroupNames) => {\n onChangeLogs({ ...query, logGroupNames });\n }}\n />\n <div>\n {getCodeEditor(query, datasource, onChange)}\n <div className={styles.editor}>{ExtraFieldElement}</div>\n </div>\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n editor: css({\n marginTop: theme.spacing(1),\n }),\n});\n\nconst getCodeEditor = (\n query: CloudWatchLogsQuery,\n datasource: CloudWatchDatasource,\n onChange: (value: CloudWatchLogsQuery) => void\n) => {\n switch (query.queryLanguage) {\n case LogsQueryLanguage.PPL:\n return <PPLQueryEditor query={query} datasource={datasource} onChange={onChange} />;\n case LogsQueryLanguage.SQL:\n return <SQLQueryEditor query={query} datasource={datasource} onChange={onChange} />;\n default:\n return <LogsQLCodeEditor query={query} datasource={datasource} onChange={onChange} />;\n }\n};\n","import { memo, useCallback, useEffect, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { InlineSelect } from '@grafana/plugin-ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { DEFAULT_CWLI_QUERY_STRING, DEFAULT_PPL_QUERY_STRING, DEFAULT_SQL_QUERY_STRING } from '../../../defaultQueries';\nimport { CloudWatchJsonData, CloudWatchLogsQuery, CloudWatchQuery, LogsMode, LogsQueryLanguage } from '../../../types';\n\nimport { CloudWatchLink } from './CloudWatchLink';\nimport { LogsAnomaliesQueryEditor } from './LogsAnomaliesQueryEditor';\nimport { CloudWatchLogsQueryField } from './LogsQueryField';\n\ntype Props = QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData> & {\n query: CloudWatchLogsQuery;\n extraHeaderElementLeft?: React.Dispatch<JSX.Element | undefined>;\n};\n\nconst logsQueryLanguageOptions: Array<SelectableValue<LogsQueryLanguage>> = [\n { label: 'Logs Insights QL', value: LogsQueryLanguage.CWLI },\n { label: 'OpenSearch SQL', value: LogsQueryLanguage.SQL },\n { label: 'OpenSearch PPL', value: LogsQueryLanguage.PPL },\n];\n\nconst logsModeOptions: Array<SelectableValue<LogsMode>> = [\n { label: 'Logs Insights', value: LogsMode.Insights },\n { label: 'Logs Anomalies', value: LogsMode.Anomalies },\n];\n\nexport const CloudWatchLogsQueryEditor = memo(function CloudWatchLogsQueryEditor(props: Props) {\n const { query, data, datasource, onChange, extraHeaderElementLeft } = props;\n\n const [isQueryNew, setIsQueryNew] = useState(true);\n\n const onQueryLanguageChange = useCallback(\n (language: LogsQueryLanguage | undefined) => {\n if (isQueryNew) {\n onChange({\n ...query,\n expression: getDefaultQueryString(language),\n queryLanguage: language ?? LogsQueryLanguage.CWLI,\n });\n } else {\n onChange({ ...query, queryLanguage: language ?? LogsQueryLanguage.CWLI });\n }\n },\n [isQueryNew, onChange, query]\n );\n\n const onLogsModeChange = useCallback(\n (logsMode: LogsMode | undefined) => {\n onChange({ ...query, logsMode });\n },\n [query, onChange]\n );\n\n // if the query has already been saved from before, we shouldn't replace it with a default one\n useEffectOnce(() => {\n if (query.expression) {\n setIsQueryNew(false);\n }\n });\n\n useEffect(() => {\n // if it's a new query, we should replace it with a default one\n if (isQueryNew && !query.expression) {\n onChange({ ...query, expression: getDefaultQueryString(query.queryLanguage) });\n }\n }, [onChange, query, isQueryNew]);\n\n useEffect(() => {\n extraHeaderElementLeft?.(\n <>\n <InlineSelect\n label=\"Logs Mode\"\n value={query.logsMode || LogsMode.Insights}\n options={logsModeOptions}\n onChange={({ value }) => {\n onLogsModeChange(value);\n }}\n />\n {query.logsMode !== LogsMode.Anomalies && (\n <InlineSelect\n label=\"Query language\"\n value={query.queryLanguage || LogsQueryLanguage.CWLI}\n options={logsQueryLanguageOptions}\n onChange={({ value }) => {\n onQueryLanguageChange(value);\n }}\n />\n )}\n </>\n );\n\n return () => {\n extraHeaderElementLeft?.(undefined);\n };\n }, [extraHeaderElementLeft, onChange, onQueryLanguageChange, query, onLogsModeChange]);\n\n const onQueryStringChange = (query: CloudWatchQuery) => {\n onChange(query);\n setIsQueryNew(false);\n };\n\n return (\n <>\n {query.logsMode === LogsMode.Anomalies ? (\n <LogsAnomaliesQueryEditor query={query} onChange={onChange} />\n ) : (\n <CloudWatchLogsQueryField\n {...props}\n onChange={onQueryStringChange}\n ExtraFieldElement={<CloudWatchLink query={query} panelData={data} datasource={datasource} />}\n />\n )}\n </>\n );\n});\n\nexport default CloudWatchLogsQueryEditor;\n\nconst getDefaultQueryString = (language: LogsQueryLanguage | undefined) => {\n switch (language) {\n case LogsQueryLanguage.SQL:\n return DEFAULT_SQL_QUERY_STRING;\n case LogsQueryLanguage.PPL:\n return DEFAULT_PPL_QUERY_STRING;\n case LogsQueryLanguage.CWLI:\n default:\n return DEFAULT_CWLI_QUERY_STRING;\n }\n};\n","import { useEffect, useMemo } from 'react';\n\nimport { CloudWatchMetricsQuery } from '../types';\n\nimport { migrateMetricQuery } from './metricQueryMigrations';\n\n/**\n * Returns queries with migrations, and calls onChange function to notify if it changes\n */\nconst useMigratedMetricsQuery = (\n query: CloudWatchMetricsQuery,\n onChangeQuery: (newQuery: CloudWatchMetricsQuery) => void\n) => {\n const migratedQuery = useMemo(() => migrateMetricQuery(query), [query]);\n\n useEffect(() => {\n if (migratedQuery !== query) {\n onChangeQuery(migratedQuery);\n }\n }, [migratedQuery, query, onChangeQuery]);\n\n return migratedQuery;\n};\n\nexport default useMigratedMetricsQuery;\n","import type { Monaco, monacoTypes } from '@grafana/ui';\n\nimport { linkedTokenBuilder } from '../monarch/linkedTokenBuilder';\nimport { LanguageDefinition } from '../monarch/register';\nimport { Completeable, CompletionItemPriority, TokenTypes } from '../monarch/types';\n\nimport { DYNAMIC_LABEL_PATTERNS } from './language';\n\ntype CompletionItem = monacoTypes.languages.CompletionItem;\n\nexport class DynamicLabelsCompletionItemProvider implements Completeable {\n tokenTypes: TokenTypes;\n\n constructor() {\n this.tokenTypes = {\n Parenthesis: 'delimiter.parenthesis.cloudwatch-dynamicLabels',\n Whitespace: 'white.cloudwatch-dynamicLabels',\n Keyword: 'keyword.cloudwatch-dynamicLabels',\n Delimiter: 'delimiter.cloudwatch-dynamicLabels',\n Operator: 'operator.cloudwatch-dynamicLabels',\n Identifier: 'identifier.cloudwatch-dynamicLabels',\n Type: 'type.cloudwatch-dynamicLabels',\n Function: 'predefined.cloudwatch-dynamicLabels',\n Number: 'number.cloudwatch-dynamicLabels',\n String: 'string.cloudwatch-dynamicLabels',\n Variable: 'variable.cloudwatch-dynamicLabels',\n Comment: 'comment.cloudwatch-dynamicLabels',\n Regexp: 'regexp.cloudwatch-dynamicLabels',\n };\n }\n\n // called by registerLanguage and passed to monaco with registerCompletionItemProvider\n // returns an object that implements https://microsoft.github.io/monaco-editor/api/interfaces/monaco.languages.CompletionItemProvider.html\n getCompletionProvider(monaco: Monaco, languageDefinition: LanguageDefinition) {\n return {\n triggerCharacters: [' ', '$', ',', '(', \"'\"], // one of these characters indicates that it is time to look for a suggestion\n provideCompletionItems: async (model: monacoTypes.editor.ITextModel, position: monacoTypes.IPosition) => {\n const currentToken = linkedTokenBuilder(monaco, languageDefinition, model, position, this.tokenTypes);\n const invalidRangeToken = currentToken?.isWhiteSpace() || currentToken?.isParenthesis();\n const range =\n invalidRangeToken || !currentToken?.range ? monaco.Range.fromPositions(position) : currentToken?.range;\n const toCompletionItem = (value: string, rest: Partial<CompletionItem> = {}) => {\n const item: CompletionItem = {\n label: value,\n insertText: value,\n kind: monaco.languages.CompletionItemKind.Field,\n range,\n sortText: CompletionItemPriority.Medium,\n ...rest,\n };\n return item;\n };\n let suggestions: CompletionItem[] = [];\n const next = currentToken?.next;\n if (!currentToken?.isFunction() && (!next || next.isWhiteSpace())) {\n suggestions = DYNAMIC_LABEL_PATTERNS.map((val) => toCompletionItem(val));\n // always insert suggestion for dimension value and allow user to complete pattern by providing the dimension name\n suggestions.push(\n toCompletionItem(\"${PROP('Dim.')}\", {\n sortText: CompletionItemPriority.High,\n insertText: `\\${PROP('Dim.$0')} `,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n })\n );\n }\n\n return {\n suggestions,\n };\n },\n };\n }\n}\n","import { LanguageDefinition } from '../monarch/register';\n\nconst cloudWatchDynamicLabelsLanguageDefinition: LanguageDefinition = {\n id: 'cloudwatch-dynamicLabels',\n extensions: [],\n aliases: [],\n mimetypes: [],\n loader: () => import('./language'),\n};\nexport default cloudWatchDynamicLabelsLanguageDefinition;\n","import { css, cx } from '@emotion/css';\nimport type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { useCallback, useRef } from 'react';\n\nimport { CodeEditor, getInputStyles, Monaco, useTheme2 } from '@grafana/ui';\n\nimport { DynamicLabelsCompletionItemProvider } from '../../../language/dynamic-labels/CompletionItemProvider';\nimport language from '../../../language/dynamic-labels/definition';\nimport { TRIGGER_SUGGEST } from '../../../language/monarch/commands';\nimport { registerLanguage } from '../../../language/monarch/register';\n\nconst dynamicLabelsCompletionItemProvider = new DynamicLabelsCompletionItemProvider();\n\nexport interface Props {\n onChange: (query: string) => void;\n label: string;\n width: number;\n}\n\nexport function DynamicLabelsField({ label, width, onChange }: Props) {\n const theme = useTheme2();\n const styles = getInputStyles({ theme, width });\n const containerRef = useRef<HTMLDivElement>(null);\n const onEditorMount = useCallback(\n (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n const text = editor.getValue();\n onChange(text);\n });\n\n const containerDiv = containerRef.current;\n containerDiv !== null && editor.layout({ width: containerDiv.clientWidth, height: containerDiv.clientHeight });\n },\n [onChange]\n );\n\n return (\n <div ref={containerRef} className={cx(styles.wrapper)}>\n <CodeEditor\n containerStyles={css({\n border: `1px solid ${theme.colors.action.disabledBackground}`,\n '&:hover': {\n borderColor: theme.components.input.borderColor,\n },\n })}\n monacoOptions={{\n // without this setting, the auto-resize functionality causes an infinite loop, don't remove it!\n scrollBeyondLastLine: false,\n\n // These additional options are style focused and are a subset of those in the query editor in Prometheus\n fontSize: 14,\n lineNumbers: 'off',\n renderLineHighlight: 'none',\n overviewRulerLanes: 0,\n scrollbar: {\n vertical: 'hidden',\n horizontal: 'hidden',\n },\n suggestFontSize: 12,\n padding: {\n top: 6,\n },\n }}\n language={language.id}\n value={label}\n onBlur={(value) => {\n if (value !== label) {\n onChange(value);\n }\n }}\n onBeforeEditorMount={(monaco: Monaco) =>\n registerLanguage(monaco, language, dynamicLabelsCompletionItemProvider)\n }\n onEditorDidMount={onEditorMount}\n />\n </div>\n );\n}\n","import { LanguageDefinition } from '../monarch/register';\n\nconst cloudWatchMetricMathLanguageDefinition: LanguageDefinition = {\n id: 'cloudwatch-MetricMath',\n extensions: [],\n aliases: [],\n mimetypes: [],\n loader: () => import('./language'),\n};\nexport default cloudWatchMetricMathLanguageDefinition;\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { useCallback, useRef } from 'react';\nimport * as React from 'react';\n\nimport { CodeEditor, Monaco } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport language from '../../../language/metric-math/definition';\nimport { TRIGGER_SUGGEST } from '../../../language/monarch/commands';\nimport { registerLanguage } from '../../../language/monarch/register';\n\nexport interface Props {\n onChange: (query: string) => void;\n expression: string;\n datasource: CloudWatchDatasource;\n}\n\nexport function MathExpressionQueryField({ expression: query, onChange, datasource }: React.PropsWithChildren<Props>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const onEditorMount = useCallback(\n (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n const text = editor.getValue();\n onChange(text);\n });\n\n // auto resizes the editor to be the height of the content it holds\n // this code comes from the Prometheus query editor.\n // We may wish to consider abstracting it into the grafana/ui repo in the future\n const updateElementHeight = () => {\n const containerDiv = containerRef.current;\n if (containerDiv !== null) {\n const maxPixelHeight = Math.min(200, editor.getContentHeight());\n const pixelHeight = Math.max(32, maxPixelHeight);\n containerDiv.style.height = `${pixelHeight}px`;\n containerDiv.style.width = '100%';\n const pixelWidth = containerDiv.clientWidth;\n editor.layout({ width: pixelWidth, height: pixelHeight });\n }\n };\n\n editor.onDidContentSizeChange(updateElementHeight);\n updateElementHeight();\n },\n [onChange]\n );\n\n return (\n <div ref={containerRef}>\n <CodeEditor\n monacoOptions={{\n // without this setting, the auto-resize functionality causes an infinite loop, don't remove it!\n scrollBeyondLastLine: false,\n\n // These additional options are style focused and are a subset of those in the query editor in Prometheus\n fontSize: 14,\n lineNumbers: 'off',\n renderLineHighlight: 'none',\n scrollbar: {\n vertical: 'hidden',\n horizontal: 'hidden',\n },\n suggestFontSize: 12,\n wordWrap: 'on',\n padding: {\n top: 6,\n },\n }}\n language={language.id}\n value={query}\n onBlur={(value) => {\n if (value !== query) {\n onChange(value);\n }\n }}\n onBeforeEditorMount={(monaco: Monaco) =>\n registerLanguage(monaco, language, datasource.metricMathCompletionItemProvider)\n }\n onEditorDidMount={onEditorMount}\n />\n </div>\n );\n}\n","// Array of reserved keywords in metrics insights, taken from\n//https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-metrics-insights-reserved-keywords.html\nexport const InsightsReservedKeywords = [\n 'ABORT',\n 'ABORTSESSION',\n 'ABS',\n 'ABSOLUTE',\n 'ACCESS',\n 'ACCESSIBLE',\n 'ACCESS_LOCK',\n 'ACCOUNT',\n 'ACOS',\n 'ACOSH',\n 'ACTION',\n 'ADD',\n 'ADD_MONTHS',\n 'ADMIN',\n 'AFTER',\n 'AGGREGATE',\n 'ALIAS',\n 'ALL',\n 'ALLOCATE',\n 'ALLOW',\n 'ALTER',\n 'ALTERAND',\n 'AMP',\n 'ANALYSE',\n 'ANALYZE',\n 'AND',\n 'ANSIDATE',\n 'ANY',\n 'ARE',\n 'ARRAY',\n 'ARRAY_AGG',\n 'ARRAY_EXISTS',\n 'ARRAY_MAX_CARDINALITY',\n 'AS',\n 'ASC',\n 'ASENSITIVE',\n 'ASIN',\n 'ASINH',\n 'ASSERTION',\n 'ASSOCIATE',\n 'ASUTIME',\n 'ASYMMETRIC',\n 'AT',\n 'ATAN',\n 'ATAN2',\n 'ATANH',\n 'ATOMIC',\n 'AUDIT',\n 'AUTHORIZATION',\n 'AUX',\n 'AUXILIARY',\n 'AVE',\n 'AVERAGE',\n 'AVG',\n 'BACKUP',\n 'BEFORE',\n 'BEGIN',\n 'BEGIN_FRAME',\n 'BEGIN_PARTITION',\n 'BETWEEN',\n 'BIGINT',\n 'BINARY',\n 'BIT',\n 'BLOB',\n 'BOOLEAN',\n 'BOTH',\n 'BREADTH',\n 'BREAK',\n 'BROWSE',\n 'BT',\n 'BUFFERPOOL',\n 'BULK',\n 'BUT',\n 'BY',\n 'BYTE',\n 'BYTEINT',\n 'BYTES',\n 'CALL',\n 'CALLED',\n 'CAPTURE',\n 'CARDINALITY',\n 'CASCADE',\n 'CASCADED',\n 'CASE',\n 'CASESPECIFIC',\n 'CASE_N',\n 'CAST',\n 'CATALOG',\n 'CCSID',\n 'CD',\n 'CEIL',\n 'CEILING',\n 'CHANGE',\n 'CHAR',\n 'CHAR2HEXINT',\n 'CHARACTER',\n 'CHARACTERS',\n 'CHARACTER_LENGTH',\n 'CHARS',\n 'CHAR_LENGTH',\n 'CHECK',\n 'CHECKPOINT',\n 'CLASS',\n 'CLASSIFIER',\n 'CLOB',\n 'CLONE',\n 'CLOSE',\n 'CLUSTER',\n 'CLUSTERED',\n 'CM',\n 'COALESCE',\n 'COLLATE',\n 'COLLATION',\n 'COLLECT',\n 'COLLECTION',\n 'COLLID',\n 'COLUMN',\n 'COLUMN_VALUE',\n 'COMMENT',\n 'COMMIT',\n 'COMPLETION',\n 'COMPRESS',\n 'COMPUTE',\n 'CONCAT',\n 'CONCURRENTLY',\n 'CONDITION',\n 'CONNECT',\n 'CONNECTION',\n 'CONSTRAINT',\n 'CONSTRAINTS',\n 'CONSTRUCTOR',\n 'CONTAINS',\n 'CONTAINSTABLE',\n 'CONTENT',\n 'CONTINUE',\n 'CONVERT',\n 'CONVERT_TABLE_HEADER',\n 'COPY',\n 'CORR',\n 'CORRESPONDING',\n 'COS',\n 'COSH',\n 'COUNT',\n 'COVAR_POP',\n 'COVAR_SAMP',\n 'CREATE',\n 'CROSS',\n 'CS',\n 'CSUM',\n 'CT',\n 'CUBE',\n 'CUME_DIST',\n 'CURRENT',\n 'CURRENT_CATALOG',\n 'CURRENT_DATE',\n 'CURRENT_DEFAULT_TRANSFORM_GROUP',\n 'CURRENT_LC_CTYPE',\n 'CURRENT_PATH',\n 'CURRENT_ROLE',\n 'CURRENT_ROW',\n 'CURRENT_SCHEMA',\n 'CURRENT_SERVER',\n 'CURRENT_TIME',\n 'CURRENT_TIMESTAMP',\n 'CURRENT_TIMEZONE',\n 'CURRENT_TRANSFORM_GROUP_FOR_TYPE',\n 'CURRENT_USER',\n 'CURRVAL',\n 'CURSOR',\n 'CV',\n 'CYCLE',\n 'DATA',\n 'DATABASE',\n 'DATABASES',\n 'DATABLOCKSIZE',\n 'DATE',\n 'DATEFORM',\n 'DAY',\n 'DAYS',\n 'DAY_HOUR',\n 'DAY_MICROSECOND',\n 'DAY_MINUTE',\n 'DAY_SECOND',\n 'DBCC',\n 'DBINFO',\n 'DEALLOCATE',\n 'DEC',\n 'DECFLOAT',\n 'DECIMAL',\n 'DECLARE',\n 'DEFAULT',\n 'DEFERRABLE',\n 'DEFERRED',\n 'DEFINE',\n 'DEGREES',\n 'DEL',\n 'DELAYED',\n 'DELETE',\n 'DENSE_RANK',\n 'DENY',\n 'DEPTH',\n 'DEREF',\n 'DESC',\n 'DESCRIBE',\n 'DESCRIPTOR',\n 'DESTROY',\n 'DESTRUCTOR',\n 'DETERMINISTIC',\n 'DIAGNOSTIC',\n 'DIAGNOSTICS',\n 'DICTIONARY',\n 'DISABLE',\n 'DISABLED',\n 'DISALLOW',\n 'DISCONNECT',\n 'DISK',\n 'DISTINCT',\n 'DISTINCTROW',\n 'DISTRIBUTED',\n 'DIV',\n 'DO',\n 'DOCUMENT',\n 'DOMAIN',\n 'DOUBLE',\n 'DROP',\n 'DSSIZE',\n 'DUAL',\n 'DUMP',\n 'DYNAMIC',\n 'EACH',\n 'ECHO',\n 'EDITPROC',\n 'ELEMENT',\n 'ELSE',\n 'ELSEIF',\n 'EMPTY',\n 'ENABLED',\n 'ENCLOSED',\n 'ENCODING',\n 'ENCRYPTION',\n 'END',\n 'END-EXEC',\n 'ENDING',\n 'END_FRAME',\n 'END_PARTITION',\n 'EQ',\n 'EQUALS',\n 'ERASE',\n 'ERRLVL',\n 'ERROR',\n 'ERRORFILES',\n 'ERRORTABLES',\n 'ESCAPE',\n 'ESCAPED',\n 'ET',\n 'EVERY',\n 'EXCEPT',\n 'EXCEPTION',\n 'EXCLUSIVE',\n 'EXEC',\n 'EXECUTE',\n 'EXISTS',\n 'EXIT',\n 'EXP',\n 'EXPLAIN',\n 'EXTERNAL',\n 'EXTRACT',\n 'FALLBACK',\n 'FALSE',\n 'FASTEXPORT',\n 'FENCED',\n 'FETCH',\n 'FIELDPROC',\n 'FILE',\n 'FILLFACTOR',\n 'FILTER',\n 'FINAL',\n 'FIRST',\n 'FIRST_VALUE',\n 'FLOAT',\n 'FLOAT4',\n 'FLOAT8',\n 'FLOOR',\n 'FOR',\n 'FORCE',\n 'FOREIGN',\n 'FORMAT',\n 'FOUND',\n 'FRAME_ROW',\n 'FREE',\n 'FREESPACE',\n 'FREETEXT',\n 'FREETEXTTABLE',\n 'FREEZE',\n 'FROM',\n 'FULL',\n 'FULLTEXT',\n 'FUNCTION',\n 'FUSION',\n 'GE',\n 'GENERAL',\n 'GENERATED',\n 'GET',\n 'GIVE',\n 'GLOBAL',\n 'GO',\n 'GOTO',\n 'GRANT',\n 'GRAPHIC',\n 'GROUP',\n 'GROUPING',\n 'GROUPS',\n 'GT',\n 'HANDLER',\n 'HASH',\n 'HASHAMP',\n 'HASHBAKAMP',\n 'HASHBUCKET',\n 'HASHROW',\n 'HAVING',\n 'HELP',\n 'HIGH_PRIORITY',\n 'HOLD',\n 'HOLDLOCK',\n 'HOUR',\n 'HOURS',\n 'HOUR_MICROSECOND',\n 'HOUR_MINUTE',\n 'HOUR_SECOND',\n 'IDENTIFIED',\n 'IDENTITY',\n 'IDENTITYCOL',\n 'IDENTITY_INSERT',\n 'IF',\n 'IGNORE',\n 'ILIKE',\n 'IMMEDIATE',\n 'IN',\n 'INCLUSIVE',\n 'INCONSISTENT',\n 'INCREMENT',\n 'INDEX',\n 'INDICATOR',\n 'INFILE',\n 'INHERIT',\n 'INITIAL',\n 'INITIALIZE',\n 'INITIALLY',\n 'INITIATE',\n 'INNER',\n 'INOUT',\n 'INPUT',\n 'INS',\n 'INSENSITIVE',\n 'INSERT',\n 'INSTEAD',\n 'INT',\n 'INT1',\n 'INT2',\n 'INT3',\n 'INT4',\n 'INT8',\n 'INTEGER',\n 'INTEGERDATE',\n 'INTERSECT',\n 'INTERSECTION',\n 'INTERVAL',\n 'INTO',\n 'IO_AFTER_GTIDS',\n 'IO_BEFORE_GTIDS',\n 'IS',\n 'ISNULL',\n 'ISOBID',\n 'ISOLATION',\n 'ITERATE',\n 'JAR',\n 'JOIN',\n 'JOURNAL',\n 'JSON_ARRAY',\n 'JSON_ARRAYAGG',\n 'JSON_EXISTS',\n 'JSON_OBJECT',\n 'JSON_OBJECTAGG',\n 'JSON_QUERY',\n 'JSON_TABLE',\n 'JSON_TABLE_PRIMITIVE',\n 'JSON_VALUE',\n 'KEEP',\n 'KEY',\n 'KEYS',\n 'KILL',\n 'KURTOSIS',\n 'LABEL',\n 'LAG',\n 'LANGUAGE',\n 'LARGE',\n 'LAST',\n 'LAST_VALUE',\n 'LATERAL',\n 'LC_CTYPE',\n 'LE',\n 'LEAD',\n 'LEADING',\n 'LEAVE',\n 'LEFT',\n 'LESS',\n 'LEVEL',\n 'LIKE',\n 'LIKE_REGEX',\n 'LIMIT',\n 'LINEAR',\n 'LINENO',\n 'LINES',\n 'LISTAGG',\n 'LN',\n 'LOAD',\n 'LOADING',\n 'LOCAL',\n 'LOCALE',\n 'LOCALTIME',\n 'LOCALTIMESTAMP',\n 'LOCATOR',\n 'LOCATORS',\n 'LOCK',\n 'LOCKING',\n 'LOCKMAX',\n 'LOCKSIZE',\n 'LOG',\n 'LOG10',\n 'LOGGING',\n 'LOGON',\n 'LONG',\n 'LONGBLOB',\n 'LONGTEXT',\n 'LOOP',\n 'LOWER',\n 'LOW_PRIORITY',\n 'LT',\n 'MACRO',\n 'MAINTAINED',\n 'MAP',\n 'MASTER_BIND',\n 'MASTER_SSL_VERIFY_SERVER_CERT',\n 'MATCH',\n 'MATCHES',\n 'MATCH_NUMBER',\n 'MATCH_RECOGNIZE',\n 'MATERIALIZED',\n 'MAVG',\n 'MAX',\n 'MAXEXTENTS',\n 'MAXIMUM',\n 'MAXVALUE',\n 'MCHARACTERS',\n 'MDIFF',\n 'MEDIUMBLOB',\n 'MEDIUMINT',\n 'MEDIUMTEXT',\n 'MEMBER',\n 'MERGE',\n 'METHOD',\n 'MICROSECOND',\n 'MICROSECONDS',\n 'MIDDLEINT',\n 'MIN',\n 'MINDEX',\n 'MINIMUM',\n 'MINUS',\n 'MINUTE',\n 'MINUTES',\n 'MINUTE_MICROSECOND',\n 'MINUTE_SECOND',\n 'MLINREG',\n 'MLOAD',\n 'MLSLABEL',\n 'MOD',\n 'MODE',\n 'MODIFIES',\n 'MODIFY',\n 'MODULE',\n 'MONITOR',\n 'MONRESOURCE',\n 'MONSESSION',\n 'MONTH',\n 'MONTHS',\n 'MSUBSTR',\n 'MSUM',\n 'MULTISET',\n 'NAMED',\n 'NAMES',\n 'NATIONAL',\n 'NATURAL',\n 'NCHAR',\n 'NCLOB',\n 'NE',\n 'NESTED_TABLE_ID',\n 'NEW',\n 'NEW_TABLE',\n 'NEXT',\n 'NEXTVAL',\n 'NO',\n 'NOAUDIT',\n 'NOCHECK',\n 'NOCOMPRESS',\n 'NONCLUSTERED',\n 'NONE',\n 'NORMALIZE',\n 'NOT',\n 'NOTNULL',\n 'NOWAIT',\n 'NO_WRITE_TO_BINLOG',\n 'NTH_VALUE',\n 'NTILE',\n 'NULL',\n 'NULLIF',\n 'NULLIFZERO',\n 'NULLS',\n 'NUMBER',\n 'NUMERIC',\n 'NUMPARTS',\n 'OBID',\n 'OBJECT',\n 'OBJECTS',\n 'OCCURRENCES_REGEX',\n 'OCTET_LENGTH',\n 'OF',\n 'OFF',\n 'OFFLINE',\n 'OFFSET',\n 'OFFSETS',\n 'OLD',\n 'OLD_TABLE',\n 'OMIT',\n 'ON',\n 'ONE',\n 'ONLINE',\n 'ONLY',\n 'OPEN',\n 'OPENDATASOURCE',\n 'OPENQUERY',\n 'OPENROWSET',\n 'OPENXML',\n 'OPERATION',\n 'OPTIMIZATION',\n 'OPTIMIZE',\n 'OPTIMIZER_COSTS',\n 'OPTION',\n 'OPTIONALLY',\n 'OR',\n 'ORDER',\n 'ORDINALITY',\n 'ORGANIZATION',\n 'OUT',\n 'OUTER',\n 'OUTFILE',\n 'OUTPUT',\n 'OVER',\n 'OVERLAPS',\n 'OVERLAY',\n 'OVERRIDE',\n 'PACKAGE',\n 'PAD',\n 'PADDED',\n 'PARAMETER',\n 'PARAMETERS',\n 'PART',\n 'PARTIAL',\n 'PARTITION',\n 'PARTITIONED',\n 'PARTITIONING',\n 'PASSWORD',\n 'PATH',\n 'PATTERN',\n 'PCTFREE',\n 'PER',\n 'PERCENT',\n 'PERCENTILE',\n 'PERCENTILE_CONT',\n 'PERCENTILE_DISC',\n 'PERCENT_RANK',\n 'PERIOD',\n 'PERM',\n 'PERMANENT',\n 'PIECESIZE',\n 'PIVOT',\n 'PLACING',\n 'PLAN',\n 'PORTION',\n 'POSITION',\n 'POSITION_REGEX',\n 'POSTFIX',\n 'POWER',\n 'PRECEDES',\n 'PRECISION',\n 'PREFIX',\n 'PREORDER',\n 'PREPARE',\n 'PRESERVE',\n 'PREVVAL',\n 'PRIMARY',\n 'PRINT',\n 'PRIOR',\n 'PRIQTY',\n 'PRIVATE',\n 'PRIVILEGES',\n 'PROC',\n 'PROCEDURE',\n 'PROFILE',\n 'PROGRAM',\n 'PROPORTIONAL',\n 'PROTECTION',\n 'PSID',\n 'PTF',\n 'PUBLIC',\n 'PURGE',\n 'QUALIFIED',\n 'QUALIFY',\n 'QUANTILE',\n 'QUERY',\n 'QUERYNO',\n 'RADIANS',\n 'RAISERROR',\n 'RANDOM',\n 'RANGE',\n 'RANGE_N',\n 'RANK',\n 'RAW',\n 'READ',\n 'READS',\n 'READTEXT',\n 'READ_WRITE',\n 'REAL',\n 'RECONFIGURE',\n 'RECURSIVE',\n 'REF',\n 'REFERENCES',\n 'REFERENCING',\n 'REFRESH',\n 'REGEXP',\n 'REGR_AVGX',\n 'REGR_AVGY',\n 'REGR_COUNT',\n 'REGR_INTERCEPT',\n 'REGR_R2',\n 'REGR_SLOPE',\n 'REGR_SXX',\n 'REGR_SXY',\n 'REGR_SYY',\n 'RELATIVE',\n 'RELEASE',\n 'RENAME',\n 'REPEAT',\n 'REPLACE',\n 'REPLICATION',\n 'REPOVERRIDE',\n 'REQUEST',\n 'REQUIRE',\n 'RESIGNAL',\n 'RESOURCE',\n 'RESTART',\n 'RESTORE',\n 'RESTRICT',\n 'RESULT',\n 'RESULT_SET_LOCATOR',\n 'RESUME',\n 'RET',\n 'RETRIEVE',\n 'RETURN',\n 'RETURNING',\n 'RETURNS',\n 'REVALIDATE',\n 'REVERT',\n 'REVOKE',\n 'RIGHT',\n 'RIGHTS',\n 'RLIKE',\n 'ROLE',\n 'ROLLBACK',\n 'ROLLFORWARD',\n 'ROLLUP',\n 'ROUND_CEILING',\n 'ROUND_DOWN',\n 'ROUND_FLOOR',\n 'ROUND_HALF_DOWN',\n 'ROUND_HALF_EVEN',\n 'ROUND_HALF_UP',\n 'ROUND_UP',\n 'ROUTINE',\n 'ROW',\n 'ROWCOUNT',\n 'ROWGUIDCOL',\n 'ROWID',\n 'ROWNUM',\n 'ROWS',\n 'ROWSET',\n 'ROW_NUMBER',\n 'RULE',\n 'RUN',\n 'RUNNING',\n 'SAMPLE',\n 'SAMPLEID',\n 'SAVE',\n 'SAVEPOINT',\n 'SCHEMA',\n 'SCHEMAS',\n 'SCOPE',\n 'SCRATCHPAD',\n 'SCROLL',\n 'SEARCH',\n 'SECOND',\n 'SECONDS',\n 'SECOND_MICROSECOND',\n 'SECQTY',\n 'SECTION',\n 'SECURITY',\n 'SECURITYAUDIT',\n 'SEEK',\n 'SEL',\n 'SELECT',\n 'SEMANTICKEYPHRASETABLE',\n 'SEMANTICSIMILARITYDETAILSTABLE',\n 'SEMANTICSIMILARITYTABLE',\n 'SENSITIVE',\n 'SEPARATOR',\n 'SEQUENCE',\n 'SESSION',\n 'SESSION_USER',\n 'SET',\n 'SETRESRATE',\n 'SETS',\n 'SETSESSRATE',\n 'SETUSER',\n 'SHARE',\n 'SHOW',\n 'SHUTDOWN',\n 'SIGNAL',\n 'SIMILAR',\n 'SIMPLE',\n 'SIN',\n 'SINH',\n 'SIZE',\n 'SKEW',\n 'SKIP',\n 'SMALLINT',\n 'SOME',\n 'SOUNDEX',\n 'SOURCE',\n 'SPACE',\n 'SPATIAL',\n 'SPECIFIC',\n 'SPECIFICTYPE',\n 'SPOOL',\n 'SQL',\n 'SQLEXCEPTION',\n 'SQLSTATE',\n 'SQLTEXT',\n 'SQLWARNING',\n 'SQL_BIG_RESULT',\n 'SQL_CALC_FOUND_ROWS',\n 'SQL_SMALL_RESULT',\n 'SQRT',\n 'SS',\n 'SSL',\n 'STANDARD',\n 'START',\n 'STARTING',\n 'STARTUP',\n 'STAT',\n 'STATE',\n 'STATEMENT',\n 'STATIC',\n 'STATISTICS',\n 'STAY',\n 'STDDEV_POP',\n 'STDDEV_SAMP',\n 'STEPINFO',\n 'STOGROUP',\n 'STORED',\n 'STORES',\n 'STRAIGHT_JOIN',\n 'STRING_CS',\n 'STRUCTURE',\n 'STYLE',\n 'SUBMULTISET',\n 'SUBSCRIBER',\n 'SUBSET',\n 'SUBSTR',\n 'SUBSTRING',\n 'SUBSTRING_REGEX',\n 'SUCCEEDS',\n 'SUCCESSFUL',\n 'SUM',\n 'SUMMARY',\n 'SUSPEND',\n 'SYMMETRIC',\n 'SYNONYM',\n 'SYSDATE',\n 'SYSTEM',\n 'SYSTEM_TIME',\n 'SYSTEM_USER',\n 'SYSTIMESTAMP',\n 'TABLE',\n 'TABLESAMPLE',\n 'TABLESPACE',\n 'TAN',\n 'TANH',\n 'TBL_CS',\n 'TEMPORARY',\n 'TERMINATE',\n 'TERMINATED',\n 'TEXTSIZE',\n 'THAN',\n 'THEN',\n 'THRESHOLD',\n 'TIME',\n 'TIMESTAMP',\n 'TIMEZONE_HOUR',\n 'TIMEZONE_MINUTE',\n 'TINYBLOB',\n 'TINYINT',\n 'TINYTEXT',\n 'TITLE',\n 'TO',\n 'TOP',\n 'TRACE',\n 'TRAILING',\n 'TRAN',\n 'TRANSACTION',\n 'TRANSLATE',\n 'TRANSLATE_CHK',\n 'TRANSLATE_REGEX',\n 'TRANSLATION',\n 'TREAT',\n 'TRIGGER',\n 'TRIM',\n 'TRIM_ARRAY',\n 'TRUE',\n 'TRUNCATE',\n 'TRY_CONVERT',\n 'TSEQUAL',\n 'TYPE',\n 'UC',\n 'UESCAPE',\n 'UID',\n 'UNDEFINED',\n 'UNDER',\n 'UNDO',\n 'UNION',\n 'UNIQUE',\n 'UNKNOWN',\n 'UNLOCK',\n 'UNNEST',\n 'UNPIVOT',\n 'UNSIGNED',\n 'UNTIL',\n 'UPD',\n 'UPDATE',\n 'UPDATETEXT',\n 'UPPER',\n 'UPPERCASE',\n 'USAGE',\n 'USE',\n 'USER',\n 'USING',\n 'UTC_DATE',\n 'UTC_TIME',\n 'UTC_TIMESTAMP',\n 'VALIDATE',\n 'VALIDPROC',\n 'VALUE',\n 'VALUES',\n 'VALUE_OF',\n 'VARBINARY',\n 'VARBYTE',\n 'VARCHAR',\n 'VARCHAR2',\n 'VARCHARACTER',\n 'VARGRAPHIC',\n 'VARIABLE',\n 'VARIADIC',\n 'VARIANT',\n 'VARYING',\n 'VAR_POP',\n 'VAR_SAMP',\n 'VCAT',\n 'VERBOSE',\n 'VERSIONING',\n 'VIEW',\n 'VIRTUAL',\n 'VOLATILE',\n 'VOLUMES',\n 'WAIT',\n 'WAITFOR',\n 'WHEN',\n 'WHENEVER',\n 'WHERE',\n 'WHILE',\n 'WIDTH_BUCKET',\n 'WINDOW',\n 'WITH',\n 'WITHIN',\n 'WITHIN_GROUP',\n 'WITHOUT',\n 'WLM',\n 'WORK',\n 'WRITE',\n 'WRITETEXT',\n 'XMLCAST',\n 'XMLEXISTS',\n 'XMLNAMESPACES',\n 'XOR',\n 'YEAR',\n 'YEARS',\n 'YEAR_MONTH',\n 'ZEROFILL',\n 'ZEROIFNULL',\n 'ZONE',\n];\n","import { toLower } from 'lodash';\n\nimport { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\n\nimport {\n QueryEditorArrayExpression,\n QueryEditorExpression,\n QueryEditorExpressionType,\n QueryEditorFunctionExpression,\n QueryEditorOperatorExpression,\n QueryEditorPropertyExpression,\n} from '../../expressions';\nimport { SQLExpression } from '../../types';\n\nimport { InsightsReservedKeywords } from './consts';\n\nconst isAccountIdDefined = (accountId: string | undefined): boolean => !!(accountId && accountId !== 'all');\n\nexport default class SQLGenerator {\n constructor(private templateSrv: TemplateSrv = getTemplateSrv()) {}\n\n expressionToSqlQuery(\n { select, from, where, groupBy, orderBy, orderByDirection, limit }: SQLExpression,\n accountId?: string\n ): string | undefined {\n if (!from || !select?.name || !select?.parameters?.length) {\n return undefined;\n }\n\n let parts: string[] = [];\n this.appendSelect(select, parts);\n this.appendFrom(from, parts);\n this.appendAccountId(parts, accountId);\n this.appendWhere(where, parts, true, where?.expressions?.length ?? 0, accountId);\n this.appendGroupBy(groupBy, parts);\n this.appendOrderBy(orderBy, orderByDirection, parts);\n this.appendLimit(limit, parts);\n\n return parts.join(' ');\n }\n\n private appendSelect(select: QueryEditorFunctionExpression | undefined, parts: string[]) {\n parts.push('SELECT');\n this.appendFunction(select, parts);\n }\n\n private appendFrom(from: QueryEditorPropertyExpression | QueryEditorFunctionExpression | undefined, parts: string[]) {\n parts.push('FROM');\n from?.type === QueryEditorExpressionType.Function\n ? this.appendFunction(from, parts)\n : parts.push(this.formatValue(from?.property?.name ?? ''));\n }\n\n private appendAccountId(parts: string[], accountId?: string) {\n if (!isAccountIdDefined(accountId)) {\n return;\n }\n parts.push(`WHERE AWS.AccountId = '${accountId}'`);\n }\n\n private appendWhere(\n filter: QueryEditorExpression | undefined,\n parts: string[],\n isTopLevelExpression: boolean,\n topLevelExpressionsCount: number,\n accountId?: string\n ) {\n if (!filter) {\n return;\n }\n\n const hasChildExpressions = 'expressions' in filter && filter.expressions.length > 0;\n if (isTopLevelExpression && hasChildExpressions) {\n if (isAccountIdDefined(accountId)) {\n parts.push('AND');\n } else {\n parts.push('WHERE');\n }\n }\n\n if (filter.type === QueryEditorExpressionType.And) {\n const andParts: string[] = [];\n filter.expressions.map((exp) => this.appendWhere(exp, andParts, false, topLevelExpressionsCount));\n if (andParts.length === 0) {\n return;\n }\n const andCombined = andParts.join(' AND ');\n const wrapInParentheses = !isTopLevelExpression && topLevelExpressionsCount > 1 && andParts.length > 1;\n return parts.push(wrapInParentheses ? `(${andCombined})` : andCombined);\n }\n\n if (filter.type === QueryEditorExpressionType.Or) {\n const orParts: string[] = [];\n filter.expressions.map((exp) => this.appendWhere(exp, orParts, false, topLevelExpressionsCount));\n if (orParts.length === 0) {\n return;\n }\n const orCombined = orParts.join(' OR ');\n const wrapInParentheses = !isTopLevelExpression && topLevelExpressionsCount > 1 && orParts.length > 1;\n parts.push(wrapInParentheses ? `(${orCombined})` : orCombined);\n return;\n }\n\n if (filter.type === QueryEditorExpressionType.Operator) {\n return this.appendOperator(filter, parts);\n }\n }\n\n private appendGroupBy(groupBy: QueryEditorArrayExpression | undefined, parts: string[]) {\n const groupByParts: string[] = [];\n for (const expression of groupBy?.expressions ?? []) {\n if (expression?.type !== QueryEditorExpressionType.GroupBy || !expression.property.name) {\n continue;\n }\n groupByParts.push(this.formatValue(expression.property.name));\n }\n\n if (groupByParts.length > 0) {\n parts.push(`GROUP BY ${groupByParts.join(', ')}`);\n }\n }\n\n private appendOrderBy(\n orderBy: QueryEditorFunctionExpression | undefined,\n orderByDirection: string | undefined,\n parts: string[]\n ) {\n if (orderBy) {\n parts.push('ORDER BY');\n this.appendFunction(orderBy, parts);\n parts.push(orderByDirection ?? 'ASC');\n }\n }\n\n private appendLimit(limit: number | undefined, parts: string[]) {\n limit && parts.push(`LIMIT ${limit}`);\n }\n\n private appendOperator(expression: QueryEditorOperatorExpression, parts: string[], prefix?: string) {\n const { property, operator } = expression;\n\n if (!property.name || !operator.name || !operator.value) {\n return;\n }\n\n parts.push(`${this.formatValue(property.name)} ${operator.name} '${operator.value}'`);\n }\n\n private appendFunction(select: QueryEditorFunctionExpression | undefined, parts: string[]) {\n if (!select?.name) {\n return;\n }\n\n const params = (select.parameters ?? [])\n .map((p) => p.name && this.formatValue(p.name))\n .filter(Boolean)\n .join(', ');\n\n parts.push(`${select.name}(${params})`);\n }\n\n private formatValue(label: string): string {\n const specialCharacters = /[/\\s\\.%-]/; // slash, space, dot, percent, or dash\n const startsWithNumber = /^\\d/;\n\n const interpolated = this.templateSrv.replace(label, {}, 'raw');\n if (interpolated !== 'AWS.AccountId') {\n // AWS.AccountId should never be in quotes\n if (\n specialCharacters.test(interpolated) ||\n startsWithNumber.test(interpolated) ||\n InsightsReservedKeywords.some((e) => toLower(e) === toLower(interpolated))\n ) {\n return `\"${label}\"`;\n }\n }\n\n return label;\n }\n}\n","import { SelectableValue } from '@grafana/data';\n\nimport {\n QueryEditorExpressionType,\n QueryEditorPropertyType,\n QueryEditorFunctionParameterExpression,\n QueryEditorArrayExpression,\n QueryEditorOperatorExpression,\n QueryEditorGroupByExpression,\n} from '../../../../expressions';\nimport { SCHEMA } from '../../../../language/cloudwatch-sql/language';\nimport { SQLExpression, CloudWatchMetricsQuery, Dimensions } from '../../../../types';\n\nexport function getMetricNameFromExpression(selectExpression: SQLExpression['select']): string | undefined {\n return selectExpression?.parameters?.[0].name;\n}\n\nexport function getNamespaceFromExpression(fromExpression: SQLExpression['from']): string | undefined {\n // It's just a simple `FROM \"AWS/EC2\"` expression\n if (fromExpression?.type === QueryEditorExpressionType.Property) {\n return fromExpression.property.name; // PR TODO: do we need to test the type here? It can only be string?\n }\n\n // It's a more complicated `FROM SCHEMA(\"AWS/EC2\", ...)` expression\n if (fromExpression?.type === QueryEditorExpressionType.Function) {\n // TODO: do we need to test the name of the function?\n return fromExpression.parameters?.[0].name;\n }\n\n return undefined;\n}\n\nexport function getSchemaLabelKeys(fromExpression: SQLExpression['from']): string[] | undefined {\n // Schema label keys are second to n arguments in the from expression function\n if (fromExpression?.type === QueryEditorExpressionType.Function && fromExpression?.parameters?.length) {\n if (fromExpression?.parameters?.length <= 1) {\n return [];\n }\n\n // ignore the first arg (the namespace)\n const paramExpressions = fromExpression?.parameters.slice(1);\n return paramExpressions.reduce<string[]>((acc, curr) => (curr.name ? [...acc, curr.name] : acc), []);\n }\n\n return undefined;\n}\n\nexport function isUsingWithSchema(fromExpression: SQLExpression['from']): boolean {\n return fromExpression?.type === QueryEditorExpressionType.Function && fromExpression.name === SCHEMA;\n}\n\n/** Given a partial operator expression, return a non-partial if it's valid, or undefined */\nexport function sanitizeOperator(\n expression: Partial<QueryEditorOperatorExpression>\n): QueryEditorOperatorExpression | undefined {\n const key = expression.property?.name;\n const value = expression.operator?.value;\n const operator = expression.operator?.name;\n\n if (key && value && operator) {\n return {\n type: QueryEditorExpressionType.Operator,\n property: {\n type: QueryEditorPropertyType.String,\n name: key,\n },\n operator: {\n value,\n name: operator,\n },\n };\n }\n\n return undefined;\n}\n\n/**\n * Given an array of Expressions, flattens them to the leaf Operator expressions.\n * Note, this loses context of any nested ANDs or ORs, so will not be useful once we support nested conditions */\nfunction flattenOperatorExpressions(\n expressions: QueryEditorArrayExpression['expressions']\n): QueryEditorOperatorExpression[] {\n return expressions.flatMap((expression) => {\n if (expression.type === QueryEditorExpressionType.Operator) {\n return expression;\n }\n\n if (expression.type === QueryEditorExpressionType.And || expression.type === QueryEditorExpressionType.Or) {\n return flattenOperatorExpressions(expression.expressions);\n }\n\n // Expressions that we don't expect to find in the WHERE filter will be ignored\n return [];\n });\n}\n\n/** Returns a flattened list of WHERE filters, losing all context of nested filters or AND vs OR. Not suitable\n * if the UI supports nested conditions\n */\nexport function getFlattenedFilters(sql: SQLExpression): QueryEditorOperatorExpression[] {\n const where = sql.where;\n return flattenOperatorExpressions(where?.expressions ?? []);\n}\n\n/**\n * Given an array of Expressions, flattens them to the leaf Operator expressions.\n * Note, this loses context of any nested ANDs or ORs, so will not be useful once we support nested conditions */\nfunction flattenGroupByExpressions(\n expressions: QueryEditorArrayExpression['expressions']\n): QueryEditorGroupByExpression[] {\n return expressions.flatMap((expression) => {\n if (expression.type === QueryEditorExpressionType.GroupBy) {\n return expression;\n }\n\n // Expressions that we don't expect to find in the GROUP BY will be ignored\n return [];\n });\n}\n\n/** Returns a flattened list of GROUP BY expressions, losing all context of nested filters or AND vs OR.\n */\nexport function getFlattenedGroupBys(sql: SQLExpression): QueryEditorGroupByExpression[] {\n const groupBy = sql.groupBy;\n return flattenGroupByExpressions(groupBy?.expressions ?? []);\n}\n\n/** Converts a string array to a Dimensions object with null values **/\nexport function stringArrayToDimensions(arr: string[]): Dimensions {\n return arr.reduce((acc, curr) => {\n if (curr) {\n return { ...acc, [curr]: null };\n }\n return acc;\n }, {});\n}\n\nexport function setSql(query: CloudWatchMetricsQuery, sql: SQLExpression): CloudWatchMetricsQuery {\n return {\n ...query,\n sql: {\n ...(query.sql ?? {}),\n ...sql,\n },\n };\n}\n\nexport function setNamespace(query: CloudWatchMetricsQuery, namespace: string | undefined): CloudWatchMetricsQuery {\n const sql = query.sql ?? {};\n //updating `namespace` props for CloudWatchMetricsQuery\n query.namespace = namespace ? namespace : '';\n\n if (namespace === undefined) {\n return setSql(query, {\n from: undefined,\n });\n }\n\n // It's just a simple `FROM \"AWS/EC2\"` expression\n if (!sql.from || sql.from.type === QueryEditorExpressionType.Property) {\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Property,\n property: {\n type: QueryEditorPropertyType.String,\n name: namespace,\n },\n },\n });\n }\n\n // It's a more complicated `FROM SCHEMA(\"AWS/EC2\", ...)` expression\n if (sql.from.type === QueryEditorExpressionType.Function) {\n const namespaceParam: QueryEditorFunctionParameterExpression = {\n type: QueryEditorExpressionType.FunctionParameter,\n name: namespace,\n };\n\n const labelKeys = (sql.from.parameters ?? []).slice(1);\n\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Function,\n name: SCHEMA,\n parameters: [namespaceParam, ...labelKeys],\n },\n });\n }\n\n // TODO: do the with schema bit\n return query;\n}\n\nexport function setSchemaLabels(\n query: CloudWatchMetricsQuery,\n schemaLabels: Array<SelectableValue<string>> | SelectableValue<string>\n): CloudWatchMetricsQuery {\n const sql = query.sql ?? {};\n schemaLabels = Array.isArray(schemaLabels) ? schemaLabels.map((l) => l.value) : [schemaLabels.value];\n\n // schema labels are the second parameter in the schema function. `... FROM SCHEMA(\"AWS/EC2\", label1, label2 ...)`\n if (sql.from?.type === QueryEditorExpressionType.Function && sql.from.parameters?.length) {\n const parameters: QueryEditorFunctionParameterExpression[] = (schemaLabels ?? []).map((label: string) => ({\n type: QueryEditorExpressionType.FunctionParameter,\n name: label,\n }));\n const namespaceParam = (sql.from.parameters ?? [])[0];\n\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Function,\n name: SCHEMA,\n parameters: [namespaceParam, ...parameters],\n },\n });\n }\n\n return query;\n}\n\nexport function setMetricName(query: CloudWatchMetricsQuery, metricName: string): CloudWatchMetricsQuery {\n const param: QueryEditorFunctionParameterExpression = {\n type: QueryEditorExpressionType.FunctionParameter,\n name: metricName,\n };\n\n return setSql(\n { ...query, metricName },\n {\n select: {\n type: QueryEditorExpressionType.Function,\n ...(query.sql?.select ?? {}),\n parameters: [param],\n },\n }\n );\n}\n\nexport function removeMetricName(query: CloudWatchMetricsQuery): CloudWatchMetricsQuery {\n const queryWithNoParams = { ...query };\n delete queryWithNoParams.sql?.select?.parameters;\n\n return queryWithNoParams;\n}\n\nexport function setAggregation(query: CloudWatchMetricsQuery, aggregation: string): CloudWatchMetricsQuery {\n return setSql(query, {\n select: {\n type: QueryEditorExpressionType.Function,\n ...(query.sql?.select ?? {}),\n name: aggregation,\n },\n });\n}\n\nexport function setOrderBy(query: CloudWatchMetricsQuery, aggregation: string): CloudWatchMetricsQuery {\n return setSql(query, {\n orderBy: {\n type: QueryEditorExpressionType.Function,\n name: aggregation,\n },\n });\n}\n\nexport function setWithSchema(query: CloudWatchMetricsQuery, withSchema: boolean): CloudWatchMetricsQuery {\n const namespace = getNamespaceFromExpression((query.sql ?? {}).from);\n\n if (withSchema) {\n const namespaceParam: QueryEditorFunctionParameterExpression = {\n type: QueryEditorExpressionType.FunctionParameter,\n name: namespace,\n };\n\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Function,\n name: SCHEMA,\n parameters: [namespaceParam],\n },\n });\n }\n\n return setSql(query, {\n from: {\n type: QueryEditorExpressionType.Property,\n property: {\n type: QueryEditorPropertyType.String,\n name: namespace,\n },\n },\n });\n}\n\n/** Sets the left hand side (InstanceId) in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionProperty(\n expression: Partial<QueryEditorOperatorExpression>,\n property: string\n): QueryEditorOperatorExpression {\n return {\n type: QueryEditorExpressionType.Operator,\n property: {\n type: QueryEditorPropertyType.String,\n name: property,\n },\n operator: expression.operator ?? {},\n };\n}\n\n/** Sets the operator (\"==\") in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionName(\n expression: Partial<QueryEditorOperatorExpression>,\n name: string\n): QueryEditorOperatorExpression {\n return {\n type: QueryEditorExpressionType.Operator,\n property: expression.property ?? {\n type: QueryEditorPropertyType.String,\n },\n operator: {\n ...expression.operator,\n name,\n },\n };\n}\n\n/** Sets the right hand side (\"i-abc123445\") in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionValue(\n expression: Partial<QueryEditorOperatorExpression>,\n value: string\n): QueryEditorOperatorExpression {\n return {\n type: QueryEditorExpressionType.Operator,\n property: expression.property ?? {\n type: QueryEditorPropertyType.String,\n },\n operator: {\n ...expression.operator,\n value,\n },\n };\n}\n\n/** Creates a GroupByExpression for a specified field\n */\nexport function setGroupByField(field: string): QueryEditorGroupByExpression {\n return {\n type: QueryEditorExpressionType.GroupBy,\n property: {\n type: QueryEditorPropertyType.String,\n name: field,\n },\n };\n}\n","import { useEffect, useMemo } from 'react';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { EditorField, EditorFieldGroup, EditorSwitch } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { Select } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../../datasource';\nimport { useAccountOptions, useDimensionKeys, useMetrics, useNamespaces } from '../../../../hooks';\nimport { STATISTICS } from '../../../../language/cloudwatch-sql/language';\nimport { CloudWatchMetricsQuery } from '../../../../types';\nimport { appendTemplateVariables } from '../../../../utils/utils';\nimport { Account } from '../../../shared/Account';\n\nimport {\n getMetricNameFromExpression,\n getNamespaceFromExpression,\n getSchemaLabelKeys as getSchemaLabels,\n isUsingWithSchema,\n removeMetricName,\n setAggregation,\n setMetricName,\n setNamespace,\n setSchemaLabels,\n setWithSchema,\n stringArrayToDimensions,\n} from './utils';\n\ninterface SQLBuilderSelectRowProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst AGGREGATIONS = STATISTICS.map(toOption);\n\nconst SQLBuilderSelectRow = ({ datasource, query, onQueryChange }: SQLBuilderSelectRowProps) => {\n const sql = query.sql ?? {};\n\n const aggregation = sql.select?.name;\n useEffect(() => {\n if (!aggregation) {\n onQueryChange(setAggregation(query, STATISTICS[0]));\n }\n }, [aggregation, onQueryChange, query]);\n\n const metricName = getMetricNameFromExpression(sql.select);\n const namespace = getNamespaceFromExpression(sql.from);\n const schemaLabels = getSchemaLabels(sql.from);\n const withSchemaEnabled = isUsingWithSchema(sql.from);\n\n const namespaceOptions = useNamespaces(datasource);\n const metricOptions = useMetrics(datasource, {\n region: query.region,\n namespace,\n ...(config.featureToggles.cloudWatchCrossAccountQuerying && { accountId: query.accountId }),\n });\n const existingFilters = useMemo(() => stringArrayToDimensions(schemaLabels ?? []), [schemaLabels]);\n const unusedDimensionKeys = useDimensionKeys(datasource, {\n region: query.region,\n namespace,\n metricName,\n dimensionFilters: existingFilters,\n ...(config.featureToggles.cloudWatchCrossAccountQuerying && { accountId: query.accountId }),\n });\n const dimensionKeys = useMemo(\n () => (schemaLabels?.length ? [...unusedDimensionKeys, ...schemaLabels.map(toOption)] : unusedDimensionKeys),\n [unusedDimensionKeys, schemaLabels]\n );\n\n const onNamespaceChange = async (query: CloudWatchMetricsQuery) => {\n const validatedQuery = await validateMetricName(query);\n onQueryChange(validatedQuery);\n };\n\n const validateMetricName = async (query: CloudWatchMetricsQuery) => {\n let { region, sql, namespace } = query;\n await datasource.resources.getMetrics({ namespace, region }).then((result: Array<SelectableValue<string>>) => {\n if (!result.some((metric) => metric.value === metricName)) {\n sql = removeMetricName(query).sql;\n }\n });\n return { ...query, sql };\n };\n\n const accountState = useAccountOptions(datasource.resources, query.region);\n return (\n <>\n <EditorFieldGroup>\n {config.featureToggles.cloudWatchCrossAccountQuerying && (\n <Account\n accountId={query.accountId}\n accountOptions={accountState.value || []}\n onChange={(accountId) => {\n onQueryChange({\n ...query,\n accountId,\n });\n }}\n />\n )}\n <EditorField label=\"Namespace\" width={16}>\n <Select\n aria-label=\"Namespace\"\n value={namespace ? toOption(namespace) : null}\n inputId={`${query.refId}-cloudwatch-sql-namespace`}\n options={namespaceOptions}\n allowCustomValue\n onChange={({ value }) => value && onNamespaceChange(setNamespace(query, value))}\n />\n </EditorField>\n\n <EditorField label=\"With schema\">\n <EditorSwitch\n id={`${query.refId}-cloudwatch-sql-withSchema`}\n value={withSchemaEnabled}\n onChange={(ev) =>\n ev.target instanceof HTMLInputElement && onQueryChange(setWithSchema(query, ev.target.checked))\n }\n />\n </EditorField>\n\n {withSchemaEnabled && (\n <EditorField label=\"Schema labels\" disabled={!namespace}>\n <Select\n id={`${query.refId}-cloudwatch-sql-schema-label-keys`}\n width=\"auto\"\n isMulti={true}\n value={schemaLabels ? schemaLabels.map(toOption) : null}\n options={dimensionKeys}\n allowCustomValue\n onChange={(item) => item && onQueryChange(setSchemaLabels(query, item))}\n />\n </EditorField>\n )}\n </EditorFieldGroup>\n\n <EditorFieldGroup>\n <EditorField label=\"Metric name\" width={16}>\n <Select\n aria-label=\"Metric name\"\n value={metricName ? toOption(metricName) : null}\n options={metricOptions}\n allowCustomValue\n onChange={({ value }) => value && onQueryChange(setMetricName(query, value))}\n />\n </EditorField>\n\n <EditorField label=\"Aggregation\" width={16}>\n <Select\n aria-label=\"Aggregation\"\n value={aggregation ? toOption(aggregation) : null}\n options={appendTemplateVariables(datasource, AGGREGATIONS)}\n onChange={({ value }) => value && onQueryChange(setAggregation(query, value))}\n />\n </EditorField>\n </EditorFieldGroup>\n </>\n );\n};\n\nexport default SQLBuilderSelectRow;\n","import { css } from '@emotion/css';\nimport { useMemo, useState } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { AccessoryButton, EditorList, InputGroup } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { Alert, Select, useStyles2 } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../../datasource';\nimport {\n QueryEditorExpressionType,\n QueryEditorOperatorExpression,\n QueryEditorPropertyType,\n} from '../../../../expressions';\nimport { useDimensionKeys, useEnsureVariableHasSingleSelection } from '../../../../hooks';\nimport { COMPARISON_OPERATORS, EQUALS } from '../../../../language/cloudwatch-sql/language';\nimport { CloudWatchMetricsQuery } from '../../../../types';\nimport { appendTemplateVariables } from '../../../../utils/utils';\n\nimport {\n getFlattenedFilters,\n getMetricNameFromExpression,\n getNamespaceFromExpression,\n sanitizeOperator,\n setOperatorExpressionName,\n setOperatorExpressionProperty,\n setOperatorExpressionValue,\n setSql,\n} from './utils';\n\ninterface SQLFilterProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst OPERATORS = COMPARISON_OPERATORS.map(toOption);\n\nconst SQLFilter = ({ query, onQueryChange, datasource }: SQLFilterProps) => {\n const filtersFromQuery = useMemo(() => getFlattenedFilters(query.sql ?? {}), [query.sql]);\n const [filters, setFilters] = useState<QueryEditorOperatorExpression[]>(filtersFromQuery);\n\n const onChange = (newItems: Array<Partial<QueryEditorOperatorExpression>>) => {\n // As new (empty object) items come in, with need to make sure they have the correct type\n const cleaned = newItems.map(\n (v): QueryEditorOperatorExpression => ({\n type: QueryEditorExpressionType.Operator,\n property: v.property ?? { type: QueryEditorPropertyType.String },\n operator: v.operator ?? {\n name: EQUALS,\n },\n })\n );\n\n setFilters(cleaned);\n\n // Only save valid and complete filters into the query state\n const validExpressions: QueryEditorOperatorExpression[] = [];\n for (const operatorExpression of cleaned) {\n const validated = sanitizeOperator(operatorExpression);\n if (validated) {\n validExpressions.push(validated);\n }\n }\n\n const where = validExpressions.length\n ? {\n type: QueryEditorExpressionType.And as const,\n expressions: validExpressions,\n }\n : undefined;\n\n onQueryChange(setSql(query, { where }));\n };\n\n return <EditorList items={filters} onChange={onChange} renderItem={makeRenderFilter(datasource, query)} />;\n};\n\n// Making component functions in the render body is not recommended, but it works for now.\n// If some problems arise (perhaps with state going missing), consider this to be a potential cause\nfunction makeRenderFilter(datasource: CloudWatchDatasource, query: CloudWatchMetricsQuery) {\n function renderFilter(\n item: Partial<QueryEditorOperatorExpression>,\n onChange: (item: QueryEditorOperatorExpression) => void,\n onDelete: () => void\n ) {\n return <FilterItem datasource={datasource} query={query} filter={item} onChange={onChange} onDelete={onDelete} />;\n }\n\n return renderFilter;\n}\n\nexport default SQLFilter;\n\ninterface FilterItemProps {\n datasource: CloudWatchDatasource;\n query: CloudWatchMetricsQuery;\n filter: Partial<QueryEditorOperatorExpression>;\n onChange: (item: QueryEditorOperatorExpression) => void;\n onDelete: () => void;\n}\n\nconst FilterItem = (props: FilterItemProps) => {\n const { datasource, query, filter, onChange, onDelete } = props;\n const styles = useStyles2(getStyles);\n const sql = query.sql ?? {};\n\n const namespace = getNamespaceFromExpression(sql.from);\n const metricName = getMetricNameFromExpression(sql.select);\n\n const dimensionKeys = useDimensionKeys(datasource, {\n region: query.region,\n namespace,\n metricName,\n ...(config.featureToggles.cloudWatchCrossAccountQuerying && { accountId: query.accountId }),\n });\n\n const loadDimensionValues = async () => {\n if (!filter.property?.name || !namespace) {\n return [];\n }\n\n return datasource.resources\n .getDimensionValues({\n region: query.region,\n namespace,\n metricName,\n dimensionKey: filter.property.name,\n ...(config.featureToggles.cloudWatchCrossAccountQuerying && { accountId: query.accountId }),\n })\n .then((result: Array<SelectableValue<string>>) => {\n return appendTemplateVariables(datasource, result);\n });\n };\n\n const [state, loadOptions] = useAsyncFn(loadDimensionValues, [\n query.region,\n namespace,\n metricName,\n filter.property?.name,\n ]);\n\n const propertyNameError = useEnsureVariableHasSingleSelection(datasource, filter.property?.name);\n const operatorValueError = useEnsureVariableHasSingleSelection(\n datasource,\n typeof filter.operator?.value === 'string' ? filter.operator?.value : undefined\n );\n\n return (\n <div className={styles.container}>\n <InputGroup>\n <Select\n width=\"auto\"\n value={filter.property?.name ? toOption(filter.property?.name) : null}\n options={dimensionKeys}\n allowCustomValue\n onChange={({ value }) => value && onChange(setOperatorExpressionProperty(filter, value))}\n />\n\n <Select\n width=\"auto\"\n value={filter.operator?.name && toOption(filter.operator.name)}\n options={OPERATORS}\n onChange={({ value }) => value && onChange(setOperatorExpressionName(filter, value))}\n />\n\n <Select\n width=\"auto\"\n isLoading={state.loading}\n value={\n filter.operator?.value && typeof filter.operator?.value === 'string'\n ? toOption(filter.operator?.value)\n : null\n }\n options={state.value}\n allowCustomValue\n onOpenMenu={loadOptions}\n onChange={({ value }) => value && onChange(setOperatorExpressionValue(filter, value))}\n />\n\n <AccessoryButton aria-label=\"remove\" icon=\"times\" variant=\"secondary\" onClick={onDelete} />\n </InputGroup>\n\n {propertyNameError && (\n <Alert className={styles.alert} title={propertyNameError} severity=\"error\" topSpacing={1} />\n )}\n {operatorValueError && (\n <Alert className={styles.alert} title={operatorValueError} severity=\"error\" topSpacing={1} />\n )}\n </div>\n );\n};\n\nconst getStyles = () => ({\n container: css({ display: 'inline-block' }),\n alert: css({ minWidth: '100%', width: 'min-content' }),\n});\n","import { useMemo, useState } from 'react';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { AccessoryButton, EditorList, InputGroup } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { Select } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../../datasource';\nimport {\n QueryEditorExpressionType,\n QueryEditorGroupByExpression,\n QueryEditorPropertyType,\n} from '../../../../expressions';\nimport { useDimensionKeys, useIsMonitoringAccount } from '../../../../hooks';\nimport { CloudWatchMetricsQuery } from '../../../../types';\n\nimport {\n getFlattenedGroupBys,\n getMetricNameFromExpression,\n getNamespaceFromExpression,\n setGroupByField,\n setSql,\n} from './utils';\n\ninterface SQLGroupByProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst SQLGroupBy = ({ query, datasource, onQueryChange }: SQLGroupByProps) => {\n const sql = query.sql ?? {};\n const groupBysFromQuery = useMemo(() => getFlattenedGroupBys(query.sql ?? {}), [query.sql]);\n const [items, setItems] = useState<QueryEditorGroupByExpression[]>(groupBysFromQuery);\n const isMonitoringAccount = useIsMonitoringAccount(datasource.resources, query.region);\n\n const namespace = getNamespaceFromExpression(sql.from);\n const metricName = getMetricNameFromExpression(sql.select);\n\n const baseOptions = useDimensionKeys(datasource, { region: query.region, namespace, metricName });\n const options = useMemo(\n // Exclude options we've already selected\n () => {\n const isCrossAccountEnabled = config.featureToggles.cloudWatchCrossAccountQuerying;\n\n const baseOptionsWithAccountId =\n isCrossAccountEnabled && isMonitoringAccount\n ? [{ label: 'Account ID', value: 'AWS.AccountId' }, ...baseOptions]\n : baseOptions;\n return baseOptionsWithAccountId.filter(\n (option) => !groupBysFromQuery.some((v) => v.property.name === option.value)\n );\n },\n [baseOptions, groupBysFromQuery, isMonitoringAccount]\n );\n\n const onChange = (newItems: Array<Partial<QueryEditorGroupByExpression>>) => {\n // As new (empty object) items come in, with need to make sure they have the correct type\n const cleaned = newItems.map(\n (v): QueryEditorGroupByExpression => ({\n type: QueryEditorExpressionType.GroupBy,\n property: {\n type: QueryEditorPropertyType.String,\n name: v.property?.name,\n },\n })\n );\n\n setItems(cleaned);\n\n // Only save complete expressions into the query state;\n const completeExpressions = cleaned.filter((v) => v.property?.name);\n\n const groupBy = completeExpressions.length\n ? {\n type: QueryEditorExpressionType.And as const,\n expressions: completeExpressions,\n }\n : undefined;\n\n onQueryChange(setSql(query, { groupBy }));\n };\n\n return <EditorList items={items} onChange={onChange} renderItem={makeRenderItem(options)} />;\n};\n\nfunction makeRenderItem(options: Array<SelectableValue<string>>) {\n function renderItem(\n item: Partial<QueryEditorGroupByExpression>,\n onChange: (item: QueryEditorGroupByExpression) => void,\n onDelete: () => void\n ) {\n return <GroupByItem options={options} item={item} onChange={onChange} onDelete={onDelete} />;\n }\n\n return renderItem;\n}\n\ninterface GroupByItemProps {\n options: Array<SelectableValue<string>>;\n item: Partial<QueryEditorGroupByExpression>;\n onChange: (item: QueryEditorGroupByExpression) => void;\n onDelete: () => void;\n}\n\nconst GroupByItem = (props: GroupByItemProps) => {\n const { options, item, onChange, onDelete } = props;\n const fieldName = item.property?.name;\n\n return (\n <InputGroup>\n <Select\n aria-label={`Group by ${fieldName ?? 'filter key'}`}\n width=\"auto\"\n value={fieldName ? toOption(fieldName) : null}\n options={options}\n allowCustomValue\n onChange={({ value }) => value && onChange(setGroupByField(value))}\n />\n\n <AccessoryButton aria-label=\"remove\" icon=\"times\" variant=\"secondary\" onClick={onDelete} />\n </InputGroup>\n );\n};\n\nexport default SQLGroupBy;\n","import { SelectableValue, toOption } from '@grafana/data';\nimport { AccessoryButton, EditorField, EditorFieldGroup, InputGroup } from '@grafana/plugin-ui';\nimport { Select } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../../datasource';\nimport { ASC, DESC, STATISTICS } from '../../../../language/cloudwatch-sql/language';\nimport { CloudWatchMetricsQuery } from '../../../../types';\nimport { appendTemplateVariables } from '../../../../utils/utils';\n\nimport { setOrderBy, setSql } from './utils';\n\ninterface SQLBuilderSelectRowProps {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst orderByDirections: Array<SelectableValue<string>> = [\n { label: ASC, value: ASC },\n { label: DESC, value: DESC },\n];\n\nconst SQLOrderByGroup = ({ query, onQueryChange, datasource }: SQLBuilderSelectRowProps) => {\n const sql = query.sql ?? {};\n const orderBy = sql.orderBy?.name;\n const orderByDirection = sql.orderByDirection;\n\n return (\n <EditorFieldGroup>\n <EditorField label=\"Order by\" optional width={16}>\n <InputGroup>\n <Select\n aria-label=\"Order by\"\n onChange={({ value }) => value && onQueryChange(setOrderBy(query, value))}\n options={appendTemplateVariables(datasource, STATISTICS.map(toOption))}\n value={orderBy ? toOption(orderBy) : null}\n />\n {orderBy && (\n <AccessoryButton\n aria-label=\"remove\"\n icon=\"times\"\n variant=\"secondary\"\n onClick={() => onQueryChange(setSql(query, { orderBy: undefined }))}\n />\n )}\n </InputGroup>\n </EditorField>\n\n <EditorField label=\"Direction\" disabled={!orderBy} width={16}>\n <Select\n aria-label=\"Direction\"\n inputId=\"cloudwatch-sql-order-by-direction\"\n value={orderByDirection ? toOption(orderByDirection) : orderByDirections[0]}\n options={appendTemplateVariables(datasource, orderByDirections)}\n onChange={(item) => item && onQueryChange(setSql(query, { orderByDirection: item.value }))}\n />\n </EditorField>\n </EditorFieldGroup>\n );\n};\n\nexport default SQLOrderByGroup;\n","import { useCallback, useEffect, useState } from 'react';\nimport * as React from 'react';\n\nimport { EditorField, EditorRow, EditorRows } from '@grafana/plugin-ui';\nimport { Input } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../../datasource';\nimport SQLGenerator from '../../../../language/cloudwatch-sql/SQLGenerator';\nimport { CloudWatchMetricsQuery } from '../../../../types';\n\nimport SQLBuilderSelectRow from './SQLBuilderSelectRow';\nimport SQLFilter from './SQLFilter';\nimport SQLGroupBy from './SQLGroupBy';\nimport SQLOrderByGroup from './SQLOrderByGroup';\nimport { setSql } from './utils';\n\nexport type Props = {\n query: CloudWatchMetricsQuery;\n datasource: CloudWatchDatasource;\n onChange: (value: CloudWatchMetricsQuery) => void;\n};\n\nexport const SQLBuilderEditor = ({ query, datasource, onChange }: React.PropsWithChildren<Props>) => {\n const sql = query.sql ?? {};\n\n const onQueryChange = useCallback(\n (query: CloudWatchMetricsQuery) => {\n const sqlGenerator = new SQLGenerator();\n const sqlString = sqlGenerator.expressionToSqlQuery(query.sql ?? {}, query.accountId);\n const fullQuery = {\n ...query,\n sqlExpression: sqlString,\n };\n\n onChange(fullQuery);\n },\n [onChange]\n );\n\n const [sqlPreview, setSQLPreview] = useState<string | undefined>();\n useEffect(() => {\n const sqlGenerator = new SQLGenerator();\n const sqlString = sqlGenerator.expressionToSqlQuery(query.sql ?? {}, query.accountId);\n if (sqlPreview !== sqlString) {\n setSQLPreview(sqlString);\n }\n }, [query, sqlPreview, setSQLPreview]);\n\n return (\n <EditorRows>\n <EditorRow>\n <SQLBuilderSelectRow query={query} onQueryChange={onQueryChange} datasource={datasource} />\n </EditorRow>\n\n <EditorRow>\n <EditorField label=\"Filter\" optional={true}>\n <SQLFilter query={query} onQueryChange={onQueryChange} datasource={datasource} />\n </EditorField>\n </EditorRow>\n\n <EditorRow>\n <EditorField label=\"Group by\" optional>\n <SQLGroupBy query={query} onQueryChange={onQueryChange} datasource={datasource} />\n </EditorField>\n\n <SQLOrderByGroup query={query} onQueryChange={onQueryChange} datasource={datasource}></SQLOrderByGroup>\n\n <EditorField label=\"Limit\" optional>\n <Input\n id={`${query.refId}-cloudwatch-sql-builder-editor-limit`}\n value={sql.limit}\n onChange={(e) => {\n const val = e.currentTarget.valueAsNumber;\n onQueryChange(setSql(query, { limit: isNaN(val) ? undefined : val }));\n }}\n type=\"number\"\n min={1}\n />\n </EditorField>\n </EditorRow>\n\n {sqlPreview && (\n <EditorRow>\n {process.env.NODE_ENV === 'development' && <pre>{JSON.stringify(query.sql ?? {}, null, 2)}</pre>}\n <pre>{sqlPreview ?? ''}</pre>\n </EditorRow>\n )}\n </EditorRows>\n );\n};\n","import { LanguageDefinition } from '../monarch/register';\n\nconst cloudWatchSqlLanguageDefinition: LanguageDefinition = {\n id: 'cloudwatch-sql',\n extensions: ['.cloudwatchSql'],\n aliases: ['CloudWatch', 'cloudwatch', 'CloudWatchSQL'],\n mimetypes: [],\n loader: () => import('./language'),\n};\nexport default cloudWatchSqlLanguageDefinition;\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { useCallback, useEffect } from 'react';\n\nimport { CodeEditor, Monaco } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport language from '../../../language/cloudwatch-sql/definition';\nimport { TRIGGER_SUGGEST } from '../../../language/monarch/commands';\nimport { registerLanguage } from '../../../language/monarch/register';\n\nexport interface Props {\n region: string;\n sql: string;\n onChange: (sql: string) => void;\n datasource: CloudWatchDatasource;\n}\n\nexport const SQLCodeEditor = ({ region, sql, onChange, datasource }: Props) => {\n useEffect(() => {\n datasource.sqlCompletionItemProvider.setRegion(region);\n }, [region, datasource]);\n\n const onEditorMount = useCallback(\n (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n const text = editor.getValue();\n onChange(text);\n });\n },\n [onChange]\n );\n\n return (\n <CodeEditor\n height={'150px'}\n language={language.id}\n value={sql}\n onBlur={(value) => {\n if (value !== sql) {\n onChange(value);\n }\n }}\n showMiniMap={false}\n showLineNumbers={true}\n onBeforeEditorMount={(monaco: Monaco) => registerLanguage(monaco, language, datasource.sqlCompletionItemProvider)}\n onEditorDidMount={onEditorMount}\n />\n );\n};\n","import { ChangeEvent, useCallback, useEffect, useState } from 'react';\nimport * as React from 'react';\n\nimport { QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { EditorField, EditorRow, InlineSelect } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { ConfirmModal, Input, RadioButtonGroup, Space } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../../datasource';\nimport { DEFAULT_METRICS_QUERY } from '../../../defaultQueries';\nimport useMigratedMetricsQuery from '../../../migrations/useMigratedMetricsQuery';\nimport {\n CloudWatchJsonData,\n CloudWatchMetricsQuery,\n CloudWatchQuery,\n MetricEditorMode,\n MetricQueryType,\n MetricStat,\n} from '../../../types';\nimport { MetricStatEditor } from '../../shared/MetricStatEditor/MetricStatEditor';\n\nimport { DynamicLabelsField } from './DynamicLabelsField';\nimport { MathExpressionQueryField } from './MathExpressionQueryField';\nimport { SQLBuilderEditor } from './SQLBuilderEditor/SQLBuilderEditor';\nimport { SQLCodeEditor } from './SQLCodeEditor';\n\nexport interface Props extends QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData> {\n query: CloudWatchMetricsQuery;\n extraHeaderElementLeft?: React.Dispatch<JSX.Element | undefined>;\n extraHeaderElementRight?: React.Dispatch<JSX.Element | undefined>;\n}\n\nconst metricEditorModes: Array<SelectableValue<MetricQueryType>> = [\n { label: 'Metric Search', value: MetricQueryType.Search },\n { label: 'Metric Insights', value: MetricQueryType.Insights },\n];\nconst editorModes = [\n { label: 'Builder', value: MetricEditorMode.Builder },\n { label: 'Code', value: MetricEditorMode.Code },\n];\n\nexport const MetricsQueryEditor = (props: Props) => {\n const { query, datasource, extraHeaderElementLeft, extraHeaderElementRight, onChange } = props;\n const [showConfirm, setShowConfirm] = useState(false);\n const [codeEditorIsDirty, setCodeEditorIsDirty] = useState(false);\n const migratedQuery = useMigratedMetricsQuery(query, props.onChange);\n\n const onEditorModeChange = useCallback(\n (newMetricEditorMode: MetricEditorMode) => {\n if (\n codeEditorIsDirty &&\n query.metricQueryType === MetricQueryType.Insights &&\n query.metricEditorMode === MetricEditorMode.Code\n ) {\n setShowConfirm(true);\n return;\n }\n onChange({ ...query, metricEditorMode: newMetricEditorMode });\n },\n [setShowConfirm, onChange, codeEditorIsDirty, query]\n );\n\n const updateAccounIdOnMount = () => {\n if (config.featureToggles.cloudWatchCrossAccountQuerying && query.accountId) {\n datasource.resources.isMonitoringAccount(query.region).then((isMonitoring) => {\n if (!isMonitoring && query.accountId) {\n onChange({ ...query, accountId: undefined });\n }\n });\n }\n };\n useEffect(updateAccounIdOnMount, [datasource, onChange, query]);\n\n useEffect(() => {\n extraHeaderElementLeft?.(\n <InlineSelect\n aria-label=\"Metric editor mode\"\n value={metricEditorModes.find((m) => m.value === query.metricQueryType)}\n options={metricEditorModes}\n onChange={({ value }) => {\n if (\n codeEditorIsDirty &&\n query.metricQueryType === MetricQueryType.Search &&\n query.metricEditorMode === MetricEditorMode.Builder\n ) {\n setShowConfirm(true);\n return;\n }\n onChange({ ...query, metricQueryType: value });\n }}\n />\n );\n\n extraHeaderElementRight?.(\n <>\n <RadioButtonGroup\n options={editorModes}\n size=\"sm\"\n value={query.metricEditorMode}\n onChange={onEditorModeChange}\n />\n <ConfirmModal\n isOpen={showConfirm}\n title=\"Are you sure?\"\n body=\"You will lose changes made to the query if you change to Metric Insights Builder mode.\"\n confirmText=\"Yes, I am sure.\"\n dismissText=\"No, continue editing the query.\"\n icon=\"exclamation-triangle\"\n onConfirm={() => {\n setShowConfirm(false);\n setCodeEditorIsDirty(false);\n onChange({\n ...query,\n ...DEFAULT_METRICS_QUERY,\n metricQueryType: MetricQueryType.Insights,\n metricEditorMode: MetricEditorMode.Builder,\n });\n }}\n onDismiss={() => setShowConfirm(false)}\n />\n </>\n );\n\n return () => {\n extraHeaderElementLeft?.(undefined);\n extraHeaderElementRight?.(undefined);\n };\n }, [\n query,\n codeEditorIsDirty,\n datasource,\n onChange,\n extraHeaderElementLeft,\n extraHeaderElementRight,\n showConfirm,\n onEditorModeChange,\n ]);\n\n return (\n <>\n <Space v={0.5} />\n\n {query.metricQueryType === MetricQueryType.Search && (\n <>\n {query.metricEditorMode === MetricEditorMode.Builder && (\n <MetricStatEditor\n {...props}\n refId={query.refId}\n metricStat={query}\n onChange={(metricStat: MetricStat) => {\n if (!codeEditorIsDirty) {\n setCodeEditorIsDirty(true);\n }\n props.onChange({ ...query, ...metricStat });\n }}\n ></MetricStatEditor>\n )}\n {query.metricEditorMode === MetricEditorMode.Code && (\n <MathExpressionQueryField\n expression={query.expression ?? ''}\n onChange={(expression) => props.onChange({ ...query, expression })}\n datasource={datasource}\n ></MathExpressionQueryField>\n )}\n </>\n )}\n {query.metricQueryType === MetricQueryType.Insights && (\n <>\n {query.metricEditorMode === MetricEditorMode.Code && (\n <SQLCodeEditor\n region={query.region}\n sql={query.sqlExpression ?? ''}\n onChange={(sqlExpression) => {\n if (!codeEditorIsDirty) {\n setCodeEditorIsDirty(true);\n }\n props.onChange({ ...migratedQuery, sqlExpression });\n }}\n datasource={datasource}\n />\n )}\n\n {query.metricEditorMode === MetricEditorMode.Builder && (\n <>\n <SQLBuilderEditor query={query} onChange={props.onChange} datasource={datasource}></SQLBuilderEditor>\n </>\n )}\n </>\n )}\n <Space v={0.5} />\n <EditorRow>\n <EditorField\n label=\"ID\"\n width={26}\n optional\n tooltip=\"ID can be used to reference other queries in math expressions. The ID can include numbers, letters, and underscore, and must start with a lowercase letter.\"\n invalid={!!query.id && !/^$|^[a-z][a-zA-Z0-9_]*$/.test(query.id)}\n >\n <Input\n id={`${query.refId}-cloudwatch-metric-query-editor-id`}\n onChange={(event: ChangeEvent<HTMLInputElement>) => onChange({ ...migratedQuery, id: event.target.value })}\n type=\"text\"\n value={query.id}\n />\n </EditorField>\n\n <EditorField label=\"Period\" width={26} tooltip=\"Minimum interval between points in seconds.\">\n <Input\n id={`${query.refId}-cloudwatch-metric-query-editor-period`}\n value={query.period || ''}\n placeholder=\"auto\"\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange({ ...migratedQuery, period: event.target.value })\n }\n />\n </EditorField>\n\n <EditorField\n label=\"Label\"\n width={26}\n optional\n tooltip=\"Change time series legend name using Dynamic labels. See documentation for details.\"\n >\n <DynamicLabelsField\n width={52}\n label={migratedQuery.label ?? ''}\n onChange={(label) => props.onChange({ ...query, label })}\n ></DynamicLabelsField>\n </EditorField>\n </EditorRow>\n </>\n );\n};\n","import { CoreApp, LoadingState, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { EditorHeader, InlineSelect, FlexItem } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { Badge, Button } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { isCloudWatchLogsQuery, isCloudWatchMetricsQuery } from '../../guards';\nimport { useIsMonitoringAccount, useRegions } from '../../hooks';\nimport { CloudWatchJsonData, CloudWatchQuery, CloudWatchQueryMode } from '../../types';\n\nexport interface Props extends QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData> {\n extraHeaderElementLeft?: JSX.Element;\n extraHeaderElementRight?: JSX.Element;\n dataIsStale: boolean;\n}\n\nconst apiModes: Array<SelectableValue<CloudWatchQueryMode>> = [\n { label: 'CloudWatch Metrics', value: 'Metrics' },\n { label: 'CloudWatch Logs', value: 'Logs' },\n];\n\nconst QueryHeader = ({\n query,\n onChange,\n datasource,\n extraHeaderElementLeft,\n extraHeaderElementRight,\n dataIsStale,\n data,\n onRunQuery,\n}: Props) => {\n const { queryMode, region } = query;\n const isMonitoringAccount = useIsMonitoringAccount(datasource.resources, query.region);\n const [regions, regionIsLoading] = useRegions(datasource);\n const emptyLogsExpression = isCloudWatchLogsQuery(query) ? !query.expression : false;\n\n const onQueryModeChange = ({ value }: SelectableValue<CloudWatchQueryMode>) => {\n if (value && value !== queryMode) {\n onChange({\n ...datasource.getDefaultQuery(CoreApp.Unknown),\n ...query,\n queryMode: value,\n expression: '',\n });\n }\n };\n const onRegionChange = async (region: string) => {\n if (config.featureToggles.cloudWatchCrossAccountQuerying && isCloudWatchMetricsQuery(query)) {\n const isMonitoringAccount = await datasource.resources.isMonitoringAccount(region);\n onChange({ ...query, logGroups: [], region, accountId: isMonitoringAccount ? query.accountId : undefined });\n } else {\n onChange({ ...query, logGroups: [], region });\n }\n };\n\n const shouldDisplayMonitoringBadge = config.featureToggles.cloudWatchCrossAccountQuerying && isMonitoringAccount;\n\n return (\n <>\n <EditorHeader>\n <InlineSelect\n label=\"Region\"\n value={region}\n placeholder=\"Select region\"\n allowCustomValue\n onChange={({ value: region }) => region && onRegionChange(region)}\n options={regions}\n isLoading={regionIsLoading}\n />\n\n <InlineSelect\n aria-label=\"Query mode\"\n value={queryMode}\n options={apiModes}\n onChange={onQueryModeChange}\n inputId={`cloudwatch-query-mode-${query.refId}`}\n id={`cloudwatch-query-mode-${query.refId}`}\n />\n\n {extraHeaderElementLeft}\n\n <FlexItem grow={1} />\n\n {shouldDisplayMonitoringBadge && (\n <>\n <Badge\n text=\"Monitoring account\"\n color=\"blue\"\n tooltip=\"AWS monitoring accounts view data from source accounts so you can centralize monitoring and troubleshoot activities\"\n ></Badge>\n </>\n )}\n\n <Button\n variant={dataIsStale ? 'primary' : 'secondary'}\n size=\"sm\"\n onClick={onRunQuery}\n icon={data?.state === LoadingState.Loading ? 'spinner' : undefined}\n disabled={data?.state === LoadingState.Loading || emptyLogsExpression}\n >\n Run queries\n </Button>\n\n {extraHeaderElementRight}\n </EditorHeader>\n </>\n );\n};\n\nexport default QueryHeader;\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\n\nimport { CloudWatchDatasource } from '../../datasource';\nimport { isCloudWatchLogsQuery, isCloudWatchMetricsQuery } from '../../guards';\nimport useMigratedQuery from '../../migrations/useMigratedQuery';\nimport { CloudWatchJsonData, CloudWatchQuery } from '../../types';\n\nimport LogsQueryEditor from './LogsQueryEditor/LogsQueryEditor';\nimport { MetricsQueryEditor } from './MetricsQueryEditor/MetricsQueryEditor';\nimport QueryHeader from './QueryHeader';\n\nexport type Props = QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>;\n\nexport const QueryEditor = (props: Props) => {\n const { query, onChange, data } = props;\n const migratedQuery = useMigratedQuery(query, props.onChange);\n const [dataIsStale, setDataIsStale] = useState(false);\n const [extraHeaderElementLeft, setExtraHeaderElementLeft] = useState<JSX.Element>();\n const [extraHeaderElementRight, setExtraHeaderElementRight] = useState<JSX.Element>();\n\n useEffect(() => {\n setDataIsStale(false);\n }, [data]);\n\n const onChangeInternal = useCallback(\n (query: CloudWatchQuery) => {\n setDataIsStale(true);\n onChange(query);\n },\n [onChange]\n );\n\n return (\n <>\n <QueryHeader\n {...props}\n extraHeaderElementLeft={extraHeaderElementLeft}\n extraHeaderElementRight={extraHeaderElementRight}\n dataIsStale={dataIsStale}\n />\n\n {isCloudWatchMetricsQuery(migratedQuery) && (\n <MetricsQueryEditor\n {...props}\n query={migratedQuery}\n onRunQuery={() => {}}\n onChange={onChangeInternal}\n extraHeaderElementLeft={setExtraHeaderElementLeft}\n extraHeaderElementRight={setExtraHeaderElementRight}\n />\n )}\n {isCloudWatchLogsQuery(migratedQuery) && (\n <LogsQueryEditor\n {...props}\n query={migratedQuery}\n onChange={onChangeInternal}\n extraHeaderElementLeft={setExtraHeaderElementLeft}\n />\n )}\n </>\n );\n};\n","import { DashboardLoadedEvent, DataSourcePlugin } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\n\nimport LogsCheatSheet from './components/CheatSheet/LogsCheatSheet';\nimport { ConfigEditor } from './components/ConfigEditor/ConfigEditor';\nimport { MetaInspector } from './components/MetaInspector/MetaInspector';\nimport { QueryEditor } from './components/QueryEditor/QueryEditor';\nimport { CloudWatchDatasource } from './datasource';\nimport { onDashboardLoadedHandler } from './tracking';\nimport { CloudWatchJsonData, CloudWatchQuery } from './types';\n\nexport const plugin = new DataSourcePlugin<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>(\n CloudWatchDatasource\n)\n .setQueryEditorHelp(LogsCheatSheet)\n .setConfigEditor(ConfigEditor)\n .setQueryEditor(QueryEditor)\n .setMetadataInspector(MetaInspector);\n\n// Subscribe to on dashboard loaded event so that we can track plugin adoption\ngetAppEvents().subscribe<DashboardLoadedEvent<CloudWatchQuery>>(DashboardLoadedEvent, onDashboardLoadedHandler);\n","import React__default from 'react';\nimport { Stack } from '@grafana/ui';\nimport '@grafana/data';\n\nconst EditorStack = ({ children, wrap: wrapItems = true, ...props }) => {\n var _a, _b;\n return /* @__PURE__ */ React__default.createElement(Stack, { wrap: wrapItems ? \"wrap\" : undefined, direction: (_a = props.direction) != null ? _a : \"row\", gap: (_b = props.gap) != null ? _b : 2, ...props }, children);\n};\n\nexport { EditorStack };\n//# sourceMappingURL=EditorStack.js.map\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\n// Metric Math: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html\nexport const METRIC_MATH_FNS = [\n 'ABS',\n 'ANOMALY_DETECTION_BAND',\n 'AVG',\n 'CEIL',\n 'DATAPOINT_COUNT',\n 'DB_PERF_INSIGHTS',\n 'DIFF',\n 'DIFF_TIME',\n 'FILL',\n 'FIRST',\n 'LAST',\n 'FLOOR',\n 'IF',\n 'INSIGHT_RULE_METRIC',\n 'LOG',\n 'LOG10',\n 'MAX',\n 'METRIC_COUNT',\n 'METRICS',\n 'MIN',\n 'MINUTE',\n 'HOUR',\n 'DAY',\n 'DATE',\n 'MONTH',\n 'YEAR',\n 'EPOCH',\n 'PERIOD',\n 'RATE',\n 'REMOVE_EMPTY',\n 'RUNNING_SUM',\n 'SEARCH',\n 'SERVICE_QUOTA',\n 'SLICE',\n 'SORT',\n 'STDDEV',\n 'SUM',\n 'TIME_SERIES',\n];\n\nexport const METRIC_MATH_STATISTIC_KEYWORD_STRINGS = ['Average', 'Maximum', 'Minimum', 'Sum', 'SampleCount']; // second arguments to SEARCH function\n\nexport const METRIC_MATH_KEYWORDS = ['REPEAT', 'LINEAR', 'ASC', 'DSC']; // standalone magic arguments to functions\n\nexport const METRIC_MATH_OPERATORS = [\n '+',\n '-',\n '*',\n '/',\n '^',\n '==',\n '!=',\n '<=',\n '>=',\n '<',\n '>',\n 'AND',\n '&&',\n 'OR',\n '||',\n];\n\nexport const METRIC_MATH_PERIODS = [10, 60, 300, 900, 3000, 21600, 86400];\n\nexport const language: monacoType.languages.IMonarchLanguage = {\n id: 'metricMath',\n ignoreCase: false,\n brackets: [\n { open: '[', close: ']', token: 'delimiter.square' },\n { open: '(', close: ')', token: 'delimiter.parenthesis' },\n { open: '{', close: '}', token: 'delimiter.curly' },\n ],\n tokenizer: {\n root: [{ include: '@nonNestableStates' }, { include: '@strings' }],\n nonNestableStates: [\n { include: '@variables' },\n { include: '@macros' },\n { include: '@whitespace' },\n { include: '@numbers' },\n { include: '@assignment' },\n { include: '@keywords' },\n { include: '@operators' },\n { include: '@builtInFunctions' },\n [/[;,.]/, 'delimiter'],\n [/[(){}\\[\\]]/, '@brackets'], // [], (), {} are all brackets\n ],\n keywords: [[METRIC_MATH_KEYWORDS.map(escapeRegExp).join('|'), 'keyword']],\n operators: [[METRIC_MATH_OPERATORS.map(escapeRegExp).join('|'), 'operator']],\n builtInFunctions: [[METRIC_MATH_FNS.map(escapeRegExp).join('|'), 'predefined']],\n variables: [\n [/\\$[a-zA-Z0-9-_]+/, 'variable'], // $ followed by any letter/number we assume could be grafana template variable\n ],\n macros: [[/\\$__[a-zA-Z0-9-_]+/, 'type']], // example: $__period_auto\n whitespace: [[/\\s+/, 'white']],\n assignment: [[/=/, 'tag']],\n numbers: [\n [/0[xX][0-9a-fA-F]*/, 'number'],\n [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n ],\n // states that start other states (aka nested states):\n strings: [\n [/'/, { token: 'string', next: '@string' }],\n [/\"/, { token: 'type', next: '@string_double' }],\n ],\n string: [\n [/{/, { token: 'delimiter.curly', next: '@nestedCurly' }], // escape out of string and into nestedCurly\n [/\\(/, { token: 'delimiter.parenthesis', next: '@nestedParens' }], // escape out of string and into nestedCurly\n [/\"/, { token: 'type', next: '@string_double' }], // jump into double string\n [/'/, { token: 'string', next: '@pop' }], // stop being a string\n { include: '@nonNestableStates' },\n [/[^']/, 'string'], // anything that is not a quote, is marked as string\n ],\n string_double: [\n [/[^\"]/, 'type'], // mark anything not a quote as a \"type\" (different type of string for visual difference)\n [/\"/, { token: 'type', next: '@pop' }], // mark also as a type and stop being in the double string state\n ],\n nestedCurly: [\n [/}/, { token: 'delimiter.curly', next: '@pop' }], // escape out of string and into braces\n [/'/, { token: 'string', next: '@string' }], // go to string if see start of string\n [/\"/, { token: 'type', next: '@string_double' }], // go to string_double if see start of double string\n ],\n nestedParens: [\n [/\\)/, { token: 'delimiter.parenthesis', next: '@pop' }], // escape out of string and into braces\n [/'/, { token: 'string', next: '@string' }], // go to string if see start of string\n [/\"/, { token: 'type', next: '@string_double' }], // go to string_double if see start of double string\n ],\n },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n};\n\nfunction escapeRegExp(string: string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n","module.exports = require('./lib/jsurl');","/**\n * Copyright (c) 2011 Bruno Jouhier <bruno.jouhier@sage.com>\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n//\n(function(exports) {\n\t\"use strict\";\n\texports.stringify = function stringify(v) {\n\t\tfunction encode(s) {\n\t\t\treturn !/[^\\w-.]/.test(s) ? s : s.replace(/[^\\w-.]/g, function(ch) {\n\t\t\t\tif (ch === '$') return '!';\n\t\t\t\tch = ch.charCodeAt(0);\n\t\t\t\t// thanks to Douglas Crockford for the negative slice trick\n\t\t\t\treturn ch < 0x100 ? '*' + ('00' + ch.toString(16)).slice(-2) : '**' + ('0000' + ch.toString(16)).slice(-4);\n\t\t\t});\n\t\t}\n\n\t\tvar tmpAry;\n\n\t\tswitch (typeof v) {\n\t\t\tcase 'number':\n\t\t\t\treturn isFinite(v) ? '~' + v : '~null';\n\t\t\tcase 'boolean':\n\t\t\t\treturn '~' + v;\n\t\t\tcase 'string':\n\t\t\t\treturn \"~'\" + encode(v);\n\t\t\tcase 'object':\n\t\t\t\tif (!v) return '~null';\n\n\t\t\t\ttmpAry = [];\n\n\t\t\t\tif (Array.isArray(v)) {\n\t\t\t\t\tfor (var i = 0; i < v.length; i++) {\n\t\t\t\t\t\ttmpAry[i] = stringify(v[i]) || '~null';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn '~(' + (tmpAry.join('') || '~') + ')';\n\t\t\t\t} else {\n\t\t\t\t\tfor (var key in v) {\n\t\t\t\t\t\tif (v.hasOwnProperty(key)) {\n\t\t\t\t\t\t\tvar val = stringify(v[key]);\n\n\t\t\t\t\t\t\t// skip undefined and functions\n\t\t\t\t\t\t\tif (val) {\n\t\t\t\t\t\t\t\ttmpAry.push(encode(key) + val);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn '~(' + tmpAry.join('~') + ')';\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\t// function, undefined\n\t\t\t\treturn;\n\t\t}\n\t};\n\n\tvar reserved = {\n\t\t\"true\": true,\n\t\t\"false\": false,\n\t\t\"null\": null\n\t};\n\n\texports.parse = function(s) {\n\t\tif (!s) return s;\n\t\ts = s.replace(/%(25)*27/g, \"'\");\n\t\tvar i = 0,\n\t\t\tlen = s.length;\n\n\t\tfunction eat(expected) {\n\t\t\tif (s.charAt(i) !== expected) throw new Error(\"bad JSURL syntax: expected \" + expected + \", got \" + (s && s.charAt(i)));\n\t\t\ti++;\n\t\t}\n\n\t\tfunction decode() {\n\t\t\tvar beg = i,\n\t\t\t\tch, r = \"\";\n\t\t\twhile (i < len && (ch = s.charAt(i)) !== '~' && ch !== ')') {\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase '*':\n\t\t\t\t\t\tif (beg < i) r += s.substring(beg, i);\n\t\t\t\t\t\tif (s.charAt(i + 1) === '*') r += String.fromCharCode(parseInt(s.substring(i + 2, i + 6), 16)), beg = (i += 6);\n\t\t\t\t\t\telse r += String.fromCharCode(parseInt(s.substring(i + 1, i + 3), 16)), beg = (i += 3);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '!':\n\t\t\t\t\t\tif (beg < i) r += s.substring(beg, i);\n\t\t\t\t\t\tr += '$', beg = ++i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn r + s.substring(beg, i);\n\t\t}\n\n\t\treturn (function parseOne() {\n\t\t\tvar result, ch, beg;\n\t\t\teat('~');\n\t\t\tswitch (ch = s.charAt(i)) {\n\t\t\t\tcase '(':\n\t\t\t\t\ti++;\n\t\t\t\t\tif (s.charAt(i) === '~') {\n\t\t\t\t\t\tresult = [];\n\t\t\t\t\t\tif (s.charAt(i + 1) === ')') i++;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\tresult.push(parseOne());\n\t\t\t\t\t\t\t} while (s.charAt(i) === '~');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t\tif (s.charAt(i) !== ')') {\n\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\tvar key = decode();\n\t\t\t\t\t\t\t\tresult[key] = parseOne();\n\t\t\t\t\t\t\t} while (s.charAt(i) === '~' && ++i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\teat(')');\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"'\":\n\t\t\t\t\ti++;\n\t\t\t\t\tresult = decode();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbeg = i++;\n\t\t\t\t\twhile (i < len && /[^)~]/.test(s.charAt(i)))\n\t\t\t\t\ti++;\n\t\t\t\t\tvar sub = s.substring(beg, i);\n\t\t\t\t\tif (/[\\d\\-]/.test(ch)) {\n\t\t\t\t\t\tresult = parseFloat(sub);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = reserved[sub];\n\t\t\t\t\t\tif (typeof result === \"undefined\") throw new Error(\"bad value keyword: \" + sub);\n\t\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t})();\n\t}\n\n\texports.tryParse = function(s, def) {\n\t\ttry {\n\t\t\treturn exports.parse(s);\n\t\t} catch (ex) {\n\t\t\treturn def;\n\t\t}\n\t}\n\n})(typeof exports !== 'undefined' ? exports : (window.JSURL = window.JSURL || {}));\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\ninterface CloudWatchLanguage extends monacoType.languages.IMonarchLanguage {\n keywords: string[];\n operators: string[];\n builtinFunctions: string[];\n}\n\nexport const SELECT = 'SELECT';\nexport const FROM = 'FROM';\nexport const WHERE = 'WHERE';\nexport const GROUP = 'GROUP';\nexport const ORDER = 'ORDER';\nexport const BY = 'BY';\nexport const DESC = 'DESC';\nexport const ASC = 'ASC';\nexport const LIMIT = 'LIMIT';\nexport const WITH = 'WITH';\nexport const SCHEMA = 'SCHEMA';\n\nexport const KEYWORDS = [SELECT, FROM, WHERE, GROUP, ORDER, BY, DESC, ASC, LIMIT, WITH, SCHEMA];\nexport const STATISTICS = ['AVG', 'COUNT', 'MAX', 'MIN', 'SUM'];\n\nexport const AND = 'AND';\nexport const LOGICAL_OPERATORS = [AND];\n\nexport const EQUALS = '=';\nexport const NOT_EQUALS = '!=';\nexport const COMPARISON_OPERATORS = [EQUALS, NOT_EQUALS];\n\nexport const language: CloudWatchLanguage = {\n defaultToken: '',\n tokenPostfix: '.sql',\n ignoreCase: true,\n brackets: [\n { open: '[', close: ']', token: 'delimiter.square' },\n { open: '(', close: ')', token: 'delimiter.parenthesis' },\n ],\n keywords: KEYWORDS,\n operators: LOGICAL_OPERATORS,\n builtinFunctions: STATISTICS,\n tokenizer: {\n root: [\n [/\\$[a-zA-Z0-9-_]+/, 'variable'],\n { include: '@comments' },\n { include: '@whitespace' },\n { include: '@numbers' },\n { include: '@strings' },\n { include: '@complexIdentifiers' },\n [/[;,.]/, 'delimiter'],\n [/[()]/, '@brackets'],\n [\n /[\\w@#$]+/,\n {\n cases: {\n '@keywords': 'keyword',\n '@operators': 'operator',\n '@builtinFunctions': 'predefined',\n '@default': 'identifier',\n },\n },\n ],\n [/[=!%&+\\-*/|~^]/, 'operator'], // TODO: strip these options\n ],\n whitespace: [[/\\s+/, 'white']],\n comments: [[/--+.*/, 'comment']],\n comment: [\n [/[^*/]+/, 'comment'],\n [/./, 'comment'],\n ],\n numbers: [\n [/0[xX][0-9a-fA-F]*/, 'number'],\n [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n ],\n strings: [\n [/N'/, { token: 'string', next: '@string' }],\n [/'/, { token: 'string', next: '@string' }],\n [/\"/, { token: 'type', next: '@string_double' }],\n ],\n string: [\n [/[^']+/, 'string'],\n [/''/, 'string'],\n [/'/, { token: 'string', next: '@pop' }],\n ],\n string_double: [\n [/[^\\\\\"]+/, 'type'],\n [/\"/, 'type', '@pop'],\n ],\n complexIdentifiers: [\n [/\\[/, { token: 'identifier.quote', next: '@bracketedIdentifier' }],\n [/\"/, { token: 'identifier.quote', next: '@quotedIdentifier' }],\n ],\n bracketedIdentifier: [\n [/[^\\]]+/, 'identifier'],\n [/]]/, 'identifier'],\n [/]/, { token: 'identifier.quote', next: '@pop' }],\n ],\n quotedIdentifier: [\n [/[^\"]+/, 'identifier'],\n [/\"\"/, 'identifier'],\n [/\"/, { token: 'identifier.quote', next: '@pop' }],\n ],\n },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {\n comments: {\n lineComment: '--',\n blockComment: ['/*', '*/'],\n },\n brackets: [\n ['{', '}'],\n ['[', ']'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n surroundingPairs: [\n { open: '{', close: '}' },\n { open: '[', close: ']' },\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n};\n","import { cx, css } from '@emotion/css';\nimport { useStyles2 } from '@grafana/ui';\nimport React__default, { Children, isValidElement, cloneElement } from 'react';\n\nconst InputGroup = ({ children }) => {\n const styles = useStyles2(getStyles);\n const modifiedChildren = Children.map(children, (child) => {\n if (isValidElement(child) && child.props.invalid) {\n return cloneElement(child, { className: cx(child.props.className, styles.invalidChild) });\n }\n return child;\n });\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.root }, modifiedChildren);\n};\nconst borderPriority = [\n \"\",\n // lowest priority\n \"base\",\n \"hovered\",\n \"invalid\",\n \"focused\"\n // highest priority\n];\nconst getStyles = () => ({\n root: css({\n display: \"flex\",\n // Style the direct children of the component\n \"> *\": {\n \"&:not(:first-child)\": {\n // Negative margin hides the double-border on adjacent selects\n marginLeft: -1\n },\n \"&:first-child\": {\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0\n },\n \"&:last-child\": {\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0\n },\n \"&:not(:first-child):not(:last-child)\": {\n borderRadius: 0\n },\n //\n position: \"relative\",\n zIndex: borderPriority.indexOf(\"base\"),\n // Adjacent borders are overlapping, so raise children up when hovering etc\n // so all that child's borders are visible.\n \"&:hover\": {\n zIndex: borderPriority.indexOf(\"hovered\")\n },\n \"&:focus-within\": {\n zIndex: borderPriority.indexOf(\"focused\")\n }\n }\n }),\n invalidChild: css({\n zIndex: borderPriority.indexOf(\"invalid\")\n })\n});\n\nexport { InputGroup };\n//# sourceMappingURL=InputGroup.js.map\n","import React__default from 'react';\nimport { EditorStack } from './EditorStack.js';\n\nconst EditorFieldGroup = ({ children }) => {\n return /* @__PURE__ */ React__default.createElement(EditorStack, { gap: 1 }, children);\n};\n\nexport { EditorFieldGroup };\n//# sourceMappingURL=EditorFieldGroup.js.map\n","import { css, cx } from '@emotion/css';\nimport React__default, { useState } from 'react';\nimport '@grafana/data';\nimport { useStyles2, Select, SelectContainer as SelectContainer$1 } from '@grafana/ui';\n\nfunction InlineSelect({ label: labelProp, ...props }) {\n const [id] = useState(() => Math.random().toString(16).slice(2));\n const styles = useStyles2(getSelectStyles);\n const components = {\n SelectContainer,\n ValueContainer,\n SingleValue: ValueContainer\n };\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.root }, labelProp && /* @__PURE__ */ React__default.createElement(\"label\", { className: styles.label, htmlFor: id }, labelProp, \":\", \"\\xA0\"), /* @__PURE__ */ React__default.createElement(Select, { openMenuOnFocus: true, inputId: id, ...props, components }));\n}\nconst SelectContainer = (props) => {\n const { children } = props;\n const styles = useStyles2(getSelectStyles);\n return /* @__PURE__ */ React__default.createElement(SelectContainer$1, { ...props, className: cx(props.className, styles.container) }, children);\n};\nconst ValueContainer = (props) => {\n const { className, children } = props;\n const styles = useStyles2(getSelectStyles);\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: cx(className, styles.valueContainer) }, children);\n};\nconst getSelectStyles = (theme) => ({\n root: css({\n display: \"flex\",\n fontSize: 12,\n alignItems: \"center\"\n }),\n label: css({\n color: theme.colors.text.secondary,\n whiteSpace: \"nowrap\"\n }),\n container: css({\n background: \"none\",\n borderColor: \"transparent\"\n }),\n valueContainer: css({\n display: \"flex\",\n alignItems: \"center\",\n flex: \"initial\",\n color: theme.colors.text.secondary,\n fontSize: 12\n })\n});\n\nexport { InlineSelect };\n//# sourceMappingURL=InlineSelect.js.map\n","import { css } from '@emotion/css';\nimport { Switch } from '@grafana/ui';\nimport React__default from 'react';\n\nconst EditorSwitch = (props) => {\n const styles = getStyles();\n return /* @__PURE__ */ React__default.createElement(\"div\", { className: styles.switch }, /* @__PURE__ */ React__default.createElement(Switch, { ...props }));\n};\nconst getStyles = () => {\n return {\n switch: css({\n display: \"flex\",\n alignItems: \"center\",\n minHeight: 30\n })\n };\n};\n\nexport { EditorSwitch };\n//# sourceMappingURL=EditorSwitch.js.map\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\nimport { config } from '@grafana/runtime';\n\n// Dynamic labels: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/graph-dynamic-labels.html\nexport const DYNAMIC_LABEL_PATTERNS = [\n '${DATAPOINT_COUNT}',\n '${FIRST}',\n '${FIRST_LAST_RANGE}',\n '${FIRST_LAST_TIME_RANGE}',\n '${FIRST_TIME}',\n '${FIRST_TIME_RELATIVE}',\n '${LABEL}',\n '${LAST}',\n '${LAST_TIME}',\n '${LAST_TIME_RELATIVE}',\n '${MAX}',\n '${MAX_TIME}',\n '${MAX_TIME_RELATIVE}',\n '${MIN}',\n '${MIN_MAX_RANGE}',\n '${MIN_MAX_TIME_RANGE}',\n '${MIN_TIME}',\n '${MIN_TIME_RELATIVE}',\n \"${PROP('AccountId')}\",\n \"${PROP('MetricName')}\",\n \"${PROP('Namespace')}\",\n \"${PROP('Period')}\",\n \"${PROP('Region')}\",\n \"${PROP('Stat')}\",\n '${SUM}',\n ...(config.featureToggles.cloudWatchCrossAccountQuerying ? [\"${PROP('AccountLabel')}\"] : []),\n];\n\nexport const language: monacoType.languages.IMonarchLanguage = {\n id: 'dynamicLabels',\n ignoreCase: false,\n tokenizer: {\n root: [\n { include: '@whitespace' },\n { include: '@builtInFunctions' },\n { include: '@string' },\n [/\\$\\{PROP\\('Dim.[a-zA-Z0-9-_]?.*'\\)\\}+/, 'predefined'], //custom handling for dimension patterns\n ],\n builtInFunctions: [[DYNAMIC_LABEL_PATTERNS.map(escapeRegExp).join('|'), 'predefined']],\n whitespace: [[/\\s+/, 'white']],\n string: [],\n },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {};\n\nfunction escapeRegExp(string: string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\n// OpenSearch PPL syntax: https://github.com/opensearch-project/opensearch-spark/blob/0.5/ppl-spark-integration/src/main/antlr4/OpenSearchPPLParser.g4\ninterface CloudWatchPPLLanguage extends monacoType.languages.IMonarchLanguage {\n commands: string[];\n operators: string[];\n builtinFunctions: string[];\n}\n\nexport const CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID = 'logs-ppl';\n\n// COMMANDS\nexport const WHERE = 'where';\nexport const FIELDS = 'fields';\nexport const DEDUP = 'dedup';\nexport const STATS = 'stats';\nexport const EVENTSTATS = 'eventstats';\nexport const SORT = 'sort';\nexport const EVAL = 'eval';\nexport const HEAD = 'head';\nexport const TOP = 'top';\nexport const RARE = 'rare';\nexport const PARSE = 'parse';\n\nexport const PPL_COMMANDS = [WHERE, FIELDS, STATS, EVENTSTATS, DEDUP, SORT, TOP, RARE, HEAD, EVAL, PARSE];\n\n// KEYWORDS\nexport const AS = 'as';\nexport const BY = 'by';\nexport const BETWEEN = 'between';\nexport const FROM = 'from';\n\n// PARAMETERS\nconst KEEP_EMPTY = 'keepempty';\nconst CONSECUTIVE = 'consecutive';\nconst PARTITIONS = 'partitions';\nconst ALLNUM = 'allnum';\nconst DELIM = 'delim';\nconst DEDUP_SPLITVALUES = 'dedup_splitvalues';\n\nexport const STATS_PARAMETERS = [PARTITIONS, ALLNUM, DELIM, DEDUP_SPLITVALUES];\nexport const DEDUP_PARAMETERS = [KEEP_EMPTY, CONSECUTIVE];\nexport const PARAMETERS_WITH_BOOLEAN_VALUES = [ALLNUM, DEDUP_SPLITVALUES, KEEP_EMPTY, CONSECUTIVE];\nexport const BOOLEAN_LITERALS = ['true', 'false'];\nexport const IN = 'in';\n\nexport const ALL_KEYWORDS = [...STATS_PARAMETERS, ...DEDUP_PARAMETERS, ...BOOLEAN_LITERALS, AS, BY, IN, BETWEEN, FROM];\n\n// FUNCTIONS\nexport const MATH_FUNCTIONS = [\n 'abs',\n 'acos',\n 'asin',\n 'atan',\n 'atan2',\n 'ceil',\n 'ceiling',\n 'conv',\n 'cos',\n 'cot',\n 'crc32',\n 'degrees',\n 'e',\n 'exp',\n 'floor',\n 'ln',\n 'log',\n 'log2',\n 'log10',\n 'mod',\n 'pi',\n 'pow',\n 'power',\n 'radians',\n 'rand',\n 'round',\n 'sign',\n 'sin',\n 'sqrt',\n 'cbrt',\n];\nexport const DATE_TIME_FUNCTIONS = [\n 'datediff',\n 'day',\n 'dayofmonth',\n 'dayofweek',\n 'dayofyear',\n 'hour',\n 'minute',\n 'second',\n 'month',\n 'quarter',\n 'weekday',\n 'weekofyear',\n 'year',\n 'now',\n 'curdate',\n 'current_date',\n];\nexport const TEXT_FUNCTIONS = [\n 'concat',\n 'concat_ws',\n 'length',\n 'lower',\n 'ltrim',\n 'reverse',\n 'rtrim',\n 'right',\n 'substring',\n 'substr',\n 'trim',\n 'upper',\n];\nexport const SPAN = 'span';\nexport const POSITION = 'position';\nexport const CONDITION_FUNCTIONS = ['like', 'isnull', 'isnotnull', 'exists', 'ifnull', 'nullif', 'if', 'ispresent'];\nexport const SORT_FIELD_FUNCTIONS = ['auto', 'str', 'ip', 'num'];\nexport const PPL_FUNCTIONS = [...MATH_FUNCTIONS, ...DATE_TIME_FUNCTIONS, ...TEXT_FUNCTIONS];\nexport const EVAL_FUNCTIONS: string[] = [...PPL_FUNCTIONS, POSITION];\nexport const STATS_FUNCTIONS = [\n 'avg',\n 'count',\n 'sum',\n 'min',\n 'max',\n 'stddev_samp',\n 'stddev_pop',\n 'percentile',\n 'percentile_approx',\n 'distinct_count',\n 'dc',\n];\n\nexport const ALL_FUNCTIONS = [\n ...PPL_FUNCTIONS,\n ...STATS_FUNCTIONS,\n ...CONDITION_FUNCTIONS,\n ...SORT_FIELD_FUNCTIONS,\n POSITION,\n SPAN,\n];\n\n// OPERATORS\nexport const PLUS = '+';\nexport const MINUS = '-';\nexport const NOT = 'not';\n\nexport const FIELD_OPERATORS = [PLUS, MINUS];\nexport const ARITHMETIC_OPERATORS = [PLUS, MINUS, '*', '/', '%'];\nexport const COMPARISON_OPERATORS = ['>', '>=', '<', '!=', '<=', '='];\nexport const LOGICAL_EXPRESSION_OPERATORS = ['and', 'or', 'xor', NOT];\nexport const PPL_OPERATORS = [...ARITHMETIC_OPERATORS, ...LOGICAL_EXPRESSION_OPERATORS, ...COMPARISON_OPERATORS];\n\nexport const language: CloudWatchPPLLanguage = {\n defaultToken: '',\n id: CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID,\n ignoreCase: true,\n commands: PPL_COMMANDS,\n operators: PPL_OPERATORS,\n keywords: ALL_KEYWORDS,\n builtinFunctions: ALL_FUNCTIONS,\n brackets: [{ open: '(', close: ')', token: 'delimiter.parenthesis' }],\n tokenizer: {\n root: [\n { include: '@comments' },\n { include: '@regexes' },\n { include: '@whitespace' },\n { include: '@variables' },\n { include: '@strings' },\n { include: '@numbers' },\n\n [/[,.:]/, 'delimiter'],\n [/\\|/, 'delimiter.pipe'],\n [/[()\\[\\]]/, 'delimiter.parenthesis'],\n\n [\n /[\\w@#$]+/,\n {\n cases: {\n '@commands': 'keyword.command',\n '@keywords': 'keyword',\n '@builtinFunctions': 'predefined',\n '@operators': 'operator',\n '@default': 'identifier',\n },\n },\n ],\n [/[+\\-*/^%=!<>]/, 'operator'], // handles the math operators\n [/[,.:]/, 'operator'],\n ],\n // template variable syntax\n variables: [\n [/\\${/, { token: 'variable', next: '@variable_bracket' }],\n [/\\$[a-zA-Z0-9-_]+/, 'variable'],\n ],\n variable_bracket: [\n [/[a-zA-Z0-9-_:]+/, 'variable'],\n [/}/, { token: 'variable', next: '@pop' }],\n ],\n whitespace: [[/\\s+/, 'white']],\n comments: [\n [/^#.*/, 'comment'],\n [/\\s+#.*/, 'comment'],\n ],\n numbers: [\n [/0[xX][0-9a-fA-F]*/, 'number'],\n [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n ],\n strings: [\n [/'/, { token: 'string', next: '@string' }],\n [/\"/, { token: 'string', next: '@string_double' }],\n [/`/, { token: 'string.backtick', next: '@string_backtick' }],\n ],\n string: [\n [/[^']+/, 'string'],\n [/''/, 'string'],\n [/'/, { token: 'string', next: '@pop' }],\n ],\n string_double: [\n [/[^\\\\\"]+/, 'string'],\n [/\"/, 'string', '@pop'],\n ],\n string_backtick: [\n [/[^\\\\`]+/, 'string.backtick'],\n [/`/, 'string.backtick', '@pop'],\n ],\n regexes: [[/\\/.*?\\/(?!\\s*\\d)/, 'regexp']],\n },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {\n brackets: [['(', ')']],\n autoClosingPairs: [\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n surroundingPairs: [\n { open: '(', close: ')' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n { open: '`', close: '`' },\n ],\n};\n"],"names":["EditorRows","children","EditorHeader","styles","getStyles","theme","AccessoryButton","className","props","getButtonStyles","ALL","AND","ANY","AS","ASC","BETWEEN","BY","CASE","CUBE","DESC","DISTINCT","ELSE","END","ESCAPE","EXISTS","FALSE","FILTER","FIRST","FROM","GROUP","GROUPING","HAVING","ILIKE","IN","INNER","IS","JOIN","LAST","LEFT","LIKE","LIMIT","NOT","NULL","ON","OR","ORDER","OUTER","ROLLUP","SELECT","SETS","SOME","THEN","TRUE","USING","WHEN","WHERE","WITH","KEYWORDS","AFTER_SELECT_KEYWORDS","ALL_KEYWORDS","AGGREGATE_FUNCTIONS","ARRAY_FUNCTIONS","CONDITIONAL_FUNCTIONS","CONVERSION_FUNCTIONS","DATE_AND_TIMESTAMP_FUNCTIONS","JSON_FUNCTIONS","MATHEMATICAL_FUNCTIONS","PREDICATE_FUNCTIONS","STRING_FUNCTIONS","WINDOW_FUNCTIONS","ALL_FUNCTIONS","EQUAL","DOUBLE_EQUALS","NULL_SAFE_EQUAL","NOT_EQUAL","GREATER_THAN","GREATER_THAN_EQUAL","LESS_THAN","LESS_THAN_EQUAL","LOGICAL_OPERATORS","MATH_OPERATORS","PREDICATE_OPERATORS","ALL_OPERATORS","language","conf","EditorList","items","renderItem","onChange","ref","onAddItem","newItems","onChangeItem","itemIndex","newItem","onDeleteItem","item","index","repeat","countOrConfig","_a","count","delay","source","subscriber","soFar","sourceSub","resubscribe","notifier","notifierSubscriber_1","subscribeToSource","syncUnsub","EditorRow","isArray","argsOrArgArray","args","FlexItem","grow","shrink","zip","_i","resultSelector","sources","buffers","completed","_loop_1","sourceIndex","value","buffer","result","i","DIFF","DISPLAY","FIELDS","PATTERN","STATS","SORT","PARSE","DEDUP","LOGS_COMMANDS","LOGS_LOGIC_OPERATORS","LOGS_FUNCTION_OPERATORS","SORT_DIRECTION_KEYWORDS","DIFF_MODIFIERS","LOGS_KEYWORDS","isCloudWatchLogsQuery","cloudwatchQuery","isLogsAnomaliesQuery","isCloudWatchMetricsQuery","isCloudWatchAnnotationQuery","isCloudWatchAnnotation","query","migrateMetricQuery","newQuery","migratedQuery","migrateAliasPatterns","aliasPatterns","regex","_","toOption","appendTemplateVariables","datasource","values","filterMetricsQuery","region","metricQueryType","metricEditorMode","expression","metricName","namespace","sqlExpression","statistic","onDashboardLoadedHandler","dashboardId","orgId","grafanaVersion","queries","cloudWatchQueries","logsInsightsQueries","logAnomaliesQueries","metricsQueries","e","q","isMetricSearchBuilder","config","error","trackSampleQuerySelection","queryLanguage","queryCategory","_createClass","defineProperties","target","descriptor","Constructor","protoProps","staticProps","_templateObject","_taggedTemplateLiteral","strings","raw","_classCallCheck","instance","TemplateTag","_this","_len","transformers","_key","_len2","expressions","_key2","transformer","previousTag","template","_len3","substitutions","_key3","resultSoFar","remainingPart","substitution","str","cb","res","transform","endResult","defaults","inlineArrayTransformer","opts","arrayLength","separator","conjunction","serial","indent","separatorIndex","_toConsumableArray","arr","arr2","stripIndentTransformer","type","match","el","regexp","trimResultTransformer","side","commaLists","commaListsAnd","commaListsOr","splitStringTransformer","splitBy","isValidValue","x","removeNonPrintingValuesTransformer","html","replaceSubstitutionTransformer","replaceWhat","replaceWith","safeHtml","replaceResultTransformer","oneLine","oneLineTrim","oneLineCommaLists","oneLineCommaListsOr","oneLineCommaListsAnd","inlineLists","oneLineInlineLists","stripIndent","stripIndents","sqlOnlyGeneralQueries","pplOnlyGeneralQueries","generalQueries","lambdaSamples","vpcSamples","cloudtrailSamples","natSamples","appSyncSamples","iotSamples","QUERY_COMMANDS","COMPARISON_OPERATORS","ARITHMETIC_OPERATORS","NUMERIC_OPERATORS","GENERAL_FUNCTIONS","DATETIME_FUNCTIONS","IP_FUNCTIONS","BOOLEAN_FUNCTIONS","AGGREGATION_FUNCTIONS_STATS","NON_AGGREGATION_FUNCS_STATS","STATS_FUNCS","FIELD_AND_FILTER_FUNCTIONS","FUNCTIONS","command","f","baseTokenizer","languageSpecificFeatures","cwliTokenizer","pplTokenizer","operator","sqlTokenizer","QUERIES","renderHighlightedMarkup","code","keyPrefix","queryLanugage","grammar","getGrammarForLanguage","spans","token","CheatSheetCollapse","isOpen","setIsOpen","Collapse","isLogsQuery","onClickExample","Text","j","TextLink","useRegions","regionsIsLoading","setRegionsIsLoading","regions","setRegions","variableOptionGroup","useNamespaces","namespaces","setNamespaces","useMetrics","accountId","metrics","setMetrics","useDimensionKeys","dimensionFilters","dimensionKeys","setDimensionKeys","useDeepCompareEffect","useEnsureVariableHasSingleSelection","setError","interpolatedTarget","newErrorMessage","useIsMonitoringAccount","resources","isMonitoringAccount","setIsMonitoringAccount","useAccountOptions","fetchAccountOptions","accounts","options","a","state","doFetch","useAsyncFn","standardStatistics","ALL_ACCOUNTS_OPTION","Account","accountOptions","selectedAccountExistsInOptions","tempVar","EditorField","Select","wildcardOption","excludeCurrentKey","dimensions","currentKey","acc","key","FilterItem","filter","metricStat","disableExpressions","onDelete","dimensionsExcludingCurrentKey","loadDimensionValues","o","loadOptions","getOperatorStyles","InputGroup","change","Alert","dimensionsToFilterConditions","v","filterConditionsToDimensions","filters","Dimensions","setItems","onDimensionsChange","newDimensions","makeRenderFilter","renderFilter","percentileSyntaxRE","boundariesInnerParenthesesSyntax","boundariesSyntaxRE","MetricStatEditor","refId","accountState","onNamespaceChange","validatedQuery","validateMetricName","metric","EditorFieldGroup","s","EditorSwitch","AnnotationQueryEditor","regionIsLoading","InlineSelect","Space","Input","event","DEFAULT_METRICS_QUERY","DEFAULT_ANNOTATIONS_QUERY","DEFAULT_CWLI_QUERY_STRING","DEFAULT_PPL_QUERY_STRING","DEFAULT_SQL_QUERY_STRING","getDefaultLogsQuery","defaultLogGroups","legacyDefaultLogGroups","DEFAULT_VARIABLE_QUERY","CloudWatchAnnotationSupport","anno","prefixMatching","actionPrefix","alarmNamePrefix","variableRegex","variableRegexExec","variableString","getVariableName","interpolateStringArrayUsingSingleOrMultiValuedVariable","templateSrv","scopedVars","format","string","variableName","valueVar","name","isVariableOption","rawValue","isTemplateVariable","current","fetchLogGroupFields","logGroups","interpolatedLogGroups","lg","results","logGroupName","fields","CloudWatchLogsLanguageProvider","url","params","lastValueFrom","context","suggs","functionSuggestions","commandToken","curToken","queryCommand","prevToken","prevNonWhitespaceToken","currentTokenIsFirstArg","currentTokenIsAfterCommandAndEmpty","isTokenType","currentTokenIsAfterCommand","nextNonWhitespaceToken","currentTokenIsComma","currentTokenIsCommaOrAfterComma","typeaheadOutput","group","sugg","boolFuncs","fieldsSuggestions","comparisonSuggestions","field","syntax","input","tokens","isFirstToken","isInsideFunctionParenthesis","isAfterKeyword","previousCommandToken","isFirstArgument","startToken","thisToken","funcsWithFieldArgs","funcName","parenthesisToken","maybeFunctionToken","keyword","maybeKeyword","getPreviousTokenExcluding","prev","content","exclude","main","LinkedToken","range","previous","next","tokenTypes","isType","curr","ignoreTypes","t","linkedTokenBuilder","monaco","model","position","tokensPerLine","lineIndex","columnIndex","endColumn","newToken","StatementPosition","SuggestionKind","CompletionItemPriority","CompletionItemProvider","currentToken","suggestionKinds","statementPosition","languageDefinition","isPPL","TRIGGER_SUGGEST","CLOUDWATCH_LOGS_SQL_LANGUAGE_DEFINITION_ID","SQLTokenTypes","getStatementPosition","previousNonWhiteSpace","previousKeyword","normalizedPreviousNonWhiteSpaceValue","normalizedPreviousKeywordValue","previousNonAliasKeywordValue","normalizedPreviousNonAliasKeywordValue","isPreviousSelectKeywordGroup","nearestPreviousKeyword","normalizedNearestPreviousKeywordValue","previousTokens","numPredicateOperators","numLogicalOperators","nearestCaseKeyword","getSuggestionKinds","LogsSQLCompletionItemProviderFunc","queryContext","LogsSQLCompletionItemProvider","suggestions","toCompletionItem","rest","addSuggestion","suggestion","variable","PPLTokenTypes","nextNonWhiteSpace","normalizedPreviousNonWhiteSpace","nearestFunction","nearestKeyword","nearestCommand","isBeforeLogicalExpression","isListingFields","fieldNames","havePipe","word","tokensUntilFieldName","tokensUntilEscapedFieldName","isPreceededByAFieldName","isAfterComma","isFunctionArgument","PPLCompletionItemProviderFunc","PPLCompletionItemProvider","kind","funct","literal","previousIsSlash","getSelectToken","getSelectStatisticToken","assumedStatisticToken","getMetricNameToken","assumedMetricNameToken","getFromKeywordToken","getNamespaceToken","assumedNamespaceToken","SQLCompletionItemProvider","namespaceToken","m","metricNameToken","n","labelKeyTokens","labelKey","CLOUDWATCH_LOGS_LANGUAGE_DEFINITION_ID","LogsTokenTypes","normalizedCurrentToken","normalizedNonWhitespacePreceedingOpeningParenthesis","LogsCompletionItemProviderFunc","LogsCompletionItemProvider","direction","modifier","MetricMathTokenTypes","currentFunction","isWithinSearch","allTokensAfterStartOfSearch","lastComma","MetricMathCompletionItemProvider","idx","func","wait","mem","CloudWatchRequest","instanceSettings","memoizedDebounce","displayCustomError","data","headers","displayErrorIfIsMultiTemplateVariable","newValues","multiFilters","fieldName","interpolatedKey","initialVal","vals","title","message","CloudWatchAnnotationQueryRunner","queryFn","JSURL","defaultURL","usGovURL","chinaURL","getLogsEndpoint","encodeUrl","obj","addDataLinksToLogsResponse","response","request","replaceFn","getVariableValueFn","getRegion","tracingDatasourceUid","replace","getVariableValue","dataFrame","curTarget","interpolatedRegion","xrayLink","createInternalXrayLink","createAwsConsoleLink","datasourceUid","ds","arns","logGroupNames","interpolatedExpression","interpolatedGroups","urlProps","runWithRetry","queryFun","targets","timeoutFunc","startTime","retries","timerID","subscription","collected","retryWaitFunction","retry","Observable","observer","run","currentQueryParams","refIdsForRequestsToRetry","errorsNotToRetry","splitErrorsData","errors","err","increasingInterval","startPeriod","endPeriod","step","scheduler","dispatch","counter","period","newPeriod","LOG_IDENTIFIER_INTERNAL","LOGSTREAM_IDENTIFIER_INTERNAL","CloudWatchLogsQueryRunner","logQueries","startQueryRequests","mergeMap","startQueryResponse","dataQueryResponse","from","logAnomalyTargets","requestId","requestParams","convertTrendHistogramToSparkline","row","limit","logStreamField","logField","parseLogGroupName","frame","of","interpolatedLogGroupArns","interpolatedLogGroupNames","arn","logsSQLCustomerFormatter","varName","shouldSurroundInQuotes","formatter","queryParams","errorsFromStartQuery","param","responses","concatMap","share","errorsFromGetQuery","dataFrames","map","initialValue","consecutiveFailedAttempts","scan","failures","prevRecordsMatched","frames","recordsMatched","stat","queryResponse","tap","failedAttempts","takeWhile","withTeardown","logQuery","finalize","subtype","hasMissingLegacyLogGroupNames","hasMissingLogGroups","hasMissingQueryString","observable","onUnsubscribe","innerSub","val","logIdentifier","colonIndex","LOG_TREND_FIELD_NAME","fieldIndexToReplace","sparklineRawData","sparklineField","sparklineValue","rowIndex","timestamps","sparklineFieldFrame","ThrottlingErrorMessage","getThrottlingErrorMessage","displayAlert","datasourceName","CloudWatchMetricsQueryRunner","metricQueries","timezoneUTCOffset","validMetricsQueries","migratedAndIterpolatedQuery","dataframes","catchError","failedRefIds","actualRegion","p","ResourcesAPI","path","parameters","externalId","account","r","dimensionKey","instanceId","attributeName","resourceType","tags","logGroupNamePrefix","jsonVariable","isVariableQuery","rawQuery","migrateMultiFilters","oldFilters","tempFilters","parsedFilters","newFilters","migrateVariableQuery","metricNameQuery","dimensionKeysQuery","dimensionValuesQuery","ebsVolumeIdsQuery","ec2InstanceAttributeQuery","resourceARNsQuery","MultiFilterItem","keyPlaceholder","localKey","setLocalKey","localValue","setLocalValue","multiFiltersToFilterConditions","filterConditionsToMultiFilters","MultiFilter","onFiltersChange","newMultifilters","removeMarginBottom","VariableQueryField","label","allowCustomValue","isLoading","inputId","tooltip","interactive","VariableTextField","onBlur","placeholder","queryTypes","attributeNames","VariableQueryEditor","parsedQuery","dimensionKeyError","onRegionChange","sanitizeQuery","onQueryChange","attributeOptions","hasRegionField","hasAccountIDField","hasNamespaceField","CloudWatchVariableSupport","queryObj","logGroupPrefix","interpolatedPrefix","selectableValueToMetricFindOption","keys","instanceID","ids","ec2Filters","metricFindOptions","CloudWatchDatasource","DataSourceWithBackend","logsAnomaliesQueries","annotationQueries","dataQueryResponses","merge","logGroup","k","MAX_LOG_GROUPS","MAX_VISIBLE_LOG_GROUPS","DEBOUNCE_TIMER","LogGroupSelector","selectedLogGroups","onOpenMenu","width","saved","loadingLogGroups","setLoadingLogGroups","availableLogGroups","setAvailableLogGroups","logGroupOptions","fetchLogGroupOptions","onLogGroupSearch","searchTerm","actionMeta","matchingLogGroups","getAvailableLogGroupOptions","onOpenLogGroupMenu","onLogGroupSearchDebounced","rowGap","LegacyLogGroupSelection","legacyLogGroupNames","searchFn","searchPhrase","searchFilter","setSearchFilter","debouncedSearch","Icon","LogGroupsSelector","variables","fetchLogGroups","onBeforeOpen","isModalOpen","setIsModalOpen","selectableLogGroups","setSelectableLogGroups","setSelectedLogGroups","setSearchPhrase","searchAccountId","setSearchAccountId","setIsLoading","selectedLogGroupsCounter","variableOptions","selectedVariable","currentVariableOption","toggleModal","accountNameById","idsToNames","possibleLogGroups","handleSelectCheckbox","isChecked","handleApply","handleCancel","Modal","phrase","LoadingPlaceholder","Checkbox","ev","Label","option","Button","MAX_NO_OF_VISIBLE_LOG_GROUPS","SelectedLogGroups","maxNoOfVisibleLogGroups","showConfirm","setShowConfirm","visibleSelectecLogGroups","setVisibleSelectecLogGroups","slg","ConfirmModal","logGroupStyles","LogGroupsField","loadingLogGroupsStarted","setLoadingLogGroupsStarted","lgn","legacyLogGroupNameValues","LogGroupsFieldWrapper","SecureSocksProxySettingsNewStyling","onOptionsChange","ConfigSection","Field","Switch","xRayDsId","XrayLinkConfig","newFormStyling","hasXrayDatasource","DataSourcePicker","InlineField","ARN_DEPRECATION_WARNING_MESSAGE","CREDENTIALS_AUTHENTICATION_WARNING_MESSAGE","ConfigEditor","logsTimeout","defaultRegion","useDatasource","logsTimeoutError","useTimoutValidation","useDataSourceSavedState","logGroupFieldState","setLogGroupFieldState","report","usePluginInteractionReporter","successSubscription","failSubscription","setExternalId","warning","setWarning","dismissWarning","Divider","updatedLogGroups","uid","setDatasource","setErr","useDebounce","setSaved","MetaInspector","rows","custom","useMigratedQuery","onChangeQuery","migrateQuery","CloudWatchLink","panelData","href","setHref","prevPanelData","usePrevious","start","supressionStateOptions","LogsAnomaliesQueryEditor","Combobox","reRegisterCompletionProvider","completionItemProvider","disposal","id","loader","monarch","registerLanguage","l","byRE","groupsRE","getStatsGroups","groups","b","g","codeEditorCommonProps","PPLQueryEditor","monacoRef","disposalRef","onFocus","nextQuery","onEditorMount","editor","text","onBeforeEditorMount","CodeEditor","LogsQLCodeEditor","SQLQueryEditor","CloudWatchLogsQueryField","ExtraFieldElement","onChangeLogs","getCodeEditor","logsQueryLanguageOptions","logsModeOptions","extraHeaderElementLeft","isQueryNew","setIsQueryNew","onQueryLanguageChange","getDefaultQueryString","onLogsModeChange","logsMode","useEffectOnce","onQueryStringChange","DynamicLabelsCompletionItemProvider","dynamicLabelsCompletionItemProvider","DynamicLabelsField","containerRef","containerDiv","MathExpressionQueryField","updateElementHeight","maxPixelHeight","pixelHeight","pixelWidth","InsightsReservedKeywords","isAccountIdDefined","SQLGenerator","select","where","groupBy","orderBy","orderByDirection","parts","isTopLevelExpression","topLevelExpressionsCount","hasChildExpressions","andParts","exp","andCombined","wrapInParentheses","orParts","orCombined","groupByParts","prefix","property","specialCharacters","startsWithNumber","interpolated","getMetricNameFromExpression","selectExpression","getNamespaceFromExpression","fromExpression","getSchemaLabelKeys","isUsingWithSchema","sanitizeOperator","flattenOperatorExpressions","getFlattenedFilters","sql","flattenGroupByExpressions","getFlattenedGroupBys","stringArrayToDimensions","setSql","setNamespace","namespaceParam","labelKeys","setSchemaLabels","schemaLabels","setMetricName","removeMetricName","queryWithNoParams","setAggregation","aggregation","setOrderBy","setWithSchema","withSchema","setOperatorExpressionProperty","setOperatorExpressionName","setOperatorExpressionValue","setGroupByField","AGGREGATIONS","withSchemaEnabled","namespaceOptions","metricOptions","existingFilters","unusedDimensionKeys","OPERATORS","SQLFilter","filtersFromQuery","setFilters","cleaned","validExpressions","operatorExpression","validated","propertyNameError","operatorValueError","SQLGroupBy","groupBysFromQuery","baseOptions","completeExpressions","makeRenderItem","GroupByItem","orderByDirections","SQLBuilderEditor","sqlString","fullQuery","sqlPreview","setSQLPreview","SQLCodeEditor","metricEditorModes","editorModes","MetricsQueryEditor","extraHeaderElementRight","codeEditorIsDirty","setCodeEditorIsDirty","onEditorModeChange","newMetricEditorMode","updateAccounIdOnMount","isMonitoring","RadioButtonGroup","apiModes","dataIsStale","onRunQuery","queryMode","emptyLogsExpression","onQueryModeChange","shouldDisplayMonitoringBadge","Badge","QueryEditor","setDataIsStale","setExtraHeaderElementLeft","setExtraHeaderElementRight","onChangeInternal","LogsQueryEditor","EditorStack","wrapItems","_b","METRIC_MATH_FNS","METRIC_MATH_STATISTIC_KEYWORD_STRINGS","METRIC_MATH_KEYWORDS","METRIC_MATH_OPERATORS","METRIC_MATH_PERIODS","escapeRegExp","module","exports","stringify","encode","ch","tmpAry","reserved","len","eat","expected","decode","beg","parseOne","sub","def","SCHEMA","STATISTICS","EQUALS","NOT_EQUALS","modifiedChildren","child","borderPriority","labelProp","getSelectStyles","components","SelectContainer","ValueContainer","DYNAMIC_LABEL_PATTERNS","CLOUDWATCH_PPL_LANGUAGE_DEFINITION_ID","EVENTSTATS","EVAL","HEAD","TOP","RARE","PPL_COMMANDS","KEEP_EMPTY","CONSECUTIVE","PARTITIONS","ALLNUM","DELIM","DEDUP_SPLITVALUES","STATS_PARAMETERS","DEDUP_PARAMETERS","PARAMETERS_WITH_BOOLEAN_VALUES","BOOLEAN_LITERALS","MATH_FUNCTIONS","DATE_TIME_FUNCTIONS","TEXT_FUNCTIONS","SPAN","POSITION","CONDITION_FUNCTIONS","SORT_FIELD_FUNCTIONS","PPL_FUNCTIONS","EVAL_FUNCTIONS","STATS_FUNCTIONS","PLUS","MINUS","FIELD_OPERATORS","LOGICAL_EXPRESSION_OPERATORS","PPL_OPERATORS"],"sourceRoot":""}
.
Edit
..
Edit
1117.145ac642f59357bc40d8.js
Edit
1117.145ac642f59357bc40d8.js.map
Edit
1118.c684d1aadf16a6c70620.js
Edit
1118.c684d1aadf16a6c70620.js.map
Edit
1122.5fbf0d7cd148c610616d.js
Edit
1122.5fbf0d7cd148c610616d.js.map
Edit
1142.a4b35a0e8699cafd901e.js
Edit
1142.a4b35a0e8699cafd901e.js.map
Edit
1162.81868b3ac499fa5ea04b.js
Edit
1162.81868b3ac499fa5ea04b.js.map
Edit
1183.7444f51e5996a7f23c7d.js
Edit
1183.7444f51e5996a7f23c7d.js.map
Edit
1282.ae38cac1b732d8ac1d96.js
Edit
1282.ae38cac1b732d8ac1d96.js.map
Edit
130.a58aaeea748f37ee6482.js
Edit
130.a58aaeea748f37ee6482.js.map
Edit
1419.59f53ae25085b28e1e11.js
Edit
1419.59f53ae25085b28e1e11.js.map
Edit
1420.e63ce495727f83b8887d.js
Edit
1420.e63ce495727f83b8887d.js.map
Edit
1438.ccdd05d7188edf4191ff.js
Edit
1438.ccdd05d7188edf4191ff.js.map
Edit
1446.fe7b1f4563629b80793f.js
Edit
1446.fe7b1f4563629b80793f.js.map
Edit
1484.3da94e44ecdadcd342d4.js
Edit
1484.3da94e44ecdadcd342d4.js.map
Edit
1492.4026c6e7130c3afdae87.js
Edit
1494.ef220afb67ff6c52c7af.js
Edit
1494.ef220afb67ff6c52c7af.js.map
Edit
1560.538cd2395be11ba4e2c9.js
Edit
1560.538cd2395be11ba4e2c9.js.map
Edit
1579.c391ef869d4f7bfc0d1c.js
Edit
1579.c391ef869d4f7bfc0d1c.js.map
Edit
1646.d7d87a40853795910533.js
Edit
1646.d7d87a40853795910533.js.map
Edit
1710.7db3f56c6714c0c340e0.js
Edit
1710.7db3f56c6714c0c340e0.js.map
Edit
1716.f71f518289da5d2229bc.js
Edit
1716.f71f518289da5d2229bc.js.map
Edit
1740.baf38e7ee007e1a6935e.js
Edit
1740.baf38e7ee007e1a6935e.js.map
Edit
1821.c9a2456dc8d78cf6b02f.js
Edit
1821.c9a2456dc8d78cf6b02f.js.map
Edit
1888.d33142738af4fbf8a230.js
Edit
1888.d33142738af4fbf8a230.js.map
Edit
1914.5f33b3c2133b5bb7ea6e.js
Edit
1914.5f33b3c2133b5bb7ea6e.js.map
Edit
198.65a768ff6c601d19ea3f.js
Edit
198.65a768ff6c601d19ea3f.js.map
Edit
1990.9171129a8deabb59bf30.js
Edit
1990.9171129a8deabb59bf30.js.map
Edit
2018.5ff00ee0456301c1cf43.js
Edit
2018.5ff00ee0456301c1cf43.js.map
Edit
205.2eb73847215c8d021cc9.js
Edit
205.2eb73847215c8d021cc9.js.map
Edit
2077.a5848ca4b4b9fdebca17.js
Edit
2077.a5848ca4b4b9fdebca17.js.map
Edit
2094.97e7f0876201e76a77fd.js
Edit
2094.97e7f0876201e76a77fd.js.map
Edit
2150.7576285186c713978b39.js
Edit
2150.7576285186c713978b39.js.map
Edit
2152.b55841e6f422682a3891.js
Edit
2152.b55841e6f422682a3891.js.map
Edit
221.0fc4d14d0a67f3a25d64.js
Edit
221.0fc4d14d0a67f3a25d64.js.map
Edit
2218.623d73bd0985ddf5f8c4.js
Edit
2218.623d73bd0985ddf5f8c4.js.map
Edit
2223.e65417164a45701ed9dc.js
Edit
2223.e65417164a45701ed9dc.js.map
Edit
2244.70c156ada2487a05595c.js
Edit
2244.70c156ada2487a05595c.js.map
Edit
2278.f887de0a65e1b784ea9f.js
Edit
2278.f887de0a65e1b784ea9f.js.map
Edit
2288.6a65ba08c6c0f4f83435.js
Edit
2288.6a65ba08c6c0f4f83435.js.map
Edit
2311.73e1a2b949d289f5d6c9.js
Edit
2311.73e1a2b949d289f5d6c9.js.map
Edit
2398.d142e32be48079fc63c0.js
Edit
2398.d142e32be48079fc63c0.js.map
Edit
2405.c1b37a7cc8182472f6a6.js
Edit
2405.c1b37a7cc8182472f6a6.js.map
Edit
2446.0418c7ea000998178d8b.js
Edit
2446.0418c7ea000998178d8b.js.map
Edit
2450.d73c024ff7273aebf911.js
Edit
2450.d73c024ff7273aebf911.js.map
Edit
2586.668c65b61e9ea31b5bca.js
Edit
2586.668c65b61e9ea31b5bca.js.map
Edit
265.ed6933785cc750cbd9ed.js
Edit
265.ed6933785cc750cbd9ed.js.map
Edit
2658.7f70ebc378803654a814.js
Edit
2658.7f70ebc378803654a814.js.map
Edit
2686.ae267304ddd1380c30c7.js
Edit
2686.ae267304ddd1380c30c7.js.map
Edit
2692.fa24ada7d987a7ee05f1.js
Edit
2692.fa24ada7d987a7ee05f1.js.map
Edit
2699.b79e57051a1a63376320.js
Edit
2699.b79e57051a1a63376320.js.map
Edit
2710.e1ac8e57578a838f5bd8.js
Edit
2710.e1ac8e57578a838f5bd8.js.map
Edit
2744.d6b14bf01022bdb8eab5.js
Edit
2744.d6b14bf01022bdb8eab5.js.map
Edit
2745.8049d948cb362dfc6cb3.js
Edit
2745.8049d948cb362dfc6cb3.js.map
Edit
2835.01beb5b1a252d779aad7.js
Edit
2835.01beb5b1a252d779aad7.js.map
Edit
2961.4b27b21453fdbb115dd4.js
Edit
2961.4b27b21453fdbb115dd4.js.map
Edit
2962.85c9dc0cca68efab5e0c.js
Edit
2962.85c9dc0cca68efab5e0c.js.map
Edit
2975.e64aaea6ff35a7d3b3fd.js
Edit
2975.e64aaea6ff35a7d3b3fd.js.map
Edit
3003.f51365051eb27cf765d8.js
Edit
3003.f51365051eb27cf765d8.js.map
Edit
3042.44bad7d2d0536000b808.js
Edit
3042.44bad7d2d0536000b808.js.map
Edit
3062.ad5844391370fcc7525a.js
Edit
3062.ad5844391370fcc7525a.js.map
Edit
3082.704af6779ad700a5fa42.js
Edit
3082.704af6779ad700a5fa42.js.map
Edit
3096.aed61083f1ba4803ae84.js
Edit
3096.aed61083f1ba4803ae84.js.map
Edit
3126.10c85e1f02105e470a69.js
Edit
3126.10c85e1f02105e470a69.js.map
Edit
3169.0b88a5a2340f70961599.js
Edit
3169.0b88a5a2340f70961599.js.map
Edit
3171.c79c28e2611563e2dbcb.js
Edit
3171.c79c28e2611563e2dbcb.js.map
Edit
3182.831f754ed3b6f10441a0.js
Edit
3182.831f754ed3b6f10441a0.js.map
Edit
3192.2cb90eadf3399270363e.js
Edit
3192.2cb90eadf3399270363e.js.map
Edit
3217.c6faaa4f5637068f90f3.js
Edit
3217.c6faaa4f5637068f90f3.js.map
Edit
3259.c8e4d6ad93201a56e49f.js
Edit
3259.c8e4d6ad93201a56e49f.js.map
Edit
3284.79c2897655286b0c1f6d.js
Edit
3284.79c2897655286b0c1f6d.js.map
Edit
3303.225dae64cff0c2280c3b.js
Edit
3303.225dae64cff0c2280c3b.js.map
Edit
3326.cabc370d66d7ecfbd2c3.js
Edit
3326.cabc370d66d7ecfbd2c3.js.map
Edit
344.85cff3029cbbb5463c7e.js
Edit
344.85cff3029cbbb5463c7e.js.map
Edit
3466.fda7da0cb4150e59da98.js
Edit
3466.fda7da0cb4150e59da98.js.map
Edit
3474.74dfd856a9528c758a57.js
Edit
3474.74dfd856a9528c758a57.js.map
Edit
348.fd20e2547f12dbed76c7.js
Edit
348.fd20e2547f12dbed76c7.js.map
Edit
3495.9c1ae6f61edf7aef207b.js
Edit
3495.9c1ae6f61edf7aef207b.js.map
Edit
3501.a0ee7c2b24136aa91eb5.js
Edit
3501.a0ee7c2b24136aa91eb5.js.map
Edit
3520.a3c2b474e2dcaf9879fc.js
Edit
3520.a3c2b474e2dcaf9879fc.js.map
Edit
3605.41e3c44dfe2ca2966198.js
Edit
3605.41e3c44dfe2ca2966198.js.map
Edit
362.e5ce68af98ee6713a4e7.js
Edit
362.e5ce68af98ee6713a4e7.js.map
Edit
3622.0b196041f825b42c5233.js
Edit
3622.0b196041f825b42c5233.js.map
Edit
3630.1ffe9229d5c27fd0823a.js
Edit
3630.1ffe9229d5c27fd0823a.js.map
Edit
3659.f5dc1bb19d36546aadb8.js
Edit
3659.f5dc1bb19d36546aadb8.js.map
Edit
3688.ec5e74c60569e9498687.js
Edit
3688.ec5e74c60569e9498687.js.map
Edit
3718.b570aa4fa35f8dfc686e.js
Edit
3718.b570aa4fa35f8dfc686e.js.map
Edit
3726.84ef8bb1304f7adbc7f3.js
Edit
3726.84ef8bb1304f7adbc7f3.js.map
Edit
398.ceeafcf522343c717c4b.js
Edit
398.ceeafcf522343c717c4b.js.map
Edit
4064.e52eb763993ad947e4a1.js
Edit
4064.e52eb763993ad947e4a1.js.map
Edit
407.594046bd73cc88c29e80.js
Edit
407.594046bd73cc88c29e80.js.map
Edit
4113.3fa5432815c4662eb03e.js
Edit
4113.3fa5432815c4662eb03e.js.map
Edit
4114.c4741f0a73781d3f87dc.js
Edit
4114.c4741f0a73781d3f87dc.js.map
Edit
4120.968e1408d894f8515330.js
Edit
4120.968e1408d894f8515330.js.map
Edit
4162.8b8a683fa98d677f9137.js
Edit
4162.8b8a683fa98d677f9137.js.map
Edit
4209.de7f2b850ee1292a67e5.js
Edit
4209.de7f2b850ee1292a67e5.js.map
Edit
4224.cc13db0c6e3f7fdb05c9.js
Edit
4224.cc13db0c6e3f7fdb05c9.js.map
Edit
4251.28e90ad13c8fe749062c.js
Edit
4251.28e90ad13c8fe749062c.js.map
Edit
4334.396d65b7ba31733108e9.js
Edit
4334.396d65b7ba31733108e9.js.map
Edit
4350.6db49924324f8061d361.js
Edit
4350.6db49924324f8061d361.js.map
Edit
4463.24a3e34bed64cbbb8b99.js
Edit
4463.24a3e34bed64cbbb8b99.js.map
Edit
4514.03e966fee9064d7305dd.js
Edit
4514.03e966fee9064d7305dd.js.map
Edit
4564.ea4a09ba96ddbf74a0ee.js
Edit
4564.ea4a09ba96ddbf74a0ee.js.map
Edit
46.7809585ddbb4791e248a.js
Edit
46.7809585ddbb4791e248a.js.map
Edit
4630.54d7f3b9d384c6b95bbc.js
Edit
4630.54d7f3b9d384c6b95bbc.js.map
Edit
4656.a07d832134b096826a58.js
Edit
4656.a07d832134b096826a58.js.map
Edit
468.d3a2ba8b0d226ca1475b.js
Edit
468.d3a2ba8b0d226ca1475b.js.map
Edit
4680.abd86af55b75e75326ab.js
Edit
4680.abd86af55b75e75326ab.js.map
Edit
4691.2f69f76af87a66a1513c.js
Edit
4691.2f69f76af87a66a1513c.js.map
Edit
4698.c9a2c562b12da12dc66e.js
Edit
4698.c9a2c562b12da12dc66e.js.map
Edit
4791.fc3ef0337811ab73b164.js
Edit
4791.fc3ef0337811ab73b164.js.map
Edit
4814.2d8cb562606e508512d8.js
Edit
4814.2d8cb562606e508512d8.js.map
Edit
4824.2da8107f19d58bf153e0.js
Edit
4824.2da8107f19d58bf153e0.js.map
Edit
4839.f4d2edd5c2678ef2b624.js
Edit
4839.f4d2edd5c2678ef2b624.js.map
Edit
4857.4971a98037d2ec3b663d.js
Edit
4857.4971a98037d2ec3b663d.js.map
Edit
4865.be02c1283a83523c4414.js
Edit
4865.be02c1283a83523c4414.js.map
Edit
494.5463fc5a297eaedd150f.js
Edit
494.5463fc5a297eaedd150f.js.map
Edit
4958.226af5f19bf47305a407.js
Edit
4958.226af5f19bf47305a407.js.map
Edit
4962.bbff24c5a85e9314600a.js
Edit
4962.bbff24c5a85e9314600a.js.map
Edit
4964.1f2cc5acc0078feb7b08.js
Edit
4964.1f2cc5acc0078feb7b08.js.map
Edit
4965.ccdc00d808390be53820.js
Edit
4965.ccdc00d808390be53820.js.map
Edit
5065.a2c71dab50ccb4174ee2.js
Edit
5065.a2c71dab50ccb4174ee2.js.map
Edit
5074.92e2d1ae98dcd913506e.js
Edit
5074.92e2d1ae98dcd913506e.js.map
Edit
5091.987ffc33b70121541e5d.js
Edit
5091.987ffc33b70121541e5d.js.map
Edit
5106.581eaf66a6592320d97a.js
Edit
5106.581eaf66a6592320d97a.js.map
Edit
5110.96d49ea826be96c65045.js
Edit
5110.96d49ea826be96c65045.js.map
Edit
5130.cbdddcd716a093bdbaac.js
Edit
5130.cbdddcd716a093bdbaac.js.map
Edit
5196.9b7364caf64a8583ad01.js
Edit
5196.9b7364caf64a8583ad01.js.map
Edit
5198.2cd64d4e16a385dd9b91.js
Edit
5198.2cd64d4e16a385dd9b91.js.map
Edit
5280.2c29942977baa2dfbe0e.js
Edit
5280.2c29942977baa2dfbe0e.js.map
Edit
5364.0288d9c98f74f26b73e7.js
Edit
5364.0288d9c98f74f26b73e7.js.map
Edit
5446.ad01d0b233122dd49849.js
Edit
5446.ad01d0b233122dd49849.js.map
Edit
5550.5bf3e7d23d6b104740fd.js
Edit
5550.5bf3e7d23d6b104740fd.js.map
Edit
5618.909592bbe054b70f2377.js
Edit
5618.909592bbe054b70f2377.js.map
Edit
5648.a1fc2b0cbbca9bfa1d94.js
Edit
5648.a1fc2b0cbbca9bfa1d94.js.map
Edit
5664.c55be32f6d459ac3f3d8.js
Edit
5664.c55be32f6d459ac3f3d8.js.map
Edit
5671.e1e396b75d7b95ef461f.js
Edit
5671.e1e396b75d7b95ef461f.js.map
Edit
5742.117597ec799ab75cb2f4.js
Edit
5742.117597ec799ab75cb2f4.js.map
Edit
5747.b9389680058c12ffba68.js
Edit
5747.b9389680058c12ffba68.js.map
Edit
5757.5a4b7f2368dd09da42be.js
Edit
5786.c45dfaf9e1d969472e5e.js
Edit
5786.c45dfaf9e1d969472e5e.js.map
Edit
5790.29b0a5797fd46e9664f5.js
Edit
5790.29b0a5797fd46e9664f5.js.map
Edit
5923.b9c876b4bf528d8511cb.js
Edit
5923.b9c876b4bf528d8511cb.js.map
Edit
5984.1efdc4bb85100bd19ca9.js
Edit
5984.1efdc4bb85100bd19ca9.js.map
Edit
5995.5c7a375f33ea1cd16daa.js
Edit
5995.5c7a375f33ea1cd16daa.js.map
Edit
6018.befdd11bf701ea71f7bf.js
Edit
6018.befdd11bf701ea71f7bf.js.map
Edit
6029.bdcbf27bcdd36812f646.js
Edit
6029.bdcbf27bcdd36812f646.js.map
Edit
6088.7f526abfdb4003574c68.js
Edit
6088.7f526abfdb4003574c68.js.map
Edit
613.084d33252856771cf6e1.js
Edit
613.084d33252856771cf6e1.js.map
Edit
6185.2a7c893c6b3f2f0dadb8.js
Edit
6185.2a7c893c6b3f2f0dadb8.js.map
Edit
6208.571f272269524cfd14e7.js
Edit
6208.571f272269524cfd14e7.js.map
Edit
6236.30d1fa6aee173c946c50.js
Edit
6236.30d1fa6aee173c946c50.js.map
Edit
6244.64f83fc5d05560979c51.js
Edit
6244.64f83fc5d05560979c51.js.map
Edit
6260.b8be95165766a81dade2.js
Edit
6260.b8be95165766a81dade2.js.map
Edit
630.56b78dcdaeeb9d9c2967.js
Edit
630.56b78dcdaeeb9d9c2967.js.map
Edit
6302.a2ffa52069511df9772f.js
Edit
6302.a2ffa52069511df9772f.js.map
Edit
6315.f4d87fc6f8ae3cb40e38.js
Edit
6315.f4d87fc6f8ae3cb40e38.js.map
Edit
6414.7520859a2d9cc0a63d7f.js
Edit
6414.7520859a2d9cc0a63d7f.js.map
Edit
6446.1d75a8140260005fffbd.js
Edit
6446.1d75a8140260005fffbd.js.map
Edit
6743.67a52a99e2fdd1ae1e10.js
Edit
6743.67a52a99e2fdd1ae1e10.js.map
Edit
6759.0454d3c1e41385379bdc.js
Edit
6759.0454d3c1e41385379bdc.js.map
Edit
6772.0d4a074848bc323be8f8.js
Edit
6772.0d4a074848bc323be8f8.js.map
Edit
680.726adca366b4ecb272db.js
Edit
680.726adca366b4ecb272db.js.map
Edit
6830.a4b0ecf3a6d784ca7609.js
Edit
6830.a4b0ecf3a6d784ca7609.js.map
Edit
6834.0c9ef40e2f2b5428983d.js
Edit
6834.0c9ef40e2f2b5428983d.js.map
Edit
6857.252a60422ee275193aa7.js
Edit
6857.252a60422ee275193aa7.js.map
Edit
6940.b6c74df14413f0188f0d.js
Edit
6940.b6c74df14413f0188f0d.js.map
Edit
6990.d663924714fc213b17c6.js
Edit
6990.d663924714fc213b17c6.js.map
Edit
7018.5a037d2577fedc8d10f1.js
Edit
7018.5a037d2577fedc8d10f1.js.map
Edit
7031.047b15171c23b248efa0.js
Edit
7031.047b15171c23b248efa0.js.map
Edit
7033.141597840e42815ef6a4.js
Edit
7033.141597840e42815ef6a4.js.map
Edit
7048.3746fc9a274bf8ff72f1.js
Edit
7048.3746fc9a274bf8ff72f1.js.map
Edit
7051.604a402d305e093c00c2.js
Edit
7051.604a402d305e093c00c2.js.map
Edit
7061.f18464bcd6c6d7455662.js
Edit
7061.f18464bcd6c6d7455662.js.map
Edit
7080.9cdd1b7a0bf62b48e1fe.js
Edit
7080.9cdd1b7a0bf62b48e1fe.js.map
Edit
7200.d4425528f6cee80f9931.js
Edit
7200.d4425528f6cee80f9931.js.map
Edit
7235.46f071d3e4d0bb976223.js
Edit
7235.46f071d3e4d0bb976223.js.map
Edit
7246.03f5a8496e53f64602e2.js
Edit
7246.03f5a8496e53f64602e2.js.map
Edit
7249.3bea4aaf890f89fdad45.js
Edit
7249.3bea4aaf890f89fdad45.js.map
Edit
7299.cdff402b076dfea09ead.js
Edit
7299.cdff402b076dfea09ead.js.map
Edit
7348.6fd722455e8c7e077815.js
Edit
7348.6fd722455e8c7e077815.js.map
Edit
7396.ded473b7a47dc42fbb59.js
Edit
7396.ded473b7a47dc42fbb59.js.map
Edit
7466.b7c17c526c7b734dd5f7.js
Edit
7466.b7c17c526c7b734dd5f7.js.map
Edit
7539.5f405cae3b15e1e2f6fa.js
Edit
7539.5f405cae3b15e1e2f6fa.js.map
Edit
7585.084552e02c66201a55be.js
Edit
7585.084552e02c66201a55be.js.map
Edit
7626.38819cc0696f2d25cf99.js
Edit
7626.38819cc0696f2d25cf99.js.map
Edit
7651.5024ed8dd1beb08d01ab.js
Edit
7651.5024ed8dd1beb08d01ab.js.map
Edit
7681.7ef7b4f86e99abd7b7e1.js
Edit
7681.7ef7b4f86e99abd7b7e1.js.map
Edit
7691.0ad86f0c686b19ce829e.js
Edit
7691.0ad86f0c686b19ce829e.js.map
Edit
7790.4c141092868e7208a087.js
Edit
7790.4c141092868e7208a087.js.map
Edit
7806.dff3509790e494ca5a45.js
Edit
7806.dff3509790e494ca5a45.js.map
Edit
7836.afe37ef4be354f0a3b91.js
Edit
7836.afe37ef4be354f0a3b91.js.map
Edit
7882.e1721e9d6ac2d421bcda.js
Edit
7882.e1721e9d6ac2d421bcda.js.map
Edit
7886.8499ded396232466be7d.js
Edit
7886.8499ded396232466be7d.js.map
Edit
7887.a6dcfd824d57598ba1c3.js
Edit
7887.a6dcfd824d57598ba1c3.js.map
Edit
7969.a048d8060cabf1aede33.js
Edit
7969.a048d8060cabf1aede33.js.map
Edit
7996.bd232896e4559d37a26f.js
Edit
7996.bd232896e4559d37a26f.js.map
Edit
8016.8145cd87abcdd0646db2.js
Edit
8016.8145cd87abcdd0646db2.js.map
Edit
8018.c31846109f2dff21d8c4.js
Edit
8018.c31846109f2dff21d8c4.js.map
Edit
8056.4e8f71ed4d507f89b487.js
Edit
8056.4e8f71ed4d507f89b487.js.map
Edit
8177.52abd0953ac914f69e26.js
Edit
8177.52abd0953ac914f69e26.js.map
Edit
8220.aeea4a8f0893b3447b56.js
Edit
8220.aeea4a8f0893b3447b56.js.map
Edit
8224.75bd73bf51ff7a2fc4a0.js
Edit
8224.75bd73bf51ff7a2fc4a0.js.map
Edit
8230.d65bce2998eec95c6082.js
Edit
8230.d65bce2998eec95c6082.js.map
Edit
8260.c1da67af19b9259d5651.js
Edit
8260.c1da67af19b9259d5651.js.map
Edit
8271.0ee36e030014244adb47.js
Edit
8271.0ee36e030014244adb47.js.map
Edit
8332.a62e8632a336661f2969.js
Edit
8332.a62e8632a336661f2969.js.map
Edit
8334.1196f5ddcef25711fc25.js
Edit
8334.1196f5ddcef25711fc25.js.map
Edit
8347.de402f9280cd7a316c57.js
Edit
8347.de402f9280cd7a316c57.js.map
Edit
8390.9de755da2e214cc845a3.js
Edit
8390.9de755da2e214cc845a3.js.map
Edit
8393.30e95ae45cbe5455dcda.js
Edit
8393.30e95ae45cbe5455dcda.js.map
Edit
8477.4dad0537d13cf9315e86.js
Edit
8477.4dad0537d13cf9315e86.js.map
Edit
8494.659892f00c9d15ae441a.js
Edit
8494.659892f00c9d15ae441a.js.map
Edit
8530.0460c988ee4a40ce7769.js
Edit
8530.0460c988ee4a40ce7769.js.map
Edit
8542.317c15ed57f68fcf0c97.js
Edit
8542.317c15ed57f68fcf0c97.js.map
Edit
8547.390120a5caf7646e0e3e.js
Edit
8547.390120a5caf7646e0e3e.js.map
Edit
8566.5c8f392bb383ab92eed0.js
Edit
8566.5c8f392bb383ab92eed0.js.map
Edit
8622.5acf73c1485a11dfb0ab.js
Edit
8622.5acf73c1485a11dfb0ab.js.map
Edit
8706.f17afa6bcdfd511d5b03.js
Edit
8706.f17afa6bcdfd511d5b03.js.map
Edit
874.d24410518317d605c708.js
Edit
874.d24410518317d605c708.js.map
Edit
8813.e5137844631f6ddedbce.js
Edit
8813.e5137844631f6ddedbce.js.map
Edit
8856.2720526447b3adb5c75f.js
Edit
8856.2720526447b3adb5c75f.js.map
Edit
886.5f3383e84b10a6530b97.js
Edit
886.5f3383e84b10a6530b97.js.map
Edit
8864.2f4ee982114c25634e55.js
Edit
8864.2f4ee982114c25634e55.js.map
Edit
8902.71f14964ec6cea84dc8e.js
Edit
8902.71f14964ec6cea84dc8e.js.map
Edit
8932.e59e50ddb63414e0f2b9.js
Edit
8932.e59e50ddb63414e0f2b9.js.map
Edit
8990.665213a5c89afd6b2f83.js
Edit
8990.665213a5c89afd6b2f83.js.map
Edit
9034.a32e36472481cbe5d72d.js
Edit
9034.a32e36472481cbe5d72d.js.map
Edit
9038.f03b25f160057d4a0bf6.js
Edit
9038.f03b25f160057d4a0bf6.js.map
Edit
904.b68cd2a0cd6d68c5f1ae.js
Edit
904.b68cd2a0cd6d68c5f1ae.js.map
Edit
9044.441f64d6d946cc93be46.js
Edit
9044.441f64d6d946cc93be46.js.map
Edit
9147.8309cadbc384209d62e5.js
Edit
9147.8309cadbc384209d62e5.js.map
Edit
9150.38487365ffd149b730af.js
Edit
9150.38487365ffd149b730af.js.map
Edit
9292.e6befb57f8f116ad95a8.js
Edit
9292.e6befb57f8f116ad95a8.js.map
Edit
9355.95d7e1782f93f339549e.js
Edit
9355.95d7e1782f93f339549e.js.map
Edit
9388.88d95a230e9432e7037b.js
Edit
9388.88d95a230e9432e7037b.js.map
Edit
9390.c72fcd228017f7647b38.js
Edit
9390.c72fcd228017f7647b38.js.map
Edit
9414.642bfe0d5eb16efd0c16.js
Edit
9414.642bfe0d5eb16efd0c16.js.map
Edit
9449.502f2a824d0203e88d4d.js
Edit
9449.502f2a824d0203e88d4d.js.map
Edit
946.48c5e8c688cf29424295.js
Edit
946.48c5e8c688cf29424295.js.map
Edit
9473.e6fc327da88d88712828.js
Edit
9473.e6fc327da88d88712828.js.map
Edit
9510.1e255e96fe40aad2ed6f.js
Edit
9510.1e255e96fe40aad2ed6f.js.map
Edit
9521.e65411d726c29d77c526.js
Edit
9521.e65411d726c29d77c526.js.map
Edit
9538.a2289ff9ad06e24e391f.js
Edit
9538.a2289ff9ad06e24e391f.js.map
Edit
957.3c35d66aa698d8bdfe05.js
Edit
957.3c35d66aa698d8bdfe05.js.map
Edit
9571.41558d40bff9ea8c0726.js
Edit
9571.41558d40bff9ea8c0726.js.map
Edit
9578.9cfae16465bb9bc1f336.js
Edit
9578.9cfae16465bb9bc1f336.js.map
Edit
968.d4b150f9211c478b7b05.js
Edit
968.d4b150f9211c478b7b05.js.map
Edit
970.46f17b76711e4961a575.js
Edit
970.46f17b76711e4961a575.js.map
Edit
9700.02180b7a06c8a1f7606b.js
Edit
9700.02180b7a06c8a1f7606b.js.map
Edit
9744.aa6baaf988a68fa6a9ba.js
Edit
9744.aa6baaf988a68fa6a9ba.js.map
Edit
9820.6b462d83575efd05c883.js
Edit
9820.6b462d83575efd05c883.js.map
Edit
9838.06bd7dfd4290786f80e3.js
Edit
9838.06bd7dfd4290786f80e3.js.map
Edit
9992.fb08517d3ff77e887443.js
Edit
9992.fb08517d3ff77e887443.js.map
Edit
9996.21c451f22ff76b4bb683.js
Edit
9996.21c451f22ff76b4bb683.js.map
Edit
AdminAuthentication.076c98c6380fd1e42f7e.js
Edit
AdminAuthentication.076c98c6380fd1e42f7e.js.map
Edit
AdminEditOrgPage.8df8167ea6ff8f4803bd.js
Edit
AdminEditOrgPage.8df8167ea6ff8f4803bd.js.map
Edit
AdminListOrgsPage.176dac9ed391bda8952b.js
Edit
AdminListOrgsPage.176dac9ed391bda8952b.js.map
Edit
AdminSettings.7373ed8fa9b943bb2098.js
Edit
AdminSettings.7373ed8fa9b943bb2098.js.map
Edit
AlertGroups.81264e6e5009c36eed6e.js
Edit
AlertGroups.81264e6e5009c36eed6e.js.map
Edit
AlertRuleListIndex.98e7328feeaa2ffe67eb.js
Edit
AlertRuleListIndex.98e7328feeaa2ffe67eb.js.map
Edit
AlertingDisabled.b2c834be0ca4666dd793.js
Edit
AlertingDisabled.b2c834be0ca4666dd793.js.map
Edit
AlertingGroupDetails.3a2c6ef8085b505852e4.js
Edit
AlertingGroupDetails.3a2c6ef8085b505852e4.js.map
Edit
AlertingGroupEdit.69cfe9d5f37a1fc65326.js
Edit
AlertingGroupEdit.69cfe9d5f37a1fc65326.js.map
Edit
AlertingHome.06f307ab9a2a5d8b7f93.js
Edit
AlertingHome.06f307ab9a2a5d8b7f93.js.map
Edit
AlertingImportFromDSRules.f1224bcb622d25e2c94f.js
Edit
AlertingImportFromDSRules.f1224bcb622d25e2c94f.js.map
Edit
AlertingRedirectToRule.9ed1d16829d6833d2827.js
Edit
AlertingRedirectToRule.9ed1d16829d6833d2827.js.map
Edit
AlertingRuleForm.2e69d3f00eb6221e7355.js
Edit
AlertingRuleForm.2e69d3f00eb6221e7355.js.map
Edit
AlertingSettings.7a5f782f877cec4790cb.js
Edit
AlertingSettings.7a5f782f877cec4790cb.js.map
Edit
AlertingTriage.1174f36b4937ad0047c1.js
Edit
AlertingTriage.1174f36b4937ad0047c1.js.map
Edit
BenchmarksPage.ef387f4598ba2b2236ad.js
Edit
BenchmarksPage.ef387f4598ba2b2236ad.js.map
Edit
BookmarksPage.8fe93eb7377073f0c985.js
Edit
BookmarksPage.8fe93eb7377073f0c985.js.map
Edit
ChangePasswordPage.f21b0b1dd107ccd33c1a.js
Edit
ChangePasswordPage.f21b0b1dd107ccd33c1a.js.map
Edit
Connections.949b6389e73bcadb2109.js
Edit
Connections.949b6389e73bcadb2109.js.map
Edit
ContactPoints.9ae2d1927d60c6169b87.js
Edit
ContactPoints.9ae2d1927d60c6169b87.js.map
Edit
CorrelationsFeatureToggle.ec2f1aefce6b456e15eb.js
Edit
CorrelationsFeatureToggle.ec2f1aefce6b456e15eb.js.map
Edit
CorrelationsPage.bd7fcd24ed0b5fe8ac3e.js
Edit
CorrelationsPage.bd7fcd24ed0b5fe8ac3e.js.map
Edit
CreateTeam.429acf93986740280312.js
Edit
CreateTeam.429acf93986740280312.js.map
Edit
DashboardImport.3e9b6f980b81d6f1c755.js
Edit
DashboardImport.3e9b6f980b81d6f1c755.js.map
Edit
DashboardListPage.abeb0c29f072f888f9fb.js
Edit
DashboardListPage.abeb0c29f072f888f9fb.js.map
Edit
DashboardPage.72557fe6dd1a022b7d48.js
Edit
DashboardPage.72557fe6dd1a022b7d48.js.map
Edit
DashboardPageProxy.80adfefad8a885d8e2ef.js
Edit
DashboardPageProxy.80adfefad8a885d8e2ef.js.map
Edit
DashboardScenePage.83fe1fa9509b50120d65.js
Edit
DashboardScenePage.83fe1fa9509b50120d65.js.map
Edit
EditContactPoint.0c33428ddc8ba974d946.js
Edit
EditContactPoint.0c33428ddc8ba974d946.js.map
Edit
EditMuteTiming.8760cc9c77560acf0cd6.js
Edit
EditMuteTiming.8760cc9c77560acf0cd6.js.map
Edit
EditRepositoryPage.d71faaab1af2c8d70a22.js
Edit
EditRepositoryPage.d71faaab1af2c8d70a22.js.map
Edit
EmbeddedDashboard.57de550bce819e3d52e6.js
Edit
EmbeddedDashboard.57de550bce819e3d52e6.js.map
Edit
FileHistoryPage.154ab77c19bbe0ebed20.js
Edit
FileHistoryPage.154ab77c19bbe0ebed20.js.map
Edit
FileStatusPage.36f58cd61202ec603d22.js
Edit
FileStatusPage.36f58cd61202ec603d22.js.map
Edit
FolderAlerting.0b9acb6c42276aaee57d.js
Edit
FolderAlerting.0b9acb6c42276aaee57d.js.map
Edit
FolderLibraryPanelsPage.44f8cabf542ec314d176.js
Edit
FolderLibraryPanelsPage.44f8cabf542ec314d176.js.map
Edit
GettingStartedPage.4bea37f1c9bdcfd0f41b.js
Edit
GettingStartedPage.4bea37f1c9bdcfd0f41b.js.map
Edit
GlobalConfig.1377596507974d18caf6.js
Edit
GlobalConfig.1377596507974d18caf6.js.map
Edit
HistoryPage.4da98f4fa313ee3676ca.js
Edit
HistoryPage.4da98f4fa313ee3676ca.js.map
Edit
LdapSettingsPage.0e9f08d5e59150ecf466.js
Edit
LdapSettingsPage.0e9f08d5e59150ecf466.js.map
Edit
LibraryPanelsPage.824580d7751526c658e2.js
Edit
LibraryPanelsPage.824580d7751526c658e2.js.map
Edit
ListPublicDashboardPage.64c26ffd3ebe6c9076f3.js
Edit
ListPublicDashboardPage.64c26ffd3ebe6c9076f3.js.map
Edit
LoginPage.db48423ed1b455431daa.js
Edit
LoginPage.db48423ed1b455431daa.js.map
Edit
MetricsDrilldownRedirect.fcad4bdff346974952f4.js
Edit
MetricsDrilldownRedirect.fcad4bdff346974952f4.js.map
Edit
MigrateToCloud.5b474ad00e8a3d979750.js
Edit
MigrateToCloud.5b474ad00e8a3d979750.js.map
Edit
NewMuteTiming.2f6302420674f1c73aba.js
Edit
NewMuteTiming.2f6302420674f1c73aba.js.map
Edit
NewOrgPage.be31eaee06e2043d609b.js
Edit
NewOrgPage.be31eaee06e2043d609b.js.map
Edit
NewReceiverView.f1d83eb66a39882b8661.js
Edit
NewReceiverView.f1d83eb66a39882b8661.js.map
Edit
NewSilencePage.2643a48031f7e5d8f376.js
Edit
NewSilencePage.2643a48031f7e5d8f376.js.map
Edit
NotificationPoliciesPage.9333d10ecad1452ebf27.js
Edit
NotificationPoliciesPage.9333d10ecad1452ebf27.js.map
Edit
NotificationsPage.57df4ff5ba1433a4345d.js
Edit
NotificationsPage.57df4ff5ba1433a4345d.js.map
Edit
OrgDetailsPage.7b5835c30585aae81343.js
Edit
OrgDetailsPage.7b5835c30585aae81343.js.map
Edit
PlaylistEditPage.8310e384af659e40c313.js
Edit
PlaylistEditPage.8310e384af659e40c313.js.map
Edit
PlaylistNewPage.f45b642a98a747e28c0d.js
Edit
PlaylistNewPage.f45b642a98a747e28c0d.js.map
Edit
PlaylistPage.9af74957a1cdfb125338.js
Edit
PlaylistPage.9af74957a1cdfb125338.js.map
Edit
PlaylistStartPage.8011a98267ac64c7fa05.js
Edit
PlaylistStartPage.8011a98267ac64c7fa05.js.map
Edit
PluginExtensionsLog.54c02047d569b0c05823.js
Edit
PluginExtensionsLog.54c02047d569b0c05823.js.map
Edit
PluginListPage.e50c18fed21c23ca4ee8.js
Edit
PluginListPage.e50c18fed21c23ca4ee8.js.map
Edit
PluginPage.ae424531bce63dd4721e.js
Edit
PluginPage.ae424531bce63dd4721e.js.map
Edit
ProfileFeatureTogglePage.27378dcbb7520611348e.js
Edit
ProfileFeatureTogglePage.27378dcbb7520611348e.js.map
Edit
ProvisioningWizardPage.c4e4a8f431b4719b0e95.js
Edit
ProvisioningWizardPage.c4e4a8f431b4719b0e95.js.map
Edit
PublicDashboardPage.33d6ec8f685f1b70b9a6.js
Edit
PublicDashboardPage.33d6ec8f685f1b70b9a6.js.map
Edit
RecentlyDeleted.5e0ec16474d939fd9683.js
Edit
RecentlyDeleted.5e0ec16474d939fd9683.js.map
Edit
RecentlyDeletedPage.1dbc2b80b28204de8237.js
Edit
RecentlyDeletedPage.1dbc2b80b28204de8237.js.map
Edit
RepositoryListPage.ec3a0af1cbe2740800bf.js
Edit
RepositoryListPage.ec3a0af1cbe2740800bf.js.map
Edit
RepositoryStatusPage.9aee60589e35a4a19ec2.js
Edit
RepositoryStatusPage.9aee60589e35a4a19ec2.js.map
Edit
SelectOrgPage.910a8d842019a6d7fe93.js
Edit
SelectOrgPage.910a8d842019a6d7fe93.js.map
Edit
SendResetMailPage.513361d6980f98ff8139.js
Edit
SendResetMailPage.513361d6980f98ff8139.js.map
Edit
ServerStats.2830ca154f465dbdecea.js
Edit
ServerStats.2830ca154f465dbdecea.js.map
Edit
ServiceAccountCreatePage.80fcbdd2b7f5aa4e2da1.js
Edit
ServiceAccountCreatePage.80fcbdd2b7f5aa4e2da1.js.map
Edit
ServiceAccountPage.48944056459bb412ff33.js
Edit
ServiceAccountPage.48944056459bb412ff33.js.map
Edit
ServiceAccountsPage.d20b1eb9f87661f10b45.js
Edit
ServiceAccountsPage.d20b1eb9f87661f10b45.js.map
Edit
SignupInvited.fe2c29f380e9888c28cf.js
Edit
SignupInvited.fe2c29f380e9888c28cf.js.map
Edit
SilencesTablePage.b998fdbdcc3d60a81739.js
Edit
SilencesTablePage.b998fdbdcc3d60a81739.js.map
Edit
SnapshotListPage.6feaf24adb92e6a302ec.js
Edit
SnapshotListPage.6feaf24adb92e6a302ec.js.map
Edit
SoloPanelPage.7fc6a934aaadf4c1f84d.js
Edit
SoloPanelPage.7fc6a934aaadf4c1f84d.js.map
Edit
SoloPanelPageOld.bde57e000dd0a0108685.js
Edit
SoloPanelPageOld.bde57e000dd0a0108685.js.map
Edit
SupportBundles.1f46603ad3494624d67a.js
Edit
SupportBundles.1f46603ad3494624d67a.js.map
Edit
SupportBundlesCreate.5eaea61a9713f057277b.js
Edit
SupportBundlesCreate.5eaea61a9713f057277b.js.map
Edit
TeamList.6b088f83e6e8cb66b21d.js
Edit
TeamList.6b088f83e6e8cb66b21d.js.map
Edit
TeamPages.9d8b5dceef8be43c6923.js
Edit
TeamPages.9d8b5dceef8be43c6923.js.map
Edit
Templates.7a02a8497ebca052dcfb.js
Edit
Templates.7a02a8497ebca052dcfb.js.map
Edit
TestStuffPage.982c641592b2f7c9db40.js
Edit
TestStuffPage.982c641592b2f7c9db40.js.map
Edit
ThemePlayground.aeeec77fd8e9c1482f55.js
Edit
ThemePlayground.aeeec77fd8e9c1482f55.js.map
Edit
UserAdminPage.fc4d562eef05d9f59aca.js
Edit
UserAdminPage.fc4d562eef05d9f59aca.js.map
Edit
UserCreatePage.b7036214c66612fb31e9.js
Edit
UserCreatePage.b7036214c66612fb31e9.js.map
Edit
UserInvitePage.4a9bcd4084d7ae454c73.js
Edit
UserInvitePage.4a9bcd4084d7ae454c73.js.map
Edit
UserListPage.a452e1153ae820f58ac9.js
Edit
UserListPage.a452e1153ae820f58ac9.js.map
Edit
UserProfileEditPage.82c11690282e669eabb1.js
Edit
UserProfileEditPage.82c11690282e669eabb1.js.map
Edit
alert-rules-drawer-content.c95bb5ddd3fc813cae92.js
Edit
alert-rules-drawer-content.c95bb5ddd3fc813cae92.js.map
Edit
alert-rules-toolbar-button.0d86c1adae7edb55ff76.js
Edit
alert-rules-toolbar-button.0d86c1adae7edb55ff76.js.map
Edit
alertListPanel.0110106a8d1ab70d65d5.js
Edit
alertListPanel.0110106a8d1ab70d65d5.js.map
Edit
alertmanagerPlugin.2b59de5e7b7a556f87f1.js
Edit
alertmanagerPlugin.2b59de5e7b7a556f87f1.js.map
Edit
annoListPanel.0005a0eab0b05e24d970.js
Edit
annoListPanel.0005a0eab0b05e24d970.js.map
Edit
app.8385deda1df49aa75ec2.js
Edit
app.8385deda1df49aa75ec2.js.map
Edit
assets-manifest.json
Edit
barChartPanel.eecdaeab7d146d477721.js
Edit
barChartPanel.eecdaeab7d146d477721.js.map
Edit
barGaugePanel.6d9e94bbb72ba92a0e9b.js
Edit
barGaugePanel.6d9e94bbb72ba92a0e9b.js.map
Edit
candlestickPanel.af0e0decd06e7b7ab286.js
Edit
candlestickPanel.af0e0decd06e7b7ab286.js.map
Edit
canvasPanel.ddab72fab6e58c3419b2.js
Edit
canvasPanel.ddab72fab6e58c3419b2.js.map
Edit
cloudwatchPlugin.06ef34f60000c4f7ea37.js
Edit
cloudwatchPlugin.06ef34f60000c4f7ea37.js.map
Edit
dark.b66fa87185b9a313ec14.js
Edit
dashListPanel.23b954da0c4888602048.js
Edit
dashListPanel.23b954da0c4888602048.js.map
Edit
dataGridPanel.bb5d4b678cba38dd380b.js
Edit
debugPanel.fff63da32084d7a2e236.js
Edit
debugPanel.fff63da32084d7a2e236.js.map
Edit
elasticsearchPlugin.3f2edb012f5162b48903.js
Edit
elasticsearchPlugin.3f2edb012f5162b48903.js.map
Edit
explore-feature-toggle-page.3de03fa91c88d05cea1c.js
Edit
explore-feature-toggle-page.3de03fa91c88d05cea1c.js.map
Edit
explore.dd32637df83326225e0d.js
Edit
explore.dd32637df83326225e0d.js.map
Edit
flamegraphPanel.cc6c5b4bcd69e406fbb7.js
Edit
flamegraphPanel.cc6c5b4bcd69e406fbb7.js.map
Edit
gaugePanel.5da3c4e39a652e281cc4.js
Edit
gaugePanel.5da3c4e39a652e281cc4.js.map
Edit
gazetteer
Edit
geomapPanel.67ebb4567e9b5fa5074b.js
Edit
gettingStartedPanel.833059170dbbf8d5c4bf.js
Edit
gettingStartedPanel.833059170dbbf8d5c4bf.js.map
Edit
grafana.1492.25120d27db88f863e058.css
Edit
grafana.4350.a45e45977094df4a0bc9.css
Edit
grafana.5790.ffb3a9cd952d3cd7471b.css
Edit
grafana.DashboardPage.a66335f88cd003e4a44f.css
Edit
grafana.DashboardPageProxy.a66335f88cd003e4a44f.css
Edit
grafana.app.1f6473bb54b1e1647be8.css
Edit
grafana.dark.1e8d85816912aadbbba5.css
Edit
grafana.dataGridPanel.c1fc5db1829b1b31eb4d.css
Edit
grafana.geomapPanel.0057d964fa972bb207ec.css
Edit
grafana.light.111a5a99fcebc0962ddc.css
Edit
grafana.livePanel.25120d27db88f863e058.css
Edit
grafana.react-monaco-editor.ffb3a9cd952d3cd7471b.css
Edit
grafana.swagger.d0a2da197b9827204ac1.css
Edit
grafana.tablePanel.25120d27db88f863e058.css
Edit
grafanaPlugin.f21cdb4b84a732cc9dd8.js
Edit
grafanaPlugin.f21cdb4b84a732cc9dd8.js.map
Edit
heatmapPanel.7834b997bc573eddba88.js
Edit
heatmapPanel.7834b997bc573eddba88.js.map
Edit
histogramPanel.9953bfeccf8774500c0c.js
Edit
histogramPanel.9953bfeccf8774500c0c.js.map
Edit
img
Edit
influxdbPlugin.7a899e63be0a65d41e13.js
Edit
influxdbPlugin.7a899e63be0a65d41e13.js.map
Edit
light.827d442410485e491818.js
Edit
livePanel.2a43f499bc746d928d45.js
Edit
livePanel.2a43f499bc746d928d45.js.map
Edit
logsPanel.a328022d248508a083c1.js
Edit
logsPanel.a328022d248508a083c1.js.map
Edit
loki-query-field.f9a0b82b636d4821760c.js
Edit
loki-query-field.f9a0b82b636d4821760c.js.map
Edit
maps
Edit
mixedPlugin.3a69de93f366afbb2f85.js
Edit
newsPanel.c17f40f7c88ea14620e7.js
Edit
newsPanel.c17f40f7c88ea14620e7.js.map
Edit
nodeGraphPanel.f717a9075d994a9a8af4.js
Edit
nodeGraphPanel.f717a9075d994a9a8af4.js.map
Edit
opentsdbPlugin.1795eab1c223ea030c2e.js
Edit
opentsdbPlugin.1795eab1c223ea030c2e.js.map
Edit
pieChartPanel.45166aa6d57d163817ea.js
Edit
pieChartPanel.45166aa6d57d163817ea.js.map
Edit
prometheusPlugin.c3a55eb5353085fc3d2b.js
Edit
prometheusPlugin.c3a55eb5353085fc3d2b.js.map
Edit
radialBarPanel.294c52d497d8f5c2bebb.js
Edit
radialBarPanel.294c52d497d8f5c2bebb.js.map
Edit
runtime.a37cc2f12a959f33871a.js
Edit
runtime.a37cc2f12a959f33871a.js.map
Edit
sql-query-editor.e767d4a2aef360034bd9.js
Edit
sql-query-editor.e767d4a2aef360034bd9.js.map
Edit
statPanel.3a7f191bfb27fd320014.js
Edit
statPanel.3a7f191bfb27fd320014.js.map
Edit
stateTimelinePanel.08d857b143ef89dc195f.js
Edit
stateTimelinePanel.08d857b143ef89dc195f.js.map
Edit
static
Edit
statusHistoryPanel.29f7b8dc01039ba795af.js
Edit
statusHistoryPanel.29f7b8dc01039ba795af.js.map
Edit
swagger.06875a6266679f54141d.js
Edit
swagger.06875a6266679f54141d.js.map
Edit
tablePanel.43861ce2a60617dcd19d.js
Edit
tablePanel.43861ce2a60617dcd19d.js.map
Edit
textPanel.867ee60d01b2039aa159.js
Edit
textPanel.867ee60d01b2039aa159.js.map
Edit
timeseriesPanel.b4a947da450030262a31.js
Edit
timeseriesPanel.b4a947da450030262a31.js.map
Edit
tracesPanel.35bfc3e5ff6bea4212a3.js
Edit
tracesPanel.35bfc3e5ff6bea4212a3.js.map
Edit
trendPanel.001aff2bd153e737c464.js
Edit
trendPanel.001aff2bd153e737c464.js.map
Edit
vis-data.b34535ebabc0fcb91557.js
Edit
vis-data.b34535ebabc0fcb91557.js.map
Edit
vis-network.1b41caf21892c9525709.js
Edit
vis-network.1b41caf21892c9525709.js.map
Edit
welcomeBanner.1a693c9dc02006be4f0b.js
Edit
welcomeBanner.1a693c9dc02006be4f0b.js.map
Edit
xychart.cb20af67a6c495ba6ccd.js
Edit
xychart.cb20af67a6c495ba6ccd.js.map
Edit