@perses-dev/plugin-system 0.0.0-snapshot-saving-defaults-refinements-1b25cec → 0.0.0-snapshot-time-chart-rewrite-4667058

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/cjs/components/CalculationSelector/CalculationSelector.js +4 -9
  2. package/dist/cjs/components/LegendOptionsEditor/LegendOptionsEditor.js +182 -0
  3. package/dist/cjs/components/LegendOptionsEditor/index.js +28 -0
  4. package/dist/cjs/components/index.js +1 -0
  5. package/dist/cjs/index.js +1 -0
  6. package/dist/cjs/model/index.js +1 -1
  7. package/dist/cjs/model/legend.js +85 -0
  8. package/dist/cjs/runtime/TimeRangeProvider/TimeRangeProvider.js +11 -11
  9. package/dist/cjs/runtime/TimeRangeProvider/query-params.js +80 -1
  10. package/dist/cjs/runtime/template-variables.js +9 -3
  11. package/dist/cjs/runtime/time-series-queries.js +5 -2
  12. package/dist/cjs/stories/shared-utils/decorators/WithTimeRange.js +1 -0
  13. package/dist/cjs/utils/index.js +28 -0
  14. package/dist/cjs/utils/variables.js +68 -0
  15. package/dist/components/CalculationSelector/CalculationSelector.d.ts +1 -1
  16. package/dist/components/CalculationSelector/CalculationSelector.d.ts.map +1 -1
  17. package/dist/components/CalculationSelector/CalculationSelector.js +3 -8
  18. package/dist/components/CalculationSelector/CalculationSelector.js.map +1 -1
  19. package/dist/components/LegendOptionsEditor/LegendOptionsEditor.d.ts +8 -0
  20. package/dist/components/LegendOptionsEditor/LegendOptionsEditor.d.ts.map +1 -0
  21. package/dist/components/LegendOptionsEditor/LegendOptionsEditor.js +176 -0
  22. package/dist/components/LegendOptionsEditor/LegendOptionsEditor.js.map +1 -0
  23. package/dist/components/LegendOptionsEditor/index.d.ts +2 -0
  24. package/dist/components/LegendOptionsEditor/index.d.ts.map +1 -0
  25. package/dist/components/LegendOptionsEditor/index.js +15 -0
  26. package/dist/components/LegendOptionsEditor/index.js.map +1 -0
  27. package/dist/components/index.d.ts +1 -0
  28. package/dist/components/index.d.ts.map +1 -1
  29. package/dist/components/index.js +1 -0
  30. package/dist/components/index.js.map +1 -1
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/model/index.d.ts +1 -1
  36. package/dist/model/index.d.ts.map +1 -1
  37. package/dist/model/index.js +1 -1
  38. package/dist/model/index.js.map +1 -1
  39. package/dist/model/legend.d.ts +16 -0
  40. package/dist/model/legend.d.ts.map +1 -0
  41. package/dist/model/legend.js +76 -0
  42. package/dist/model/legend.js.map +1 -0
  43. package/dist/model/time-series-queries.d.ts +1 -0
  44. package/dist/model/time-series-queries.d.ts.map +1 -1
  45. package/dist/model/time-series-queries.js.map +1 -1
  46. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.d.ts +5 -1
  47. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.d.ts.map +1 -1
  48. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.js +12 -12
  49. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.js.map +1 -1
  50. package/dist/runtime/TimeRangeProvider/query-params.d.ts +12 -0
  51. package/dist/runtime/TimeRangeProvider/query-params.d.ts.map +1 -1
  52. package/dist/runtime/TimeRangeProvider/query-params.js +82 -1
  53. package/dist/runtime/TimeRangeProvider/query-params.js.map +1 -1
  54. package/dist/runtime/template-variables.d.ts +1 -1
  55. package/dist/runtime/template-variables.d.ts.map +1 -1
  56. package/dist/runtime/template-variables.js +8 -1
  57. package/dist/runtime/template-variables.js.map +1 -1
  58. package/dist/runtime/time-series-queries.d.ts +1 -1
  59. package/dist/runtime/time-series-queries.d.ts.map +1 -1
  60. package/dist/runtime/time-series-queries.js +5 -2
  61. package/dist/runtime/time-series-queries.js.map +1 -1
  62. package/dist/stories/shared-utils/decorators/WithTimeRange.js +1 -0
  63. package/dist/stories/shared-utils/decorators/WithTimeRange.js.map +1 -1
  64. package/dist/utils/index.d.ts +2 -0
  65. package/dist/utils/index.d.ts.map +1 -0
  66. package/dist/utils/index.js +15 -0
  67. package/dist/utils/index.js.map +1 -0
  68. package/dist/utils/variables.d.ts +9 -0
  69. package/dist/utils/variables.d.ts.map +1 -0
  70. package/dist/utils/variables.js +57 -0
  71. package/dist/utils/variables.js.map +1 -0
  72. package/package.json +5 -8
  73. package/dist/cjs/model/calculations.js +0 -82
  74. package/dist/model/calculations.d.ts +0 -21
  75. package/dist/model/calculations.d.ts.map +0 -1
  76. package/dist/model/calculations.js +0 -70
  77. package/dist/model/calculations.js.map +0 -1
@@ -13,7 +13,7 @@
13
13
  import { jsx as _jsx } from "react/jsx-runtime";
14
14
  import React, { useMemo, useState, useCallback, createContext, useContext } from 'react';
15
15
  import { isRelativeTimeRange, toAbsoluteTimeRange } from '@perses-dev/core';
16
- import { useSetTimeRangeParams } from './query-params';
16
+ import { useSetRefreshIntervalParams, useSetTimeRangeParams } from './query-params';
17
17
  export const TimeRangeContext = /*#__PURE__*/ createContext(undefined);
18
18
  export function useTimeRangeContext() {
19
19
  const ctx = useContext(TimeRangeContext);
@@ -25,20 +25,14 @@ export function useTimeRangeContext() {
25
25
  /**
26
26
  * Get and set the current resolved time range at runtime.
27
27
  */ export function useTimeRange() {
28
- const { timeRange , absoluteTimeRange , setTimeRange , refresh , refreshKey } = useTimeRangeContext();
29
- return {
30
- timeRange,
31
- absoluteTimeRange,
32
- setTimeRange,
33
- refresh,
34
- refreshKey
35
- };
28
+ return useTimeRangeContext();
36
29
  }
37
30
  /**
38
31
  * Provider implementation that supplies the time range state at runtime.
39
32
  */ export function TimeRangeProvider(props) {
40
- const { initialTimeRange , enabledURLParams , children } = props;
33
+ const { initialTimeRange , initialRefreshInterval , enabledURLParams , children } = props;
41
34
  const { timeRange , setTimeRange } = useSetTimeRangeParams(initialTimeRange, enabledURLParams);
35
+ const { refreshInterval , setRefreshInterval , refreshIntervalInMs } = useSetRefreshIntervalParams(initialRefreshInterval, enabledURLParams);
42
36
  const [refreshKey, setRefreshKey] = useState(0);
43
37
  const refresh = useCallback(()=>{
44
38
  setRefreshKey(refreshKey + 1);
@@ -52,13 +46,19 @@ export function useTimeRangeContext() {
52
46
  setTimeRange,
53
47
  absoluteTimeRange,
54
48
  refresh,
55
- refreshKey: `${absoluteTimeRange.start}:${absoluteTimeRange.end}:${refreshKey}`
49
+ refreshKey: `${absoluteTimeRange.start}:${absoluteTimeRange.end}:${refreshInterval}:${refreshKey}`,
50
+ refreshInterval,
51
+ refreshIntervalInMs,
52
+ setRefreshInterval
56
53
  };
57
54
  }, [
58
55
  timeRange,
59
56
  setTimeRange,
60
57
  refresh,
61
- refreshKey
58
+ refreshKey,
59
+ refreshInterval,
60
+ refreshIntervalInMs,
61
+ setRefreshInterval
62
62
  ]);
63
63
  return /*#__PURE__*/ _jsx(TimeRangeContext.Provider, {
64
64
  value: ctx,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtime/TimeRangeProvider/TimeRangeProvider.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { useMemo, useState, useCallback, createContext, useContext } from 'react';\nimport { AbsoluteTimeRange, isRelativeTimeRange, TimeRangeValue, toAbsoluteTimeRange } from '@perses-dev/core';\nimport { useSetTimeRangeParams } from './query-params';\n\nexport interface TimeRangeProviderProps {\n initialTimeRange: TimeRangeValue;\n enabledURLParams?: boolean;\n children?: React.ReactNode;\n}\n\nexport interface TimeRange {\n timeRange: TimeRangeValue;\n absoluteTimeRange: AbsoluteTimeRange; // resolved absolute time for plugins to use\n setTimeRange: (value: TimeRangeValue) => void;\n refresh: () => void;\n refreshKey: string;\n}\n\nexport const TimeRangeContext = createContext<TimeRange | undefined>(undefined);\n\nexport function useTimeRangeContext() {\n const ctx = useContext(TimeRangeContext);\n if (ctx === undefined) {\n throw new Error('No TimeRangeContext found. Did you forget a Provider?');\n }\n return ctx;\n}\n\n/**\n * Get and set the current resolved time range at runtime.\n */\nexport function useTimeRange(): TimeRange {\n const { timeRange, absoluteTimeRange, setTimeRange, refresh, refreshKey } = useTimeRangeContext();\n return { timeRange, absoluteTimeRange, setTimeRange, refresh, refreshKey };\n}\n\n/**\n * Provider implementation that supplies the time range state at runtime.\n */\nexport function TimeRangeProvider(props: TimeRangeProviderProps) {\n const { initialTimeRange, enabledURLParams, children } = props;\n\n const { timeRange, setTimeRange } = useSetTimeRangeParams(initialTimeRange, enabledURLParams);\n\n const [refreshKey, setRefreshKey] = useState(0);\n\n const refresh = useCallback(() => {\n setRefreshKey(refreshKey + 1);\n }, [refreshKey]);\n\n const ctx = useMemo(() => {\n const absoluteTimeRange = isRelativeTimeRange(timeRange) ? toAbsoluteTimeRange(timeRange) : timeRange;\n return {\n timeRange,\n setTimeRange,\n absoluteTimeRange,\n refresh,\n refreshKey: `${absoluteTimeRange.start}:${absoluteTimeRange.end}:${refreshKey}`,\n };\n }, [timeRange, setTimeRange, refresh, refreshKey]);\n\n return <TimeRangeContext.Provider value={ctx}>{children}</TimeRangeContext.Provider>;\n}\n"],"names":["React","useMemo","useState","useCallback","createContext","useContext","isRelativeTimeRange","toAbsoluteTimeRange","useSetTimeRangeParams","TimeRangeContext","undefined","useTimeRangeContext","ctx","Error","useTimeRange","timeRange","absoluteTimeRange","setTimeRange","refresh","refreshKey","TimeRangeProvider","props","initialTimeRange","enabledURLParams","children","setRefreshKey","start","end","Provider","value"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC;AAAA,OAAOA,KAAK,IAAIC,OAAO,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,aAAa,EAAEC,UAAU,QAAQ,OAAO,CAAC;AACzF,SAA4BC,mBAAmB,EAAkBC,mBAAmB,QAAQ,kBAAkB,CAAC;AAC/G,SAASC,qBAAqB,QAAQ,gBAAgB,CAAC;AAgBvD,OAAO,MAAMC,gBAAgB,iBAAGL,aAAa,CAAwBM,SAAS,CAAC,CAAC;AAEhF,OAAO,SAASC,mBAAmB,GAAG;IACpC,MAAMC,GAAG,GAAGP,UAAU,CAACI,gBAAgB,CAAC,AAAC;IACzC,IAAIG,GAAG,KAAKF,SAAS,EAAE;QACrB,MAAM,IAAIG,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAOD,GAAG,CAAC;AACb,CAAC;AAED;;CAEC,GACD,OAAO,SAASE,YAAY,GAAc;IACxC,MAAM,EAAEC,SAAS,CAAA,EAAEC,iBAAiB,CAAA,EAAEC,YAAY,CAAA,EAAEC,OAAO,CAAA,EAAEC,UAAU,CAAA,EAAE,GAAGR,mBAAmB,EAAE,AAAC;IAClG,OAAO;QAAEI,SAAS;QAAEC,iBAAiB;QAAEC,YAAY;QAAEC,OAAO;QAAEC,UAAU;KAAE,CAAC;AAC7E,CAAC;AAED;;CAEC,GACD,OAAO,SAASC,iBAAiB,CAACC,KAA6B,EAAE;IAC/D,MAAM,EAAEC,gBAAgB,CAAA,EAAEC,gBAAgB,CAAA,EAAEC,QAAQ,CAAA,EAAE,GAAGH,KAAK,AAAC;IAE/D,MAAM,EAAEN,SAAS,CAAA,EAAEE,YAAY,CAAA,EAAE,GAAGT,qBAAqB,CAACc,gBAAgB,EAAEC,gBAAgB,CAAC,AAAC;IAE9F,MAAM,CAACJ,UAAU,EAAEM,aAAa,CAAC,GAAGvB,QAAQ,CAAC,CAAC,CAAC,AAAC;IAEhD,MAAMgB,OAAO,GAAGf,WAAW,CAAC,IAAM;QAChCsB,aAAa,CAACN,UAAU,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC,EAAE;QAACA,UAAU;KAAC,CAAC,AAAC;IAEjB,MAAMP,GAAG,GAAGX,OAAO,CAAC,IAAM;QACxB,MAAMe,iBAAiB,GAAGV,mBAAmB,CAACS,SAAS,CAAC,GAAGR,mBAAmB,CAACQ,SAAS,CAAC,GAAGA,SAAS,AAAC;QACtG,OAAO;YACLA,SAAS;YACTE,YAAY;YACZD,iBAAiB;YACjBE,OAAO;YACPC,UAAU,EAAE,CAAC,EAAEH,iBAAiB,CAACU,KAAK,CAAC,CAAC,EAAEV,iBAAiB,CAACW,GAAG,CAAC,CAAC,EAAER,UAAU,CAAC,CAAC;SAChF,CAAC;IACJ,CAAC,EAAE;QAACJ,SAAS;QAAEE,YAAY;QAAEC,OAAO;QAAEC,UAAU;KAAC,CAAC,AAAC;IAEnD,qBAAO,KAACV,gBAAgB,CAACmB,QAAQ;QAACC,KAAK,EAAEjB,GAAG;kBAAGY,QAAQ;MAA6B,CAAC;AACvF,CAAC"}
1
+ {"version":3,"sources":["../../../src/runtime/TimeRangeProvider/TimeRangeProvider.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { useMemo, useState, useCallback, createContext, useContext } from 'react';\nimport {\n AbsoluteTimeRange,\n DurationString,\n isRelativeTimeRange,\n TimeRangeValue,\n toAbsoluteTimeRange,\n} from '@perses-dev/core';\nimport { useSetRefreshIntervalParams, useSetTimeRangeParams } from './query-params';\n\nexport interface TimeRangeProviderProps {\n initialTimeRange: TimeRangeValue;\n initialRefreshInterval?: DurationString;\n enabledURLParams?: boolean;\n children?: React.ReactNode;\n}\n\nexport interface TimeRange {\n timeRange: TimeRangeValue;\n absoluteTimeRange: AbsoluteTimeRange; // resolved absolute time for plugins to use\n setTimeRange: (value: TimeRangeValue) => void;\n refresh: () => void;\n refreshKey: string;\n refreshInterval?: DurationString;\n refreshIntervalInMs: number;\n setRefreshInterval: (value: DurationString) => void;\n}\n\nexport const TimeRangeContext = createContext<TimeRange | undefined>(undefined);\n\nexport function useTimeRangeContext() {\n const ctx = useContext(TimeRangeContext);\n if (ctx === undefined) {\n throw new Error('No TimeRangeContext found. Did you forget a Provider?');\n }\n return ctx;\n}\n\n/**\n * Get and set the current resolved time range at runtime.\n */\nexport function useTimeRange(): TimeRange {\n return useTimeRangeContext();\n}\n\n/**\n * Provider implementation that supplies the time range state at runtime.\n */\nexport function TimeRangeProvider(props: TimeRangeProviderProps) {\n const { initialTimeRange, initialRefreshInterval, enabledURLParams, children } = props;\n\n const { timeRange, setTimeRange } = useSetTimeRangeParams(initialTimeRange, enabledURLParams);\n const { refreshInterval, setRefreshInterval, refreshIntervalInMs } = useSetRefreshIntervalParams(\n initialRefreshInterval,\n enabledURLParams\n );\n\n const [refreshKey, setRefreshKey] = useState(0);\n\n const refresh = useCallback(() => {\n setRefreshKey(refreshKey + 1);\n }, [refreshKey]);\n\n const ctx = useMemo(() => {\n const absoluteTimeRange = isRelativeTimeRange(timeRange) ? toAbsoluteTimeRange(timeRange) : timeRange;\n return {\n timeRange,\n setTimeRange,\n absoluteTimeRange,\n refresh,\n refreshKey: `${absoluteTimeRange.start}:${absoluteTimeRange.end}:${refreshInterval}:${refreshKey}`,\n refreshInterval,\n refreshIntervalInMs,\n setRefreshInterval,\n };\n }, [timeRange, setTimeRange, refresh, refreshKey, refreshInterval, refreshIntervalInMs, setRefreshInterval]);\n\n return <TimeRangeContext.Provider value={ctx}>{children}</TimeRangeContext.Provider>;\n}\n"],"names":["React","useMemo","useState","useCallback","createContext","useContext","isRelativeTimeRange","toAbsoluteTimeRange","useSetRefreshIntervalParams","useSetTimeRangeParams","TimeRangeContext","undefined","useTimeRangeContext","ctx","Error","useTimeRange","TimeRangeProvider","props","initialTimeRange","initialRefreshInterval","enabledURLParams","children","timeRange","setTimeRange","refreshInterval","setRefreshInterval","refreshIntervalInMs","refreshKey","setRefreshKey","refresh","absoluteTimeRange","start","end","Provider","value"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC;AAAA,OAAOA,KAAK,IAAIC,OAAO,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,aAAa,EAAEC,UAAU,QAAQ,OAAO,CAAC;AACzF,SAGEC,mBAAmB,EAEnBC,mBAAmB,QACd,kBAAkB,CAAC;AAC1B,SAASC,2BAA2B,EAAEC,qBAAqB,QAAQ,gBAAgB,CAAC;AAoBpF,OAAO,MAAMC,gBAAgB,iBAAGN,aAAa,CAAwBO,SAAS,CAAC,CAAC;AAEhF,OAAO,SAASC,mBAAmB,GAAG;IACpC,MAAMC,GAAG,GAAGR,UAAU,CAACK,gBAAgB,CAAC,AAAC;IACzC,IAAIG,GAAG,KAAKF,SAAS,EAAE;QACrB,MAAM,IAAIG,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAOD,GAAG,CAAC;AACb,CAAC;AAED;;CAEC,GACD,OAAO,SAASE,YAAY,GAAc;IACxC,OAAOH,mBAAmB,EAAE,CAAC;AAC/B,CAAC;AAED;;CAEC,GACD,OAAO,SAASI,iBAAiB,CAACC,KAA6B,EAAE;IAC/D,MAAM,EAAEC,gBAAgB,CAAA,EAAEC,sBAAsB,CAAA,EAAEC,gBAAgB,CAAA,EAAEC,QAAQ,CAAA,EAAE,GAAGJ,KAAK,AAAC;IAEvF,MAAM,EAAEK,SAAS,CAAA,EAAEC,YAAY,CAAA,EAAE,GAAGd,qBAAqB,CAACS,gBAAgB,EAAEE,gBAAgB,CAAC,AAAC;IAC9F,MAAM,EAAEI,eAAe,CAAA,EAAEC,kBAAkB,CAAA,EAAEC,mBAAmB,CAAA,EAAE,GAAGlB,2BAA2B,CAC9FW,sBAAsB,EACtBC,gBAAgB,CACjB,AAAC;IAEF,MAAM,CAACO,UAAU,EAAEC,aAAa,CAAC,GAAG1B,QAAQ,CAAC,CAAC,CAAC,AAAC;IAEhD,MAAM2B,OAAO,GAAG1B,WAAW,CAAC,IAAM;QAChCyB,aAAa,CAACD,UAAU,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC,EAAE;QAACA,UAAU;KAAC,CAAC,AAAC;IAEjB,MAAMd,GAAG,GAAGZ,OAAO,CAAC,IAAM;QACxB,MAAM6B,iBAAiB,GAAGxB,mBAAmB,CAACgB,SAAS,CAAC,GAAGf,mBAAmB,CAACe,SAAS,CAAC,GAAGA,SAAS,AAAC;QACtG,OAAO;YACLA,SAAS;YACTC,YAAY;YACZO,iBAAiB;YACjBD,OAAO;YACPF,UAAU,EAAE,CAAC,EAAEG,iBAAiB,CAACC,KAAK,CAAC,CAAC,EAAED,iBAAiB,CAACE,GAAG,CAAC,CAAC,EAAER,eAAe,CAAC,CAAC,EAAEG,UAAU,CAAC,CAAC;YAClGH,eAAe;YACfE,mBAAmB;YACnBD,kBAAkB;SACnB,CAAC;IACJ,CAAC,EAAE;QAACH,SAAS;QAAEC,YAAY;QAAEM,OAAO;QAAEF,UAAU;QAAEH,eAAe;QAAEE,mBAAmB;QAAED,kBAAkB;KAAC,CAAC,AAAC;IAE7G,qBAAO,KAACf,gBAAgB,CAACuB,QAAQ;QAACC,KAAK,EAAErB,GAAG;kBAAGQ,QAAQ;MAA6B,CAAC;AACvF,CAAC"}
@@ -13,6 +13,9 @@ export declare const timeRangeQueryConfig: {
13
13
  start: QueryParamConfig<TimeOptionValue, TimeOptionValue>;
14
14
  end: QueryParamConfig<TimeOptionValue, TimeOptionValue>;
15
15
  };
16
+ export declare const refreshIntervalQueryConfig: {
17
+ refresh: QueryParamConfig<TimeOptionValue, TimeOptionValue>;
18
+ };
16
19
  /**
17
20
  * Gets the initial time range taking into account URL params and dashboard JSON duration
18
21
  * Sets start query param if it is empty on page load
@@ -22,4 +25,13 @@ export declare function useInitialTimeRange(dashboardDuration: DurationString):
22
25
  * Returns time range getter and setter, set enabledURLParams to false to disable query string serialization
23
26
  */
24
27
  export declare function useSetTimeRangeParams(initialTimeRange: TimeRangeValue, enabledURLParams?: boolean): Pick<TimeRange, 'timeRange' | 'setTimeRange'>;
28
+ /**
29
+ * Gets the initial refresh interval taking into account URL params and dashboard JSON duration
30
+ * Sets refresh query param if it is empty on page load
31
+ */
32
+ export declare function useInitialRefreshInterval(dashboardDuration: DurationString): DurationString;
33
+ /**
34
+ * Returns refresh interval getter and setter, set enabledURLParams to false to disable query string serialization
35
+ */
36
+ export declare function useSetRefreshIntervalParams(initialRefreshInterval?: DurationString, enabledURLParams?: boolean): Pick<TimeRange, 'refreshInterval' | 'setRefreshInterval' | 'refreshIntervalInMs'>;
25
37
  //# sourceMappingURL=query-params.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-params.d.ts","sourceRoot":"","sources":["../../../src/runtime/TimeRangeProvider/query-params.ts"],"names":[],"mappings":"AAcA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EACL,cAAc,EAGd,cAAc,EAEf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,oBAAY,eAAe,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;AA2BvE,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAWhG;AAGD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,GACtD,IAAI,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,CAI1C;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAQ7E,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;CAGhC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,cAAc,GAAG,cAAc,CAgBrF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,cAAc,EAChC,gBAAgB,UAAO,GACtB,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,cAAc,CAAC,CAqC/C"}
1
+ {"version":3,"file":"query-params.d.ts","sourceRoot":"","sources":["../../../src/runtime/TimeRangeProvider/query-params.ts"],"names":[],"mappings":"AAcA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EACL,cAAc,EAGd,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,oBAAY,eAAe,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;AA2BvE,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAWhG;AAGD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,GACtD,IAAI,GAAG,cAAc,GAAG,IAAI,GAAG,SAAS,CAI1C;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAQ7E,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;CAGhC,CAAC;AAEF,eAAO,MAAM,0BAA0B;;CAEtC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,cAAc,GAAG,cAAc,CAgBrF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,cAAc,EAChC,gBAAgB,UAAO,GACtB,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,cAAc,CAAC,CAqC/C;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,iBAAiB,EAAE,cAAc,GAAG,cAAc,CAc3F;AAaD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,sBAAsB,CAAC,EAAE,cAAc,EACvC,gBAAgB,UAAO,GACtB,IAAI,CAAC,SAAS,EAAE,iBAAiB,GAAG,oBAAoB,GAAG,qBAAqB,CAAC,CAqCnF"}
@@ -13,7 +13,7 @@
13
13
  import { useMemo, useCallback, useEffect, useState } from 'react';
14
14
  import { useQueryParams } from 'use-query-params';
15
15
  import { getUnixTime, isDate } from 'date-fns';
16
- import { isRelativeTimeRange, isDurationString } from '@perses-dev/core';
16
+ import { isRelativeTimeRange, isDurationString, parseDurationString } from '@perses-dev/core';
17
17
  /* Interprets an encoded string and returns either the string or null/undefined if not available */ function getEncodedValue(input, allowEmptyString) {
18
18
  if (input == null) {
19
19
  return input;
@@ -63,6 +63,9 @@ export const timeRangeQueryConfig = {
63
63
  start: TimeRangeParam,
64
64
  end: TimeRangeParam
65
65
  };
66
+ export const refreshIntervalQueryConfig = {
67
+ refresh: TimeRangeParam
68
+ };
66
69
  /**
67
70
  * Gets the initial time range taking into account URL params and dashboard JSON duration
68
71
  * Sets start query param if it is empty on page load
@@ -149,5 +152,83 @@ export const timeRangeQueryConfig = {
149
152
  setTimeRange: setTimeRange
150
153
  };
151
154
  }
155
+ /**
156
+ * Gets the initial refresh interval taking into account URL params and dashboard JSON duration
157
+ * Sets refresh query param if it is empty on page load
158
+ */ export function useInitialRefreshInterval(dashboardDuration) {
159
+ const [query] = useQueryParams(refreshIntervalQueryConfig, {
160
+ updateType: 'replaceIn'
161
+ });
162
+ const { refresh } = query;
163
+ return useMemo(()=>{
164
+ let initialTimeRange = dashboardDuration;
165
+ if (!refresh) {
166
+ return initialTimeRange;
167
+ }
168
+ const startStr = refresh.toString();
169
+ if (isDurationString(startStr)) {
170
+ initialTimeRange = startStr;
171
+ }
172
+ return initialTimeRange;
173
+ }, [
174
+ dashboardDuration,
175
+ refresh
176
+ ]);
177
+ }
178
+ function getRefreshIntervalInMs(refreshInterval) {
179
+ let refreshIntervalInMs = 0;
180
+ if (refreshInterval) {
181
+ const refreshIntervalDuration = parseDurationString(refreshInterval);
182
+ if (refreshIntervalDuration && refreshIntervalDuration.seconds) {
183
+ refreshIntervalInMs = (refreshIntervalDuration === null || refreshIntervalDuration === void 0 ? void 0 : refreshIntervalDuration.seconds) * 1000;
184
+ }
185
+ }
186
+ return refreshIntervalInMs;
187
+ }
188
+ /**
189
+ * Returns refresh interval getter and setter, set enabledURLParams to false to disable query string serialization
190
+ */ export function useSetRefreshIntervalParams(initialRefreshInterval, enabledURLParams = true) {
191
+ const [query, setQuery] = useQueryParams(refreshIntervalQueryConfig, {
192
+ updateType: 'replaceIn'
193
+ });
194
+ // determine whether initial param had previously been populated to fix back btn
195
+ const [paramsLoaded, setParamsLoaded] = useState(false);
196
+ // optional fallback when app does not want query string as source of truth
197
+ // this occurs when enabledURLParams is set to false on TimeRangeProvider
198
+ const [refreshIntervalState, setRefreshIntervalState] = useState(initialRefreshInterval);
199
+ const { refresh } = query;
200
+ useEffect(()=>{
201
+ // when dashboard loaded with no params, default to dashboard duration
202
+ if (enabledURLParams && !paramsLoaded && !refresh) {
203
+ setQuery({
204
+ refresh: initialRefreshInterval
205
+ });
206
+ setParamsLoaded(true);
207
+ }
208
+ }, [
209
+ initialRefreshInterval,
210
+ enabledURLParams,
211
+ paramsLoaded,
212
+ refresh,
213
+ setQuery
214
+ ]);
215
+ const setRefreshInterval = useCallback((refresh)=>setQuery({
216
+ refresh
217
+ }), [
218
+ setQuery
219
+ ]);
220
+ if (!enabledURLParams) {
221
+ return {
222
+ refreshInterval: refreshIntervalState,
223
+ setRefreshInterval: setRefreshIntervalState,
224
+ refreshIntervalInMs: getRefreshIntervalInMs(refreshIntervalState)
225
+ };
226
+ }
227
+ return {
228
+ refreshInterval: initialRefreshInterval,
229
+ setRefreshInterval: setRefreshInterval,
230
+ refreshIntervalInMs: getRefreshIntervalInMs(initialRefreshInterval)
231
+ };
232
+ }
152
233
 
153
234
  //# sourceMappingURL=query-params.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtime/TimeRangeProvider/query-params.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { useMemo, useCallback, useEffect, useState } from 'react';\nimport { useQueryParams, QueryParamConfig } from 'use-query-params';\nimport { getUnixTime, isDate } from 'date-fns';\nimport {\n TimeRangeValue,\n isRelativeTimeRange,\n isDurationString,\n DurationString,\n AbsoluteTimeRange,\n} from '@perses-dev/core';\nimport { TimeRange } from './TimeRangeProvider';\n\nexport type TimeOptionValue = Date | DurationString | null | undefined;\n\n/* Interprets an encoded string and returns either the string or null/undefined if not available */\nfunction getEncodedValue(\n input: string | Array<string | null> | null | undefined,\n allowEmptyString?: boolean\n): string | null | undefined {\n if (input == null) {\n return input;\n }\n // '' or []\n if (input.length === 0 && (!allowEmptyString || (allowEmptyString && input !== ''))) {\n return null;\n }\n\n const str = input instanceof Array ? input[0] : input;\n if (str == null) {\n return str;\n }\n if (!allowEmptyString && str === '') {\n return null;\n }\n\n return str;\n}\n\n/* Encodes individual TimeRangeValue as a string, depends on whether start is relative or absolute */\nexport function encodeTimeRangeValue(timeOptionValue: TimeOptionValue): string | null | undefined {\n if (!timeOptionValue) {\n return timeOptionValue;\n }\n\n if (typeof timeOptionValue === 'string') {\n if (isDurationString(timeOptionValue)) {\n return timeOptionValue;\n }\n }\n return (getUnixTime(timeOptionValue) * 1000).toString();\n}\n\n/* Converts param input to supported relative or absolute time range format */\nexport function decodeTimeRangeValue(\n input: string | Array<string | null> | null | undefined\n): Date | DurationString | null | undefined {\n const paramString = getEncodedValue(input);\n if (paramString == null) return paramString;\n return isDurationString(paramString) ? paramString : new Date(Number(paramString));\n}\n\n/**\n * Custom TimeRangeValue param type\n * See: https://github.com/pbeshai/use-query-params/tree/master/packages/serialize-query-params#param-types\n */\nexport const TimeRangeParam: QueryParamConfig<TimeOptionValue, TimeOptionValue> = {\n encode: encodeTimeRangeValue,\n decode: decodeTimeRangeValue,\n equals: (valueA: TimeOptionValue, valueB: TimeOptionValue) => {\n if (valueA === valueB) return true;\n if (valueA == null || valueB == null) return valueA === valueB;\n return valueA.valueOf() === valueB.valueOf();\n },\n};\n\nexport const timeRangeQueryConfig = {\n start: TimeRangeParam,\n end: TimeRangeParam,\n};\n\n/**\n * Gets the initial time range taking into account URL params and dashboard JSON duration\n * Sets start query param if it is empty on page load\n */\nexport function useInitialTimeRange(dashboardDuration: DurationString): TimeRangeValue {\n const [query] = useQueryParams(timeRangeQueryConfig, { updateType: 'replaceIn' });\n const { start, end } = query;\n return useMemo(() => {\n let initialTimeRange: TimeRangeValue = { pastDuration: dashboardDuration };\n if (!start) {\n return initialTimeRange;\n }\n const startStr = start.toString();\n if (isDurationString(startStr)) {\n initialTimeRange = { pastDuration: startStr };\n } else if (isDate(start) && isDate(end)) {\n initialTimeRange = { start: start, end: end } as AbsoluteTimeRange;\n }\n return initialTimeRange;\n }, [start, end, dashboardDuration]);\n}\n\n/**\n * Returns time range getter and setter, set enabledURLParams to false to disable query string serialization\n */\nexport function useSetTimeRangeParams(\n initialTimeRange: TimeRangeValue,\n enabledURLParams = true\n): Pick<TimeRange, 'timeRange' | 'setTimeRange'> {\n const [query, setQuery] = useQueryParams(timeRangeQueryConfig, { updateType: 'replaceIn' });\n\n // determine whether initial param had previously been populated to fix back btn\n const [paramsLoaded, setParamsLoaded] = useState<boolean>(false);\n\n // optional fallback when app does not want query string as source of truth\n // this occurs when enabledURLParams is set to false on TimeRangeProvider\n const [timeRangeState, setTimeRangeState] = useState<TimeRangeValue>(initialTimeRange);\n\n const { start } = query;\n\n useEffect(() => {\n // when dashboard loaded with no params, default to dashboard duration\n if (enabledURLParams && !paramsLoaded && !start) {\n if (isRelativeTimeRange(initialTimeRange)) {\n setQuery({ start: initialTimeRange.pastDuration, end: undefined });\n setParamsLoaded(true);\n }\n }\n }, [initialTimeRange, enabledURLParams, paramsLoaded, start, setQuery]);\n\n const setTimeRange: TimeRange['setTimeRange'] = useCallback(\n (value: TimeRangeValue) => {\n if (isRelativeTimeRange(value)) {\n setQuery({ start: value.pastDuration, end: undefined });\n } else {\n setQuery(value);\n }\n },\n [setQuery]\n );\n\n if (!enabledURLParams) {\n return { timeRange: timeRangeState, setTimeRange: setTimeRangeState };\n }\n return { timeRange: initialTimeRange, setTimeRange: setTimeRange };\n}\n"],"names":["useMemo","useCallback","useEffect","useState","useQueryParams","getUnixTime","isDate","isRelativeTimeRange","isDurationString","getEncodedValue","input","allowEmptyString","length","str","Array","encodeTimeRangeValue","timeOptionValue","toString","decodeTimeRangeValue","paramString","Date","Number","TimeRangeParam","encode","decode","equals","valueA","valueB","valueOf","timeRangeQueryConfig","start","end","useInitialTimeRange","dashboardDuration","query","updateType","initialTimeRange","pastDuration","startStr","useSetTimeRangeParams","enabledURLParams","setQuery","paramsLoaded","setParamsLoaded","timeRangeState","setTimeRangeState","undefined","setTimeRange","value","timeRange"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/runtime/TimeRangeProvider/query-params.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { useMemo, useCallback, useEffect, useState } from 'react';\nimport { useQueryParams, QueryParamConfig } from 'use-query-params';\nimport { getUnixTime, isDate } from 'date-fns';\nimport {\n TimeRangeValue,\n isRelativeTimeRange,\n isDurationString,\n DurationString,\n AbsoluteTimeRange,\n parseDurationString,\n} from '@perses-dev/core';\nimport { TimeRange } from './TimeRangeProvider';\n\nexport type TimeOptionValue = Date | DurationString | null | undefined;\n\n/* Interprets an encoded string and returns either the string or null/undefined if not available */\nfunction getEncodedValue(\n input: string | Array<string | null> | null | undefined,\n allowEmptyString?: boolean\n): string | null | undefined {\n if (input == null) {\n return input;\n }\n // '' or []\n if (input.length === 0 && (!allowEmptyString || (allowEmptyString && input !== ''))) {\n return null;\n }\n\n const str = input instanceof Array ? input[0] : input;\n if (str == null) {\n return str;\n }\n if (!allowEmptyString && str === '') {\n return null;\n }\n\n return str;\n}\n\n/* Encodes individual TimeRangeValue as a string, depends on whether start is relative or absolute */\nexport function encodeTimeRangeValue(timeOptionValue: TimeOptionValue): string | null | undefined {\n if (!timeOptionValue) {\n return timeOptionValue;\n }\n\n if (typeof timeOptionValue === 'string') {\n if (isDurationString(timeOptionValue)) {\n return timeOptionValue;\n }\n }\n return (getUnixTime(timeOptionValue) * 1000).toString();\n}\n\n/* Converts param input to supported relative or absolute time range format */\nexport function decodeTimeRangeValue(\n input: string | Array<string | null> | null | undefined\n): Date | DurationString | null | undefined {\n const paramString = getEncodedValue(input);\n if (paramString == null) return paramString;\n return isDurationString(paramString) ? paramString : new Date(Number(paramString));\n}\n\n/**\n * Custom TimeRangeValue param type\n * See: https://github.com/pbeshai/use-query-params/tree/master/packages/serialize-query-params#param-types\n */\nexport const TimeRangeParam: QueryParamConfig<TimeOptionValue, TimeOptionValue> = {\n encode: encodeTimeRangeValue,\n decode: decodeTimeRangeValue,\n equals: (valueA: TimeOptionValue, valueB: TimeOptionValue) => {\n if (valueA === valueB) return true;\n if (valueA == null || valueB == null) return valueA === valueB;\n return valueA.valueOf() === valueB.valueOf();\n },\n};\n\nexport const timeRangeQueryConfig = {\n start: TimeRangeParam,\n end: TimeRangeParam,\n};\n\nexport const refreshIntervalQueryConfig = {\n refresh: TimeRangeParam,\n};\n\n/**\n * Gets the initial time range taking into account URL params and dashboard JSON duration\n * Sets start query param if it is empty on page load\n */\nexport function useInitialTimeRange(dashboardDuration: DurationString): TimeRangeValue {\n const [query] = useQueryParams(timeRangeQueryConfig, { updateType: 'replaceIn' });\n const { start, end } = query;\n return useMemo(() => {\n let initialTimeRange: TimeRangeValue = { pastDuration: dashboardDuration };\n if (!start) {\n return initialTimeRange;\n }\n const startStr = start.toString();\n if (isDurationString(startStr)) {\n initialTimeRange = { pastDuration: startStr };\n } else if (isDate(start) && isDate(end)) {\n initialTimeRange = { start: start, end: end } as AbsoluteTimeRange;\n }\n return initialTimeRange;\n }, [start, end, dashboardDuration]);\n}\n\n/**\n * Returns time range getter and setter, set enabledURLParams to false to disable query string serialization\n */\nexport function useSetTimeRangeParams(\n initialTimeRange: TimeRangeValue,\n enabledURLParams = true\n): Pick<TimeRange, 'timeRange' | 'setTimeRange'> {\n const [query, setQuery] = useQueryParams(timeRangeQueryConfig, { updateType: 'replaceIn' });\n\n // determine whether initial param had previously been populated to fix back btn\n const [paramsLoaded, setParamsLoaded] = useState<boolean>(false);\n\n // optional fallback when app does not want query string as source of truth\n // this occurs when enabledURLParams is set to false on TimeRangeProvider\n const [timeRangeState, setTimeRangeState] = useState<TimeRangeValue>(initialTimeRange);\n\n const { start } = query;\n\n useEffect(() => {\n // when dashboard loaded with no params, default to dashboard duration\n if (enabledURLParams && !paramsLoaded && !start) {\n if (isRelativeTimeRange(initialTimeRange)) {\n setQuery({ start: initialTimeRange.pastDuration, end: undefined });\n setParamsLoaded(true);\n }\n }\n }, [initialTimeRange, enabledURLParams, paramsLoaded, start, setQuery]);\n\n const setTimeRange: TimeRange['setTimeRange'] = useCallback(\n (value: TimeRangeValue) => {\n if (isRelativeTimeRange(value)) {\n setQuery({ start: value.pastDuration, end: undefined });\n } else {\n setQuery(value);\n }\n },\n [setQuery]\n );\n\n if (!enabledURLParams) {\n return { timeRange: timeRangeState, setTimeRange: setTimeRangeState };\n }\n return { timeRange: initialTimeRange, setTimeRange: setTimeRange };\n}\n\n/**\n * Gets the initial refresh interval taking into account URL params and dashboard JSON duration\n * Sets refresh query param if it is empty on page load\n */\nexport function useInitialRefreshInterval(dashboardDuration: DurationString): DurationString {\n const [query] = useQueryParams(refreshIntervalQueryConfig, { updateType: 'replaceIn' });\n const { refresh } = query;\n return useMemo(() => {\n let initialTimeRange: DurationString = dashboardDuration;\n if (!refresh) {\n return initialTimeRange;\n }\n const startStr = refresh.toString();\n if (isDurationString(startStr)) {\n initialTimeRange = startStr;\n }\n return initialTimeRange;\n }, [dashboardDuration, refresh]);\n}\n\nfunction getRefreshIntervalInMs(refreshInterval?: DurationString) {\n let refreshIntervalInMs = 0;\n if (refreshInterval) {\n const refreshIntervalDuration = parseDurationString(refreshInterval);\n if (refreshIntervalDuration && refreshIntervalDuration.seconds) {\n refreshIntervalInMs = refreshIntervalDuration?.seconds * 1000;\n }\n }\n return refreshIntervalInMs;\n}\n\n/**\n * Returns refresh interval getter and setter, set enabledURLParams to false to disable query string serialization\n */\nexport function useSetRefreshIntervalParams(\n initialRefreshInterval?: DurationString,\n enabledURLParams = true\n): Pick<TimeRange, 'refreshInterval' | 'setRefreshInterval' | 'refreshIntervalInMs'> {\n const [query, setQuery] = useQueryParams(refreshIntervalQueryConfig, { updateType: 'replaceIn' });\n\n // determine whether initial param had previously been populated to fix back btn\n const [paramsLoaded, setParamsLoaded] = useState<boolean>(false);\n\n // optional fallback when app does not want query string as source of truth\n // this occurs when enabledURLParams is set to false on TimeRangeProvider\n const [refreshIntervalState, setRefreshIntervalState] = useState<DurationString | undefined>(initialRefreshInterval);\n\n const { refresh } = query;\n\n useEffect(() => {\n // when dashboard loaded with no params, default to dashboard duration\n if (enabledURLParams && !paramsLoaded && !refresh) {\n setQuery({ refresh: initialRefreshInterval });\n setParamsLoaded(true);\n }\n }, [initialRefreshInterval, enabledURLParams, paramsLoaded, refresh, setQuery]);\n\n const setRefreshInterval: TimeRange['setRefreshInterval'] = useCallback(\n (refresh: DurationString) => setQuery({ refresh }),\n [setQuery]\n );\n\n if (!enabledURLParams) {\n return {\n refreshInterval: refreshIntervalState,\n setRefreshInterval: setRefreshIntervalState,\n refreshIntervalInMs: getRefreshIntervalInMs(refreshIntervalState),\n };\n }\n return {\n refreshInterval: initialRefreshInterval,\n setRefreshInterval: setRefreshInterval,\n refreshIntervalInMs: getRefreshIntervalInMs(initialRefreshInterval),\n };\n}\n"],"names":["useMemo","useCallback","useEffect","useState","useQueryParams","getUnixTime","isDate","isRelativeTimeRange","isDurationString","parseDurationString","getEncodedValue","input","allowEmptyString","length","str","Array","encodeTimeRangeValue","timeOptionValue","toString","decodeTimeRangeValue","paramString","Date","Number","TimeRangeParam","encode","decode","equals","valueA","valueB","valueOf","timeRangeQueryConfig","start","end","refreshIntervalQueryConfig","refresh","useInitialTimeRange","dashboardDuration","query","updateType","initialTimeRange","pastDuration","startStr","useSetTimeRangeParams","enabledURLParams","setQuery","paramsLoaded","setParamsLoaded","timeRangeState","setTimeRangeState","undefined","setTimeRange","value","timeRange","useInitialRefreshInterval","getRefreshIntervalInMs","refreshInterval","refreshIntervalInMs","refreshIntervalDuration","seconds","useSetRefreshIntervalParams","initialRefreshInterval","refreshIntervalState","setRefreshIntervalState","setRefreshInterval"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { VariableName, VariableValue } from '@perses-dev/core';
3
3
  import { VariableOption } from '../model';
4
- export declare const DEFAULT_ALL_VALUE: "$__all";
5
4
  export declare type VariableState = {
6
5
  value: VariableValue;
7
6
  options?: VariableOption[];
@@ -14,4 +13,5 @@ export declare type TemplateVariableSrv = {
14
13
  };
15
14
  export declare const TemplateVariableContext: import("react").Context<TemplateVariableSrv | undefined>;
16
15
  export declare function useTemplateVariableValues(names?: string[]): VariableStateMap;
16
+ export declare function useReplaceVariablesInString(str: string | undefined): string | undefined;
17
17
  //# sourceMappingURL=template-variables.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-variables.d.ts","sourceRoot":"","sources":["../../src/runtime/template-variables.ts"],"names":[],"mappings":";AAcA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,eAAO,MAAM,iBAAiB,UAAoB,CAAC;AAEnD,oBAAY,aAAa,GAAG;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,oBAAY,gBAAgB,GAAG,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAEnE,oBAAY,mBAAmB,GAAG;IAChC,KAAK,EAAE,gBAAgB,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,0DAA4D,CAAC;AAUjG,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,oBAmBzD"}
1
+ {"version":3,"file":"template-variables.d.ts","sourceRoot":"","sources":["../../src/runtime/template-variables.ts"],"names":[],"mappings":";AAcA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,oBAAY,aAAa,GAAG;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,oBAAY,gBAAgB,GAAG,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAEnE,oBAAY,mBAAmB,GAAG;IAChC,KAAK,EAAE,gBAAgB,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,0DAA4D,CAAC;AAUjG,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,oBAmBzD;AAGD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKvF"}
@@ -11,7 +11,7 @@
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
13
  import { createContext, useContext, useMemo } from 'react';
14
- export const DEFAULT_ALL_VALUE = '$__all';
14
+ import { parseTemplateVariables, replaceTemplateVariables } from '../utils';
15
15
  export const TemplateVariableContext = createContext(undefined);
16
16
  function useTemplateVariableContext() {
17
17
  const ctx = useContext(TemplateVariableContext);
@@ -40,5 +40,12 @@ export function useTemplateVariableValues(names) {
40
40
  }
41
41
  return values;
42
42
  }
43
+ // Convenience hook for replacing template variables in a string
44
+ export function useReplaceVariablesInString(str) {
45
+ const variablesInString = str ? parseTemplateVariables(str) : [];
46
+ const variableValues = useTemplateVariableValues(variablesInString);
47
+ if (!str) return undefined;
48
+ return replaceTemplateVariables(str, variableValues);
49
+ }
43
50
 
44
51
  //# sourceMappingURL=template-variables.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/template-variables.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createContext, useContext, useMemo } from 'react';\nimport { VariableName, VariableValue } from '@perses-dev/core';\nimport { VariableOption } from '../model';\n\nexport const DEFAULT_ALL_VALUE = '$__all' as const;\n\nexport type VariableState = {\n value: VariableValue;\n options?: VariableOption[];\n loading: boolean;\n error?: Error;\n};\n\nexport type VariableStateMap = Record<VariableName, VariableState>;\n\nexport type TemplateVariableSrv = {\n state: VariableStateMap;\n};\n\nexport const TemplateVariableContext = createContext<TemplateVariableSrv | undefined>(undefined);\n\nfunction useTemplateVariableContext() {\n const ctx = useContext(TemplateVariableContext);\n if (ctx === undefined) {\n throw new Error('No TemplateVariableContext found. Did you forget a Provider?');\n }\n return ctx;\n}\n\nexport function useTemplateVariableValues(names?: string[]) {\n const { state } = useTemplateVariableContext();\n\n const values = useMemo(() => {\n const values: VariableStateMap = {};\n names?.forEach((name) => {\n const s = state[name];\n if (s) {\n values[name] = s;\n }\n });\n return values;\n }, [state, names]);\n\n if (names === undefined) {\n return state;\n }\n\n return values;\n}\n"],"names":["createContext","useContext","useMemo","DEFAULT_ALL_VALUE","TemplateVariableContext","undefined","useTemplateVariableContext","ctx","Error","useTemplateVariableValues","names","state","values","forEach","name","s"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAQ,OAAO,CAAC;AAI3D,OAAO,MAAMC,iBAAiB,GAAG,QAAQ,AAAS,CAAC;AAenD,OAAO,MAAMC,uBAAuB,GAAGJ,aAAa,CAAkCK,SAAS,CAAC,CAAC;AAEjG,SAASC,0BAA0B,GAAG;IACpC,MAAMC,GAAG,GAAGN,UAAU,CAACG,uBAAuB,CAAC,AAAC;IAChD,IAAIG,GAAG,KAAKF,SAAS,EAAE;QACrB,MAAM,IAAIG,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,OAAOD,GAAG,CAAC;AACb,CAAC;AAED,OAAO,SAASE,yBAAyB,CAACC,KAAgB,EAAE;IAC1D,MAAM,EAAEC,KAAK,CAAA,EAAE,GAAGL,0BAA0B,EAAE,AAAC;IAE/C,MAAMM,MAAM,GAAGV,OAAO,CAAC,IAAM;QAC3B,MAAMU,MAAM,GAAqB,EAAE,AAAC;QACpCF,KAAK,aAALA,KAAK,WAAS,GAAdA,KAAAA,CAAc,GAAdA,KAAK,CAAEG,OAAO,CAAC,CAACC,IAAI,GAAK;YACvB,MAAMC,CAAC,GAAGJ,KAAK,CAACG,IAAI,CAAC,AAAC;YACtB,IAAIC,CAAC,EAAE;gBACLH,MAAM,CAACE,IAAI,CAAC,GAAGC,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAOH,MAAM,CAAC;IAChB,CAAC,EAAE;QAACD,KAAK;QAAED,KAAK;KAAC,CAAC,AAAC;IAEnB,IAAIA,KAAK,KAAKL,SAAS,EAAE;QACvB,OAAOM,KAAK,CAAC;IACf,CAAC;IAED,OAAOC,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"sources":["../../src/runtime/template-variables.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createContext, useContext, useMemo } from 'react';\nimport { VariableName, VariableValue } from '@perses-dev/core';\nimport { VariableOption } from '../model';\nimport { parseTemplateVariables, replaceTemplateVariables } from '../utils';\n\nexport type VariableState = {\n value: VariableValue;\n options?: VariableOption[];\n loading: boolean;\n error?: Error;\n};\n\nexport type VariableStateMap = Record<VariableName, VariableState>;\n\nexport type TemplateVariableSrv = {\n state: VariableStateMap;\n};\n\nexport const TemplateVariableContext = createContext<TemplateVariableSrv | undefined>(undefined);\n\nfunction useTemplateVariableContext() {\n const ctx = useContext(TemplateVariableContext);\n if (ctx === undefined) {\n throw new Error('No TemplateVariableContext found. Did you forget a Provider?');\n }\n return ctx;\n}\n\nexport function useTemplateVariableValues(names?: string[]) {\n const { state } = useTemplateVariableContext();\n\n const values = useMemo(() => {\n const values: VariableStateMap = {};\n names?.forEach((name) => {\n const s = state[name];\n if (s) {\n values[name] = s;\n }\n });\n return values;\n }, [state, names]);\n\n if (names === undefined) {\n return state;\n }\n\n return values;\n}\n\n// Convenience hook for replacing template variables in a string\nexport function useReplaceVariablesInString(str: string | undefined): string | undefined {\n const variablesInString = str ? parseTemplateVariables(str) : [];\n const variableValues = useTemplateVariableValues(variablesInString);\n if (!str) return undefined;\n return replaceTemplateVariables(str, variableValues);\n}\n"],"names":["createContext","useContext","useMemo","parseTemplateVariables","replaceTemplateVariables","TemplateVariableContext","undefined","useTemplateVariableContext","ctx","Error","useTemplateVariableValues","names","state","values","forEach","name","s","useReplaceVariablesInString","str","variablesInString","variableValues"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAQ,OAAO,CAAC;AAG3D,SAASC,sBAAsB,EAAEC,wBAAwB,QAAQ,UAAU,CAAC;AAe5E,OAAO,MAAMC,uBAAuB,GAAGL,aAAa,CAAkCM,SAAS,CAAC,CAAC;AAEjG,SAASC,0BAA0B,GAAG;IACpC,MAAMC,GAAG,GAAGP,UAAU,CAACI,uBAAuB,CAAC,AAAC;IAChD,IAAIG,GAAG,KAAKF,SAAS,EAAE;QACrB,MAAM,IAAIG,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,OAAOD,GAAG,CAAC;AACb,CAAC;AAED,OAAO,SAASE,yBAAyB,CAACC,KAAgB,EAAE;IAC1D,MAAM,EAAEC,KAAK,CAAA,EAAE,GAAGL,0BAA0B,EAAE,AAAC;IAE/C,MAAMM,MAAM,GAAGX,OAAO,CAAC,IAAM;QAC3B,MAAMW,MAAM,GAAqB,EAAE,AAAC;QACpCF,KAAK,aAALA,KAAK,WAAS,GAAdA,KAAAA,CAAc,GAAdA,KAAK,CAAEG,OAAO,CAAC,CAACC,IAAI,GAAK;YACvB,MAAMC,CAAC,GAAGJ,KAAK,CAACG,IAAI,CAAC,AAAC;YACtB,IAAIC,CAAC,EAAE;gBACLH,MAAM,CAACE,IAAI,CAAC,GAAGC,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAOH,MAAM,CAAC;IAChB,CAAC,EAAE;QAACD,KAAK;QAAED,KAAK;KAAC,CAAC,AAAC;IAEnB,IAAIA,KAAK,KAAKL,SAAS,EAAE;QACvB,OAAOM,KAAK,CAAC;IACf,CAAC;IAED,OAAOC,MAAM,CAAC;AAChB,CAAC;AAED,gEAAgE;AAChE,OAAO,SAASI,2BAA2B,CAACC,GAAuB,EAAsB;IACvF,MAAMC,iBAAiB,GAAGD,GAAG,GAAGf,sBAAsB,CAACe,GAAG,CAAC,GAAG,EAAE,AAAC;IACjE,MAAME,cAAc,GAAGV,yBAAyB,CAACS,iBAAiB,CAAC,AAAC;IACpE,IAAI,CAACD,GAAG,EAAE,OAAOZ,SAAS,CAAC;IAC3B,OAAOF,wBAAwB,CAACc,GAAG,EAAEE,cAAc,CAAC,CAAC;AACvD,CAAC"}
@@ -12,7 +12,7 @@ export declare const useTimeSeriesQuery: (definition: TimeSeriesQueryDefinition,
12
12
  /**
13
13
  * Runs multiple time series queries using plugins and returns the results.
14
14
  */
15
- export declare function useTimeSeriesQueries(definitions: TimeSeriesQueryDefinition[], options?: UseTimeSeriesQueryOptions): import("@tanstack/react-query").UseQueryResult<TimeSeriesData, unknown>[];
15
+ export declare function useTimeSeriesQueries(definitions: TimeSeriesQueryDefinition[], options?: UseTimeSeriesQueryOptions): import("@tanstack/react-query").UseQueryResult<unknown, unknown>[];
16
16
  /**
17
17
  * Get active time series queries for query results summary
18
18
  */
@@ -1 +1 @@
1
- {"version":3,"file":"time-series-queries.d.ts","sourceRoot":"","sources":["../../src/runtime/time-series-queries.ts"],"names":[],"mappings":"AAaA,OAAO,EAA+C,UAAU,EAAY,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EAAE,yBAAyB,EAAe,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAiD,MAAM,UAAU,CAAC;AAM9F,MAAM,WAAW,yBAAyB;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAmDvD;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAAgB,yBAAyB,YAAY,yBAAyB,4EAkB5G,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,yBAAyB,EAAE,EAAE,OAAO,CAAC,EAAE,yBAAyB,6EA0BjH;AAkBD;;GAEG;AACH,wBAAgB,0BAA0B,0BAIzC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,UAAU,yBAW3D"}
1
+ {"version":3,"file":"time-series-queries.d.ts","sourceRoot":"","sources":["../../src/runtime/time-series-queries.ts"],"names":[],"mappings":"AAaA,OAAO,EAKL,UAAU,EAGX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAe,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAiD,MAAM,UAAU,CAAC;AAM9F,MAAM,WAAW,yBAAyB;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AAmDvD;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAAgB,yBAAyB,YAAY,yBAAyB,4EAmB5G,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,yBAAyB,EAAE,EAAE,OAAO,CAAC,EAAE,yBAAyB,sEA2BjH;AAmBD;;GAEG;AACH,wBAAgB,0BAA0B,0BAIzC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,UAAU,yBAW3D"}
@@ -69,6 +69,7 @@ function getQueryOptions({ plugin , definition , context }) {
69
69
  return useQuery({
70
70
  enabled: queryEnabled,
71
71
  queryKey: queryKey,
72
+ refetchInterval: context.refreshIntervalInMs > 0 ? context.refreshIntervalInMs : false,
72
73
  queryFn: ()=>{
73
74
  // The 'enabled' option should prevent this from happening, but make TypeScript happy by checking
74
75
  if (plugin === undefined) {
@@ -103,6 +104,7 @@ function getQueryOptions({ plugin , definition , context }) {
103
104
  return {
104
105
  enabled: queryEnabled,
105
106
  queryKey: queryKey,
107
+ refetchInterval: context.refreshIntervalInMs > 0 ? context.refreshIntervalInMs : false,
106
108
  queryFn: async ()=>{
107
109
  // Keep options out of query key so we don't re-run queries because suggested step changes
108
110
  const ctx = {
@@ -120,14 +122,15 @@ function getQueryOptions({ plugin , definition , context }) {
120
122
  /**
121
123
  * Build the time series query context object from data available at runtime
122
124
  */ function useTimeSeriesQueryContext() {
123
- const { absoluteTimeRange , refreshKey } = useTimeRange();
125
+ const { absoluteTimeRange , refreshKey , refreshIntervalInMs } = useTimeRange();
124
126
  const variableState = useTemplateVariableValues();
125
127
  const datasourceStore = useDatasourceStore();
126
128
  return {
127
129
  timeRange: absoluteTimeRange,
128
130
  variableState,
129
131
  datasourceStore,
130
- refreshKey
132
+ refreshKey,
133
+ refreshIntervalInMs: refreshIntervalInMs
131
134
  };
132
135
  }
133
136
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/time-series-queries.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { useQuery, useQueries, useQueryClient, Query, QueryCache, QueryKey } from '@tanstack/react-query';\nimport { TimeSeriesQueryDefinition, UnknownSpec, TimeSeriesData } from '@perses-dev/core';\nimport { TimeSeriesDataQuery, TimeSeriesQueryContext, TimeSeriesQueryPlugin } from '../model';\nimport { VariableStateMap, useTemplateVariableValues } from './template-variables';\nimport { useTimeRange } from './TimeRangeProvider';\nimport { useDatasourceStore } from './datasources';\nimport { usePlugin, usePluginRegistry, usePlugins } from './plugin-registry';\n\nexport interface UseTimeSeriesQueryOptions {\n suggestedStepMs?: number;\n}\n\nexport const TIME_SERIES_QUERY_KEY = 'TimeSeriesQuery';\n\n/**\n * Returns a serialized string of the current state of variable values.\n */\nfunction getVariableValuesKey(v: VariableStateMap) {\n return Object.values(v)\n .map((v) => JSON.stringify(v.value))\n .join(',');\n}\n\nfunction filterVariableStateMap(v: VariableStateMap, names?: string[]) {\n if (!names) {\n return v;\n }\n return Object.fromEntries(Object.entries(v).filter(([name]) => names.includes(name)));\n}\n\nfunction getQueryOptions({\n plugin,\n definition,\n context,\n}: {\n plugin?: TimeSeriesQueryPlugin;\n definition: TimeSeriesQueryDefinition;\n context: TimeSeriesQueryContext;\n}) {\n const { timeRange, datasourceStore, suggestedStepMs, variableState, refreshKey } = context;\n\n const dependencies = plugin?.dependsOn ? plugin.dependsOn(definition.spec.plugin.spec, context) : {};\n const variableDependencies = dependencies?.variables;\n\n // Determine queryKey\n const filteredVariabledState = filterVariableStateMap(variableState, variableDependencies);\n const variablesValueKey = getVariableValuesKey(filteredVariabledState);\n const queryKey = [definition, timeRange, datasourceStore, suggestedStepMs, variablesValueKey, refreshKey] as const;\n\n // Determine queryEnabled\n let waitToLoad = false;\n if (variableDependencies) {\n waitToLoad = variableDependencies.some((v) => variableState[v]?.loading);\n }\n\n const queryEnabled = plugin !== undefined && !waitToLoad;\n\n return {\n queryKey,\n queryEnabled,\n };\n}\n\n/**\n * Runs a time series query using a plugin and returns the results.\n */\nexport const useTimeSeriesQuery = (definition: TimeSeriesQueryDefinition, options?: UseTimeSeriesQueryOptions) => {\n const { data: plugin } = usePlugin(TIME_SERIES_QUERY_KEY, definition.spec.plugin.kind);\n const context = useTimeSeriesQueryContext();\n\n const { queryEnabled, queryKey } = getQueryOptions({ plugin, definition, context });\n return useQuery({\n enabled: queryEnabled,\n queryKey: queryKey,\n queryFn: () => {\n // The 'enabled' option should prevent this from happening, but make TypeScript happy by checking\n if (plugin === undefined) {\n throw new Error('Expected plugin to be loaded');\n }\n // Keep options out of query key so we don't re-run queries because suggested step changes\n const ctx: TimeSeriesQueryContext = { ...context, suggestedStepMs: options?.suggestedStepMs };\n return plugin.getTimeSeriesData(definition.spec.plugin.spec, ctx);\n },\n });\n};\n\n/**\n * Runs multiple time series queries using plugins and returns the results.\n */\nexport function useTimeSeriesQueries(definitions: TimeSeriesQueryDefinition[], options?: UseTimeSeriesQueryOptions) {\n const { getPlugin } = usePluginRegistry();\n const context = useTimeSeriesQueryContext();\n\n const pluginLoaderResponse = usePlugins(\n TIME_SERIES_QUERY_KEY,\n definitions.map((d) => ({ kind: d.spec.plugin.kind }))\n );\n\n return useQueries({\n queries: definitions.map((definition, idx) => {\n const plugin = pluginLoaderResponse[idx]?.data;\n const { queryEnabled, queryKey } = getQueryOptions({ plugin, definition, context });\n return {\n enabled: queryEnabled,\n queryKey: queryKey,\n queryFn: async () => {\n // Keep options out of query key so we don't re-run queries because suggested step changes\n const ctx: TimeSeriesQueryContext = { ...context, suggestedStepMs: options?.suggestedStepMs };\n const plugin = await getPlugin(TIME_SERIES_QUERY_KEY, definition.spec.plugin.kind);\n const data = await plugin.getTimeSeriesData(definition.spec.plugin.spec, ctx);\n return data;\n },\n };\n }),\n });\n}\n\n/**\n * Build the time series query context object from data available at runtime\n */\nfunction useTimeSeriesQueryContext(): TimeSeriesQueryContext {\n const { absoluteTimeRange, refreshKey } = useTimeRange();\n const variableState = useTemplateVariableValues();\n const datasourceStore = useDatasourceStore();\n\n return {\n timeRange: absoluteTimeRange,\n variableState,\n datasourceStore,\n refreshKey,\n };\n}\n\n/**\n * Get active time series queries for query results summary\n */\nexport function useActiveTimeSeriesQueries() {\n const queryClient = useQueryClient();\n const queryCache = queryClient.getQueryCache();\n return getActiveTimeSeriesQueries(queryCache);\n}\n\n/**\n * Filter all cached queries down to only active time series queries\n */\nexport function getActiveTimeSeriesQueries(cache: QueryCache) {\n const queries: TimeSeriesDataQuery[] = [];\n\n for (const query of cache.findAll({ type: 'active' })) {\n const firstPart = query.queryKey?.[0] as UnknownSpec;\n if (firstPart?.kind && (firstPart.kind as string).startsWith(TIME_SERIES_QUERY_KEY)) {\n queries.push(query as Query<TimeSeriesData, unknown, TimeSeriesData, QueryKey>);\n }\n }\n\n return queries;\n}\n"],"names":["useQuery","useQueries","useQueryClient","useTemplateVariableValues","useTimeRange","useDatasourceStore","usePlugin","usePluginRegistry","usePlugins","TIME_SERIES_QUERY_KEY","getVariableValuesKey","v","Object","values","map","JSON","stringify","value","join","filterVariableStateMap","names","fromEntries","entries","filter","name","includes","getQueryOptions","plugin","definition","context","timeRange","datasourceStore","suggestedStepMs","variableState","refreshKey","dependencies","dependsOn","spec","variableDependencies","variables","filteredVariabledState","variablesValueKey","queryKey","waitToLoad","some","loading","queryEnabled","undefined","useTimeSeriesQuery","options","data","kind","useTimeSeriesQueryContext","enabled","queryFn","Error","ctx","getTimeSeriesData","useTimeSeriesQueries","definitions","getPlugin","pluginLoaderResponse","d","queries","idx","absoluteTimeRange","useActiveTimeSeriesQueries","queryClient","queryCache","getQueryCache","getActiveTimeSeriesQueries","cache","query","findAll","type","firstPart","startsWith","push"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/runtime/time-series-queries.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {\n useQuery,\n useQueries,\n useQueryClient,\n Query,\n QueryCache,\n QueryKey,\n QueryObserverOptions,\n} from '@tanstack/react-query';\nimport { TimeSeriesQueryDefinition, UnknownSpec, TimeSeriesData } from '@perses-dev/core';\nimport { TimeSeriesDataQuery, TimeSeriesQueryContext, TimeSeriesQueryPlugin } from '../model';\nimport { VariableStateMap, useTemplateVariableValues } from './template-variables';\nimport { useTimeRange } from './TimeRangeProvider';\nimport { useDatasourceStore } from './datasources';\nimport { usePlugin, usePluginRegistry, usePlugins } from './plugin-registry';\n\nexport interface UseTimeSeriesQueryOptions {\n suggestedStepMs?: number;\n}\n\nexport const TIME_SERIES_QUERY_KEY = 'TimeSeriesQuery';\n\n/**\n * Returns a serialized string of the current state of variable values.\n */\nfunction getVariableValuesKey(v: VariableStateMap) {\n return Object.values(v)\n .map((v) => JSON.stringify(v.value))\n .join(',');\n}\n\nfunction filterVariableStateMap(v: VariableStateMap, names?: string[]) {\n if (!names) {\n return v;\n }\n return Object.fromEntries(Object.entries(v).filter(([name]) => names.includes(name)));\n}\n\nfunction getQueryOptions({\n plugin,\n definition,\n context,\n}: {\n plugin?: TimeSeriesQueryPlugin;\n definition: TimeSeriesQueryDefinition;\n context: TimeSeriesQueryContext;\n}) {\n const { timeRange, datasourceStore, suggestedStepMs, variableState, refreshKey } = context;\n\n const dependencies = plugin?.dependsOn ? plugin.dependsOn(definition.spec.plugin.spec, context) : {};\n const variableDependencies = dependencies?.variables;\n\n // Determine queryKey\n const filteredVariabledState = filterVariableStateMap(variableState, variableDependencies);\n const variablesValueKey = getVariableValuesKey(filteredVariabledState);\n const queryKey = [definition, timeRange, datasourceStore, suggestedStepMs, variablesValueKey, refreshKey] as const;\n\n // Determine queryEnabled\n let waitToLoad = false;\n if (variableDependencies) {\n waitToLoad = variableDependencies.some((v) => variableState[v]?.loading);\n }\n\n const queryEnabled = plugin !== undefined && !waitToLoad;\n\n return {\n queryKey,\n queryEnabled,\n };\n}\n\n/**\n * Runs a time series query using a plugin and returns the results.\n */\nexport const useTimeSeriesQuery = (definition: TimeSeriesQueryDefinition, options?: UseTimeSeriesQueryOptions) => {\n const { data: plugin } = usePlugin(TIME_SERIES_QUERY_KEY, definition.spec.plugin.kind);\n const context = useTimeSeriesQueryContext();\n\n const { queryEnabled, queryKey } = getQueryOptions({ plugin, definition, context });\n return useQuery({\n enabled: queryEnabled,\n queryKey: queryKey,\n refetchInterval: context.refreshIntervalInMs > 0 ? context.refreshIntervalInMs : false,\n queryFn: () => {\n // The 'enabled' option should prevent this from happening, but make TypeScript happy by checking\n if (plugin === undefined) {\n throw new Error('Expected plugin to be loaded');\n }\n // Keep options out of query key so we don't re-run queries because suggested step changes\n const ctx: TimeSeriesQueryContext = { ...context, suggestedStepMs: options?.suggestedStepMs };\n return plugin.getTimeSeriesData(definition.spec.plugin.spec, ctx);\n },\n });\n};\n\n/**\n * Runs multiple time series queries using plugins and returns the results.\n */\nexport function useTimeSeriesQueries(definitions: TimeSeriesQueryDefinition[], options?: UseTimeSeriesQueryOptions) {\n const { getPlugin } = usePluginRegistry();\n const context = useTimeSeriesQueryContext();\n\n const pluginLoaderResponse = usePlugins(\n TIME_SERIES_QUERY_KEY,\n definitions.map((d) => ({ kind: d.spec.plugin.kind }))\n );\n\n return useQueries({\n queries: definitions.map<QueryObserverOptions>((definition, idx) => {\n const plugin = pluginLoaderResponse[idx]?.data;\n const { queryEnabled, queryKey } = getQueryOptions({ plugin, definition, context });\n return {\n enabled: queryEnabled,\n queryKey: queryKey,\n refetchInterval: context.refreshIntervalInMs > 0 ? context.refreshIntervalInMs : false,\n queryFn: async () => {\n // Keep options out of query key so we don't re-run queries because suggested step changes\n const ctx: TimeSeriesQueryContext = { ...context, suggestedStepMs: options?.suggestedStepMs };\n const plugin = await getPlugin(TIME_SERIES_QUERY_KEY, definition.spec.plugin.kind);\n const data = await plugin.getTimeSeriesData(definition.spec.plugin.spec, ctx);\n return data;\n },\n };\n }),\n });\n}\n\n/**\n * Build the time series query context object from data available at runtime\n */\nfunction useTimeSeriesQueryContext(): TimeSeriesQueryContext {\n const { absoluteTimeRange, refreshKey, refreshIntervalInMs } = useTimeRange();\n const variableState = useTemplateVariableValues();\n const datasourceStore = useDatasourceStore();\n\n return {\n timeRange: absoluteTimeRange,\n variableState,\n datasourceStore,\n refreshKey,\n refreshIntervalInMs: refreshIntervalInMs,\n };\n}\n\n/**\n * Get active time series queries for query results summary\n */\nexport function useActiveTimeSeriesQueries() {\n const queryClient = useQueryClient();\n const queryCache = queryClient.getQueryCache();\n return getActiveTimeSeriesQueries(queryCache);\n}\n\n/**\n * Filter all cached queries down to only active time series queries\n */\nexport function getActiveTimeSeriesQueries(cache: QueryCache) {\n const queries: TimeSeriesDataQuery[] = [];\n\n for (const query of cache.findAll({ type: 'active' })) {\n const firstPart = query.queryKey?.[0] as UnknownSpec;\n if (firstPart?.kind && (firstPart.kind as string).startsWith(TIME_SERIES_QUERY_KEY)) {\n queries.push(query as Query<TimeSeriesData, unknown, TimeSeriesData, QueryKey>);\n }\n }\n\n return queries;\n}\n"],"names":["useQuery","useQueries","useQueryClient","useTemplateVariableValues","useTimeRange","useDatasourceStore","usePlugin","usePluginRegistry","usePlugins","TIME_SERIES_QUERY_KEY","getVariableValuesKey","v","Object","values","map","JSON","stringify","value","join","filterVariableStateMap","names","fromEntries","entries","filter","name","includes","getQueryOptions","plugin","definition","context","timeRange","datasourceStore","suggestedStepMs","variableState","refreshKey","dependencies","dependsOn","spec","variableDependencies","variables","filteredVariabledState","variablesValueKey","queryKey","waitToLoad","some","loading","queryEnabled","undefined","useTimeSeriesQuery","options","data","kind","useTimeSeriesQueryContext","enabled","refetchInterval","refreshIntervalInMs","queryFn","Error","ctx","getTimeSeriesData","useTimeSeriesQueries","definitions","getPlugin","pluginLoaderResponse","d","queries","idx","absoluteTimeRange","useActiveTimeSeriesQueries","queryClient","queryCache","getQueryCache","getActiveTimeSeriesQueries","cache","query","findAll","type","firstPart","startsWith","push"],"mappings":"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"}
@@ -21,6 +21,7 @@ export const WithTimeRange = (Story, context)=>{
21
21
  const parameter = isWithTimeRangeParameter(initParameter) ? initParameter : undefined;
22
22
  const props = parameter === null || parameter === void 0 ? void 0 : parameter.props;
23
23
  return /*#__PURE__*/ _jsx(TimeRangeProvider, {
24
+ initialRefreshInterval: "0s",
24
25
  initialTimeRange: {
25
26
  pastDuration: '1h'
26
27
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/stories/shared-utils/decorators/WithTimeRange.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { StoryFn, StoryContext } from '@storybook/react';\nimport { TimeRangeProvider, TimeRangeProviderProps } from '@perses-dev/plugin-system';\n\ndeclare module '@storybook/react' {\n interface Parameters {\n withTimeRange?: WithTimeRangeParameter;\n }\n}\n\nexport type WithTimeRangeParameter = {\n props: Partial<TimeRangeProviderProps>;\n};\n\n// Type guard because storybook types parameters as `any`\nfunction isWithTimeRangeParameter(parameter: unknown | WithTimeRangeParameter): parameter is WithTimeRangeParameter {\n return !!parameter && typeof parameter === 'object' && 'props' in parameter;\n}\n\nexport const WithTimeRange = (Story: StoryFn, context: StoryContext<unknown>) => {\n const initParameter = context.parameters.withTimeRange;\n const parameter = isWithTimeRangeParameter(initParameter) ? initParameter : undefined;\n const props = parameter?.props;\n\n return (\n <TimeRangeProvider initialTimeRange={{ pastDuration: '1h' }} {...props}>\n <Story />\n </TimeRangeProvider>\n );\n};\n"],"names":["TimeRangeProvider","isWithTimeRangeParameter","parameter","WithTimeRange","Story","context","initParameter","parameters","withTimeRange","undefined","props","initialTimeRange","pastDuration"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC;AACA,SAASA,iBAAiB,QAAgC,2BAA2B,CAAC;AAYtF,yDAAyD;AACzD,SAASC,wBAAwB,CAACC,SAA2C,EAAuC;IAClH,OAAO,CAAC,CAACA,SAAS,IAAI,OAAOA,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAIA,SAAS,CAAC;AAC9E,CAAC;AAED,OAAO,MAAMC,aAAa,GAAG,CAACC,KAAc,EAAEC,OAA8B,GAAK;IAC/E,MAAMC,aAAa,GAAGD,OAAO,CAACE,UAAU,CAACC,aAAa,AAAC;IACvD,MAAMN,SAAS,GAAGD,wBAAwB,CAACK,aAAa,CAAC,GAAGA,aAAa,GAAGG,SAAS,AAAC;IACtF,MAAMC,KAAK,GAAGR,SAAS,aAATA,SAAS,WAAO,GAAhBA,KAAAA,CAAgB,GAAhBA,SAAS,CAAEQ,KAAK,AAAC;IAE/B,qBACE,KAACV,iBAAiB;QAACW,gBAAgB,EAAE;YAAEC,YAAY,EAAE,IAAI;SAAE;QAAG,GAAGF,KAAK;kBACpE,cAAA,KAACN,KAAK,KAAG;MACS,CACpB;AACJ,CAAC,CAAC"}
1
+ {"version":3,"sources":["../../../../src/stories/shared-utils/decorators/WithTimeRange.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { StoryFn, StoryContext } from '@storybook/react';\nimport { TimeRangeProvider, TimeRangeProviderProps } from '@perses-dev/plugin-system';\n\ndeclare module '@storybook/react' {\n interface Parameters {\n withTimeRange?: WithTimeRangeParameter;\n }\n}\n\nexport type WithTimeRangeParameter = {\n props: Partial<TimeRangeProviderProps>;\n};\n\n// Type guard because storybook types parameters as `any`\nfunction isWithTimeRangeParameter(parameter: unknown | WithTimeRangeParameter): parameter is WithTimeRangeParameter {\n return !!parameter && typeof parameter === 'object' && 'props' in parameter;\n}\n\nexport const WithTimeRange = (Story: StoryFn, context: StoryContext<unknown>) => {\n const initParameter = context.parameters.withTimeRange;\n const parameter = isWithTimeRangeParameter(initParameter) ? initParameter : undefined;\n const props = parameter?.props;\n\n return (\n <TimeRangeProvider initialRefreshInterval=\"0s\" initialTimeRange={{ pastDuration: '1h' }} {...props}>\n <Story />\n </TimeRangeProvider>\n );\n};\n"],"names":["TimeRangeProvider","isWithTimeRangeParameter","parameter","WithTimeRange","Story","context","initParameter","parameters","withTimeRange","undefined","props","initialRefreshInterval","initialTimeRange","pastDuration"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC;AACA,SAASA,iBAAiB,QAAgC,2BAA2B,CAAC;AAYtF,yDAAyD;AACzD,SAASC,wBAAwB,CAACC,SAA2C,EAAuC;IAClH,OAAO,CAAC,CAACA,SAAS,IAAI,OAAOA,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAIA,SAAS,CAAC;AAC9E,CAAC;AAED,OAAO,MAAMC,aAAa,GAAG,CAACC,KAAc,EAAEC,OAA8B,GAAK;IAC/E,MAAMC,aAAa,GAAGD,OAAO,CAACE,UAAU,CAACC,aAAa,AAAC;IACvD,MAAMN,SAAS,GAAGD,wBAAwB,CAACK,aAAa,CAAC,GAAGA,aAAa,GAAGG,SAAS,AAAC;IACtF,MAAMC,KAAK,GAAGR,SAAS,aAATA,SAAS,WAAO,GAAhBA,KAAAA,CAAgB,GAAhBA,SAAS,CAAEQ,KAAK,AAAC;IAE/B,qBACE,KAACV,iBAAiB;QAACW,sBAAsB,EAAC,IAAI;QAACC,gBAAgB,EAAE;YAAEC,YAAY,EAAE,IAAI;SAAE;QAAG,GAAGH,KAAK;kBAChG,cAAA,KAACN,KAAK,KAAG;MACS,CACpB;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './variables';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAaA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ // Copyright 2023 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ export * from './variables';
14
+
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './variables';\n"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { VariableValue } from '@perses-dev/core';
2
+ import { VariableStateMap } from '@perses-dev/plugin-system';
3
+ export declare function replaceTemplateVariables(text: string, variableState: VariableStateMap): string;
4
+ export declare function replaceTemplateVariable(text: string, varName: string, templateVariableValue: VariableValue): string;
5
+ /**
6
+ * Returns a list of template variables
7
+ */
8
+ export declare const parseTemplateVariables: (text: string) => string[];
9
+ //# sourceMappingURL=variables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../src/utils/variables.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,GAAG,MAAM,CAW9F;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,aAAa,UAW1G;AAUD;;GAEG;AACH,eAAO,MAAM,sBAAsB,SAAU,MAAM,aAYlD,CAAC"}
@@ -0,0 +1,57 @@
1
+ // Copyright 2023 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ export function replaceTemplateVariables(text, variableState) {
14
+ const variables = parseTemplateVariables(text);
15
+ let finalText = text;
16
+ variables.forEach((v)=>{
17
+ const variable = variableState[v];
18
+ if (variable && (variable === null || variable === void 0 ? void 0 : variable.value)) {
19
+ finalText = replaceTemplateVariable(finalText, v, variable === null || variable === void 0 ? void 0 : variable.value);
20
+ }
21
+ });
22
+ return finalText;
23
+ }
24
+ export function replaceTemplateVariable(text, varName, templateVariableValue) {
25
+ const variableTemplate = '$' + varName;
26
+ let replaceString = '';
27
+ if (Array.isArray(templateVariableValue)) {
28
+ replaceString = `(${templateVariableValue.join('|')})`; // regex style
29
+ }
30
+ if (typeof templateVariableValue === 'string') {
31
+ replaceString = templateVariableValue;
32
+ }
33
+ return text.replaceAll(variableTemplate, replaceString);
34
+ }
35
+ // This regular expression is designed to identify variable references in a template string.
36
+ // It supports two formats for referencing variables:
37
+ // 1. $variableName - This is a simpler format, and the regular expression captures the variable name (\w+ matches one or more word characters).
38
+ // 2. [COMING SOON] ${variableName:value} - This is a more complex format that allows specifying a format function as well.
39
+ // TODO: Fix this lint error
40
+ // eslint-disable-next-line no-useless-escape
41
+ const TEMPLATE_VARIABLE_REGEX = /\$(\w+)|\${(\w+)(?:\.([^:^\}]+))?(?::([^\}]+))?}/gm;
42
+ /**
43
+ * Returns a list of template variables
44
+ */ export const parseTemplateVariables = (text)=>{
45
+ const regex = TEMPLATE_VARIABLE_REGEX;
46
+ const matches = new Set();
47
+ let match;
48
+ while((match = regex.exec(text)) !== null){
49
+ if (match && match.length > 1 && match[1]) {
50
+ matches.add(match[1]);
51
+ }
52
+ }
53
+ // return unique matches
54
+ return Array.from(matches.values());
55
+ };
56
+
57
+ //# sourceMappingURL=variables.js.map