@grafana/scenes 0.0.1

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 (102) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +26 -0
  3. package/dist/esm/components/NestedScene.js +119 -0
  4. package/dist/esm/components/NestedScene.js.map +1 -0
  5. package/dist/esm/components/Scene.js +39 -0
  6. package/dist/esm/components/Scene.js.map +1 -0
  7. package/dist/esm/components/SceneCanvasText.js +41 -0
  8. package/dist/esm/components/SceneCanvasText.js.map +1 -0
  9. package/dist/esm/components/SceneDragHandle.js +18 -0
  10. package/dist/esm/components/SceneDragHandle.js.map +1 -0
  11. package/dist/esm/components/ScenePanelRepeater.js +66 -0
  12. package/dist/esm/components/ScenePanelRepeater.js.map +1 -0
  13. package/dist/esm/components/SceneSubMenu.js +18 -0
  14. package/dist/esm/components/SceneSubMenu.js.map +1 -0
  15. package/dist/esm/components/SceneTimePicker.js +40 -0
  16. package/dist/esm/components/SceneTimePicker.js.map +1 -0
  17. package/dist/esm/components/SceneToolbarButton.js +28 -0
  18. package/dist/esm/components/SceneToolbarButton.js.map +1 -0
  19. package/dist/esm/components/VizPanel/VizPanel.js +105 -0
  20. package/dist/esm/components/VizPanel/VizPanel.js.map +1 -0
  21. package/dist/esm/components/VizPanel/VizPanelRenderer.js +76 -0
  22. package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -0
  23. package/dist/esm/components/layout/SceneFlexLayout.js +88 -0
  24. package/dist/esm/components/layout/SceneFlexLayout.js.map +1 -0
  25. package/dist/esm/components/layout/SceneGridLayout.js +288 -0
  26. package/dist/esm/components/layout/SceneGridLayout.js.map +1 -0
  27. package/dist/esm/components/layout/SceneGridRow.js +124 -0
  28. package/dist/esm/components/layout/SceneGridRow.js.map +1 -0
  29. package/dist/esm/components/layout/constants.js +7 -0
  30. package/dist/esm/components/layout/constants.js.map +1 -0
  31. package/dist/esm/core/SceneComponentWrapper.js +84 -0
  32. package/dist/esm/core/SceneComponentWrapper.js.map +1 -0
  33. package/dist/esm/core/SceneDataNode.js +7 -0
  34. package/dist/esm/core/SceneDataNode.js.map +1 -0
  35. package/dist/esm/core/SceneDataTransformer.js +51 -0
  36. package/dist/esm/core/SceneDataTransformer.js.map +1 -0
  37. package/dist/esm/core/SceneObjectBase.js +141 -0
  38. package/dist/esm/core/SceneObjectBase.js.map +1 -0
  39. package/dist/esm/core/SceneTimeRange.js +108 -0
  40. package/dist/esm/core/SceneTimeRange.js.map +1 -0
  41. package/dist/esm/core/events.js +8 -0
  42. package/dist/esm/core/events.js.map +1 -0
  43. package/dist/esm/core/sceneGraph.js +68 -0
  44. package/dist/esm/core/sceneGraph.js.map +1 -0
  45. package/dist/esm/core/types.js +6 -0
  46. package/dist/esm/core/types.js.map +1 -0
  47. package/dist/esm/core/utils.js +57 -0
  48. package/dist/esm/core/utils.js.map +1 -0
  49. package/dist/esm/index.js +33 -0
  50. package/dist/esm/index.js.map +1 -0
  51. package/dist/esm/querying/SceneQueryRunner.js +161 -0
  52. package/dist/esm/querying/SceneQueryRunner.js.map +1 -0
  53. package/dist/esm/services/SceneObjectUrlSyncConfig.js +18 -0
  54. package/dist/esm/services/SceneObjectUrlSyncConfig.js.map +1 -0
  55. package/dist/esm/services/UrlSyncManager.js +133 -0
  56. package/dist/esm/services/UrlSyncManager.js.map +1 -0
  57. package/dist/esm/utils/metricTree.js +53 -0
  58. package/dist/esm/utils/metricTree.js.map +1 -0
  59. package/dist/esm/variables/VariableDependencyConfig.js +86 -0
  60. package/dist/esm/variables/VariableDependencyConfig.js.map +1 -0
  61. package/dist/esm/variables/components/VariableValueSelect.js +58 -0
  62. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -0
  63. package/dist/esm/variables/components/VariableValueSelectors.js +56 -0
  64. package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -0
  65. package/dist/esm/variables/constants.js +6 -0
  66. package/dist/esm/variables/constants.js.map +1 -0
  67. package/dist/esm/variables/interpolation/ScopedVarsVariable.js +49 -0
  68. package/dist/esm/variables/interpolation/ScopedVarsVariable.js.map +1 -0
  69. package/dist/esm/variables/interpolation/defaults.js +17 -0
  70. package/dist/esm/variables/interpolation/defaults.js.map +1 -0
  71. package/dist/esm/variables/interpolation/formatRegistry.js +280 -0
  72. package/dist/esm/variables/interpolation/formatRegistry.js.map +1 -0
  73. package/dist/esm/variables/interpolation/sceneInterpolator.js +83 -0
  74. package/dist/esm/variables/interpolation/sceneInterpolator.js.map +1 -0
  75. package/dist/esm/variables/sets/SceneVariableSet.js +123 -0
  76. package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -0
  77. package/dist/esm/variables/types.js +8 -0
  78. package/dist/esm/variables/types.js.map +1 -0
  79. package/dist/esm/variables/variants/ConstantVariable.js +33 -0
  80. package/dist/esm/variables/variants/ConstantVariable.js.map +1 -0
  81. package/dist/esm/variables/variants/CustomVariable.js +58 -0
  82. package/dist/esm/variables/variants/CustomVariable.js.map +1 -0
  83. package/dist/esm/variables/variants/DataSourceVariable.js +92 -0
  84. package/dist/esm/variables/variants/DataSourceVariable.js.map +1 -0
  85. package/dist/esm/variables/variants/MultiValueVariable.js +183 -0
  86. package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -0
  87. package/dist/esm/variables/variants/TestVariable.js +81 -0
  88. package/dist/esm/variables/variants/TestVariable.js.map +1 -0
  89. package/dist/esm/variables/variants/query/QueryVariable.js +137 -0
  90. package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -0
  91. package/dist/esm/variables/variants/query/createQueryVariableRunner.js +93 -0
  92. package/dist/esm/variables/variants/query/createQueryVariableRunner.js.map +1 -0
  93. package/dist/esm/variables/variants/query/guards.js +18 -0
  94. package/dist/esm/variables/variants/query/guards.js.map +1 -0
  95. package/dist/esm/variables/variants/query/toMetricFindValues.js +93 -0
  96. package/dist/esm/variables/variants/query/toMetricFindValues.js.map +1 -0
  97. package/dist/esm/variables/variants/query/utils.js +93 -0
  98. package/dist/esm/variables/variants/query/utils.js.map +1 -0
  99. package/dist/index.d.ts +796 -0
  100. package/dist/index.js +3356 -0
  101. package/dist/index.js.map +1 -0
  102. package/package.json +103 -0
@@ -0,0 +1,58 @@
1
+ import { isArray } from 'lodash';
2
+ import React from 'react';
3
+ import { Select, MultiSelect } from '@grafana/ui';
4
+
5
+ function VariableValueSelect({ model }) {
6
+ const { value, key, loading } = model.useState();
7
+ return /* @__PURE__ */ React.createElement(Select, {
8
+ id: key,
9
+ placeholder: "Select value",
10
+ width: "auto",
11
+ value,
12
+ allowCustomValue: true,
13
+ tabSelectsValue: false,
14
+ isLoading: loading,
15
+ options: model.getOptionsForSelect(),
16
+ onChange: (newValue) => {
17
+ model.changeValueTo(newValue.value, newValue.label);
18
+ }
19
+ });
20
+ }
21
+ function VariableValueSelectMulti({ model }) {
22
+ const { value, key, loading } = model.useState();
23
+ const arrayValue = isArray(value) ? value : [value];
24
+ return /* @__PURE__ */ React.createElement(MultiSelect, {
25
+ id: key,
26
+ placeholder: "Select value",
27
+ width: "auto",
28
+ value: arrayValue,
29
+ tabSelectsValue: false,
30
+ allowCustomValue: true,
31
+ isLoading: loading,
32
+ options: model.getOptionsForSelect(),
33
+ closeMenuOnSelect: false,
34
+ isClearable: true,
35
+ onOpenMenu: () => {
36
+ },
37
+ onChange: (newValue) => {
38
+ model.changeValueTo(
39
+ newValue.map((v) => v.value),
40
+ newValue.map((v) => v.label)
41
+ );
42
+ }
43
+ });
44
+ }
45
+ function renderSelectForVariable(model) {
46
+ if (model.state.isMulti) {
47
+ return /* @__PURE__ */ React.createElement(VariableValueSelectMulti, {
48
+ model
49
+ });
50
+ } else {
51
+ return /* @__PURE__ */ React.createElement(VariableValueSelect, {
52
+ model
53
+ });
54
+ }
55
+ }
56
+
57
+ export { VariableValueSelect, VariableValueSelectMulti, renderSelectForVariable };
58
+ //# sourceMappingURL=VariableValueSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariableValueSelect.js","sources":["../../../../src/variables/components/VariableValueSelect.tsx"],"sourcesContent":["import { isArray } from 'lodash';\nimport React from 'react';\n\nimport { MultiSelect, Select } from '@grafana/ui';\n\nimport { SceneComponentProps } from '../../core/types';\nimport { MultiValueVariable } from '../variants/MultiValueVariable';\n\nexport function VariableValueSelect({ model }: SceneComponentProps<MultiValueVariable>) {\n const { value, key, loading } = model.useState();\n\n return (\n <Select\n id={key}\n placeholder=\"Select value\"\n width=\"auto\"\n value={value}\n allowCustomValue\n tabSelectsValue={false}\n isLoading={loading}\n options={model.getOptionsForSelect()}\n onChange={(newValue) => {\n model.changeValueTo(newValue.value!, newValue.label!);\n }}\n />\n );\n}\n\nexport function VariableValueSelectMulti({ model }: SceneComponentProps<MultiValueVariable>) {\n const { value, key, loading } = model.useState();\n const arrayValue = isArray(value) ? value : [value];\n\n return (\n <MultiSelect\n id={key}\n placeholder=\"Select value\"\n width=\"auto\"\n value={arrayValue}\n tabSelectsValue={false}\n allowCustomValue\n isLoading={loading}\n options={model.getOptionsForSelect()}\n closeMenuOnSelect={false}\n isClearable={true}\n onOpenMenu={() => {}}\n onChange={(newValue) => {\n model.changeValueTo(\n newValue.map((v) => v.value!),\n newValue.map((v) => v.label!)\n );\n }}\n />\n );\n}\n\nexport function renderSelectForVariable(model: MultiValueVariable) {\n if (model.state.isMulti) {\n return <VariableValueSelectMulti model={model} />;\n } else {\n return <VariableValueSelect model={model} />;\n }\n}\n"],"names":[],"mappings":";;;;AAQgB,SAAA,mBAAA,CAAoB,EAAE,KAAA,EAAkD,EAAA;AACtF,EAAA,MAAM,EAAE,KAAO,EAAA,GAAA,EAAK,OAAQ,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAE/C,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAAA,IACC,EAAI,EAAA,GAAA;AAAA,IACJ,WAAY,EAAA,cAAA;AAAA,IACZ,KAAM,EAAA,MAAA;AAAA,IACN,KAAA;AAAA,IACA,gBAAgB,EAAA,IAAA;AAAA,IAChB,eAAiB,EAAA,KAAA;AAAA,IACjB,SAAW,EAAA,OAAA;AAAA,IACX,OAAA,EAAS,MAAM,mBAAoB,EAAA;AAAA,IACnC,QAAA,EAAU,CAAC,QAAa,KAAA;AACtB,MAAA,KAAA,CAAM,aAAc,CAAA,QAAA,CAAS,KAAQ,EAAA,QAAA,CAAS,KAAM,CAAA,CAAA;AAAA,KACtD;AAAA,GACF,CAAA,CAAA;AAEJ,CAAA;AAEgB,SAAA,wBAAA,CAAyB,EAAE,KAAA,EAAkD,EAAA;AAC3F,EAAA,MAAM,EAAE,KAAO,EAAA,GAAA,EAAK,OAAQ,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAC/C,EAAA,MAAM,aAAa,OAAQ,CAAA,KAAK,CAAI,GAAA,KAAA,GAAQ,CAAC,KAAK,CAAA,CAAA;AAElD,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA;AAAA,IACC,EAAI,EAAA,GAAA;AAAA,IACJ,WAAY,EAAA,cAAA;AAAA,IACZ,KAAM,EAAA,MAAA;AAAA,IACN,KAAO,EAAA,UAAA;AAAA,IACP,eAAiB,EAAA,KAAA;AAAA,IACjB,gBAAgB,EAAA,IAAA;AAAA,IAChB,SAAW,EAAA,OAAA;AAAA,IACX,OAAA,EAAS,MAAM,mBAAoB,EAAA;AAAA,IACnC,iBAAmB,EAAA,KAAA;AAAA,IACnB,WAAa,EAAA,IAAA;AAAA,IACb,YAAY,MAAM;AAAA,KAAC;AAAA,IACnB,QAAA,EAAU,CAAC,QAAa,KAAA;AACtB,MAAM,KAAA,CAAA,aAAA;AAAA,QACJ,QAAS,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAM,CAAA;AAAA,QAC5B,QAAS,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAM,CAAA;AAAA,OAC9B,CAAA;AAAA,KACF;AAAA,GACF,CAAA,CAAA;AAEJ,CAAA;AAEO,SAAS,wBAAwB,KAA2B,EAAA;AACjE,EAAI,IAAA,KAAA,CAAM,MAAM,OAAS,EAAA;AACvB,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,wBAAA,EAAA;AAAA,MAAyB,KAAA;AAAA,KAAc,CAAA,CAAA;AAAA,GAC1C,MAAA;AACL,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,mBAAA,EAAA;AAAA,MAAoB,KAAA;AAAA,KAAc,CAAA,CAAA;AAAA,GAC5C;AACF;;;;"}
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { VariableHide } from '@grafana/data';
3
+ import { selectors } from '@grafana/e2e-selectors';
4
+ import { Tooltip } from '@grafana/ui';
5
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
6
+ import { sceneGraph } from '../../core/sceneGraph.js';
7
+
8
+ class VariableValueSelectors extends SceneObjectBase {
9
+ }
10
+ VariableValueSelectors.Component = VariableValueSelectorsRenderer;
11
+ function VariableValueSelectorsRenderer({ model }) {
12
+ const variables = sceneGraph.getVariables(model).useState();
13
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, variables.variables.map((variable) => /* @__PURE__ */ React.createElement(VariableValueSelectWrapper, {
14
+ key: variable.state.key,
15
+ variable
16
+ })));
17
+ }
18
+ function VariableValueSelectWrapper({ variable }) {
19
+ const state = variable.useState();
20
+ if (state.hide === VariableHide.hideVariable) {
21
+ return null;
22
+ }
23
+ return /* @__PURE__ */ React.createElement("div", {
24
+ className: "gf-form"
25
+ }, /* @__PURE__ */ React.createElement(VariableLabel, {
26
+ state
27
+ }), /* @__PURE__ */ React.createElement(variable.Component, {
28
+ model: variable
29
+ }));
30
+ }
31
+ function VariableLabel({ state }) {
32
+ var _a;
33
+ if (state.hide === VariableHide.hideLabel) {
34
+ return null;
35
+ }
36
+ const elementId = `var-${state.key}`;
37
+ const labelOrName = (_a = state.label) != null ? _a : state.name;
38
+ if (state.description) {
39
+ return /* @__PURE__ */ React.createElement(Tooltip, {
40
+ content: state.description,
41
+ placement: "bottom"
42
+ }, /* @__PURE__ */ React.createElement("label", {
43
+ className: "gf-form-label gf-form-label--variable",
44
+ "data-testid": selectors.pages.Dashboard.SubMenu.submenuItemLabels(labelOrName),
45
+ htmlFor: elementId
46
+ }, labelOrName));
47
+ }
48
+ return /* @__PURE__ */ React.createElement("label", {
49
+ className: "gf-form-label gf-form-label--variable",
50
+ "data-testid": selectors.pages.Dashboard.SubMenu.submenuItemLabels(labelOrName),
51
+ htmlFor: elementId
52
+ }, labelOrName);
53
+ }
54
+
55
+ export { VariableValueSelectors };
56
+ //# sourceMappingURL=VariableValueSelectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariableValueSelectors.js","sources":["../../../../src/variables/components/VariableValueSelectors.tsx"],"sourcesContent":["import React from 'react';\n\nimport { VariableHide } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Tooltip } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps, SceneObject, SceneObjectStatePlain } from '../../core/types';\nimport { SceneVariableState } from '../types';\n\nexport class VariableValueSelectors extends SceneObjectBase<SceneObjectStatePlain> {\n public static Component = VariableValueSelectorsRenderer;\n}\n\nfunction VariableValueSelectorsRenderer({ model }: SceneComponentProps<VariableValueSelectors>) {\n const variables = sceneGraph.getVariables(model)!.useState();\n\n return (\n <>\n {variables.variables.map((variable) => (\n <VariableValueSelectWrapper key={variable.state.key} variable={variable} />\n ))}\n </>\n );\n}\n\nfunction VariableValueSelectWrapper({ variable }: { variable: SceneObject<SceneVariableState> }) {\n const state = variable.useState();\n\n if (state.hide === VariableHide.hideVariable) {\n return null;\n }\n\n return (\n <div className=\"gf-form\">\n <VariableLabel state={state} />\n <variable.Component model={variable} />\n </div>\n );\n}\n\nfunction VariableLabel({ state }: { state: SceneVariableState }) {\n if (state.hide === VariableHide.hideLabel) {\n return null;\n }\n\n const elementId = `var-${state.key}`;\n const labelOrName = state.label ?? state.name;\n\n if (state.description) {\n return (\n <Tooltip content={state.description} placement={'bottom'}>\n <label\n className=\"gf-form-label gf-form-label--variable\"\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemLabels(labelOrName)}\n htmlFor={elementId}\n >\n {labelOrName}\n </label>\n </Tooltip>\n );\n }\n\n return (\n <label\n className=\"gf-form-label gf-form-label--variable\"\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemLabels(labelOrName)}\n htmlFor={elementId}\n >\n {labelOrName}\n </label>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAWO,MAAM,+BAA+B,eAAuC,CAAA;AAEnF,CAAA;AAFa,sBAAA,CACG,SAAY,GAAA,8BAAA,CAAA;AAG5B,SAAS,8BAAA,CAA+B,EAAE,KAAA,EAAsD,EAAA;AAC9F,EAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,KAAK,EAAG,QAAS,EAAA,CAAA;AAE3D,EAAA,iEAEK,SAAU,CAAA,SAAA,CAAU,GAAI,CAAA,CAAC,6BACvB,KAAA,CAAA,aAAA,CAAA,0BAAA,EAAA;AAAA,IAA2B,GAAA,EAAK,SAAS,KAAM,CAAA,GAAA;AAAA,IAAK,QAAA;AAAA,GAAoB,CAC1E,CACH,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,0BAAA,CAA2B,EAAE,QAAA,EAA2D,EAAA;AAC/F,EAAM,MAAA,KAAA,GAAQ,SAAS,QAAS,EAAA,CAAA;AAEhC,EAAI,IAAA,KAAA,CAAM,IAAS,KAAA,YAAA,CAAa,YAAc,EAAA;AAC5C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,SAAU,EAAA,SAAA;AAAA,GAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IAAc,KAAA;AAAA,GAAc,CAAA,kBAC5B,KAAA,CAAA,aAAA,CAAA,QAAA,CAAS,SAAT,EAAA;AAAA,IAAmB,KAAO,EAAA,QAAA;AAAA,GAAU,CACvC,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAwC,EAAA;AA1CjE,EAAA,IAAA,EAAA,CAAA;AA2CE,EAAI,IAAA,KAAA,CAAM,IAAS,KAAA,YAAA,CAAa,SAAW,EAAA;AACzC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,SAAA,GAAY,OAAO,KAAM,CAAA,GAAA,CAAA,CAAA,CAAA;AAC/B,EAAA,MAAM,WAAc,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,KAAN,KAAA,IAAA,GAAA,EAAA,GAAe,KAAM,CAAA,IAAA,CAAA;AAEzC,EAAA,IAAI,MAAM,WAAa,EAAA;AACrB,IAAA,uBACG,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA;AAAA,MAAQ,SAAS,KAAM,CAAA,WAAA;AAAA,MAAa,SAAW,EAAA,QAAA;AAAA,KAAA,kBAC7C,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA;AAAA,MACC,SAAU,EAAA,uCAAA;AAAA,MACV,eAAa,SAAU,CAAA,KAAA,CAAM,SAAU,CAAA,OAAA,CAAQ,kBAAkB,WAAW,CAAA;AAAA,MAC5E,OAAS,EAAA,SAAA;AAAA,KAAA,EAER,WACH,CACF,CAAA,CAAA;AAAA,GAEJ;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA;AAAA,IACC,SAAU,EAAA,uCAAA;AAAA,IACV,eAAa,SAAU,CAAA,KAAA,CAAM,SAAU,CAAA,OAAA,CAAQ,kBAAkB,WAAW,CAAA;AAAA,IAC5E,OAAS,EAAA,SAAA;AAAA,GAAA,EAER,WACH,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,6 @@
1
+ const ALL_VARIABLE_TEXT = "All";
2
+ const ALL_VARIABLE_VALUE = "$__all";
3
+ const VARIABLE_REGEX = /\$(\w+)|\[\[(\w+?)(?::(\w+))?\]\]|\${(\w+)(?:\.([^:^\}]+))?(?::([^\}]+))?}/g;
4
+
5
+ export { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE, VARIABLE_REGEX };
6
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../src/variables/constants.ts"],"sourcesContent":["export const ALL_VARIABLE_TEXT = 'All';\nexport const ALL_VARIABLE_VALUE = '$__all';\nexport const NONE_VARIABLE_TEXT = 'None';\nexport const NONE_VARIABLE_VALUE = '';\n\n// Grafana core source: https://github.com/grafana/grafana/blob/main/public/app/features/variables/utils.ts#L23\n/*\n * This regex matches 3 types of variable reference with an optional format specifier\n * \\$(\\w+) $var1\n * \\[\\[(\\w+?)(?::(\\w+))?\\]\\] [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(?::(\\w+))?} ${var3} or ${var3:fmt3}\n */\nexport const VARIABLE_REGEX = /\\$(\\w+)|\\[\\[(\\w+?)(?::(\\w+))?\\]\\]|\\${(\\w+)(?:\\.([^:^\\}]+))?(?::([^\\}]+))?}/g;\n"],"names":[],"mappings":"AAAO,MAAM,iBAAoB,GAAA,MAAA;AAC1B,MAAM,kBAAqB,GAAA,SAAA;AAW3B,MAAM,cAAiB,GAAA;;;;"}
@@ -0,0 +1,49 @@
1
+ import { property } from 'lodash';
2
+
3
+ const _ScopedVarsVariable = class {
4
+ constructor(name, value) {
5
+ this.state = { name, value, type: "scopedvar" };
6
+ }
7
+ getValue(fieldPath) {
8
+ let { value } = this.state;
9
+ let realValue = value.value;
10
+ if (fieldPath) {
11
+ realValue = this.getFieldAccessor(fieldPath)(value.value);
12
+ } else {
13
+ realValue = value.value;
14
+ }
15
+ if (realValue === "string" || realValue === "number" || realValue === "boolean") {
16
+ return realValue;
17
+ }
18
+ return String(realValue);
19
+ }
20
+ getValueText() {
21
+ const { value } = this.state;
22
+ if (value.text != null) {
23
+ return String(value.text);
24
+ }
25
+ return String(value);
26
+ }
27
+ getFieldAccessor(fieldPath) {
28
+ const accessor = _ScopedVarsVariable.fieldAccessorCache[fieldPath];
29
+ if (accessor) {
30
+ return accessor;
31
+ }
32
+ return _ScopedVarsVariable.fieldAccessorCache[fieldPath] = property(fieldPath);
33
+ }
34
+ };
35
+ let ScopedVarsVariable = _ScopedVarsVariable;
36
+ ScopedVarsVariable.fieldAccessorCache = {};
37
+ let scopedVarsVariable;
38
+ function getSceneVariableForScopedVar(name, value) {
39
+ if (!scopedVarsVariable) {
40
+ scopedVarsVariable = new ScopedVarsVariable(name, value);
41
+ } else {
42
+ scopedVarsVariable.state.name = name;
43
+ scopedVarsVariable.state.value = value;
44
+ }
45
+ return scopedVarsVariable;
46
+ }
47
+
48
+ export { ScopedVarsVariable, getSceneVariableForScopedVar };
49
+ //# sourceMappingURL=ScopedVarsVariable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScopedVarsVariable.js","sources":["../../../../src/variables/interpolation/ScopedVarsVariable.ts"],"sourcesContent":["import { property } from 'lodash';\n\nimport { ScopedVar } from '@grafana/data';\n\nimport { VariableValue } from '../types';\n\nimport { FormatVariable } from './formatRegistry';\n\nexport class ScopedVarsVariable implements FormatVariable {\n private static fieldAccessorCache: FieldAccessorCache = {};\n\n public state: { name: string; value: ScopedVar; type: string };\n\n public constructor(name: string, value: ScopedVar) {\n this.state = { name, value, type: 'scopedvar' };\n }\n\n public getValue(fieldPath: string): VariableValue {\n let { value } = this.state;\n let realValue = value.value;\n\n if (fieldPath) {\n realValue = this.getFieldAccessor(fieldPath)(value.value);\n } else {\n realValue = value.value;\n }\n\n if (realValue === 'string' || realValue === 'number' || realValue === 'boolean') {\n return realValue;\n }\n\n return String(realValue);\n }\n\n public getValueText(): string {\n const { value } = this.state;\n\n if (value.text != null) {\n return String(value.text);\n }\n\n return String(value);\n }\n\n private getFieldAccessor(fieldPath: string) {\n const accessor = ScopedVarsVariable.fieldAccessorCache[fieldPath];\n if (accessor) {\n return accessor;\n }\n\n return (ScopedVarsVariable.fieldAccessorCache[fieldPath] = property(fieldPath));\n }\n}\n\ninterface FieldAccessorCache {\n [key: string]: (obj: unknown) => unknown;\n}\n\nlet scopedVarsVariable: ScopedVarsVariable | undefined;\n\n/**\n * Reuses a single instance to avoid unnecessary memory allocations\n */\nexport function getSceneVariableForScopedVar(name: string, value: ScopedVar) {\n if (!scopedVarsVariable) {\n scopedVarsVariable = new ScopedVarsVariable(name, value);\n } else {\n scopedVarsVariable.state.name = name;\n scopedVarsVariable.state.value = value;\n }\n\n return scopedVarsVariable;\n}\n"],"names":[],"mappings":";;AAQO,MAAM,sBAAN,MAAmD;AAAA,EAKjD,WAAA,CAAY,MAAc,KAAkB,EAAA;AACjD,IAAA,IAAA,CAAK,KAAQ,GAAA,EAAE,IAAM,EAAA,KAAA,EAAO,MAAM,WAAY,EAAA,CAAA;AAAA,GAChD;AAAA,EAEO,SAAS,SAAkC,EAAA;AAChD,IAAI,IAAA,EAAE,KAAM,EAAA,GAAI,IAAK,CAAA,KAAA,CAAA;AACrB,IAAA,IAAI,YAAY,KAAM,CAAA,KAAA,CAAA;AAEtB,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,SAAA,GAAY,IAAK,CAAA,gBAAA,CAAiB,SAAS,CAAA,CAAE,MAAM,KAAK,CAAA,CAAA;AAAA,KACnD,MAAA;AACL,MAAA,SAAA,GAAY,KAAM,CAAA,KAAA,CAAA;AAAA,KACpB;AAEA,IAAA,IAAI,SAAc,KAAA,QAAA,IAAY,SAAc,KAAA,QAAA,IAAY,cAAc,SAAW,EAAA;AAC/E,MAAO,OAAA,SAAA,CAAA;AAAA,KACT;AAEA,IAAA,OAAO,OAAO,SAAS,CAAA,CAAA;AAAA,GACzB;AAAA,EAEO,YAAuB,GAAA;AAC5B,IAAM,MAAA,EAAE,KAAM,EAAA,GAAI,IAAK,CAAA,KAAA,CAAA;AAEvB,IAAI,IAAA,KAAA,CAAM,QAAQ,IAAM,EAAA;AACtB,MAAO,OAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AAAA,KAC1B;AAEA,IAAA,OAAO,OAAO,KAAK,CAAA,CAAA;AAAA,GACrB;AAAA,EAEQ,iBAAiB,SAAmB,EAAA;AAC1C,IAAM,MAAA,QAAA,GAAW,oBAAmB,kBAAmB,CAAA,SAAA,CAAA,CAAA;AACvD,IAAA,IAAI,QAAU,EAAA;AACZ,MAAO,OAAA,QAAA,CAAA;AAAA,KACT;AAEA,IAAA,OAAQ,mBAAmB,CAAA,kBAAA,CAAmB,SAAa,CAAA,GAAA,QAAA,CAAS,SAAS,CAAA,CAAA;AAAA,GAC/E;AACF,CAAA,CAAA;AA5CO,IAAM,kBAAN,GAAA,oBAAA;AAAM,kBAAA,CACI,qBAAyC,EAAC,CAAA;AAiD3D,IAAI,kBAAA,CAAA;AAKY,SAAA,4BAAA,CAA6B,MAAc,KAAkB,EAAA;AAC3E,EAAA,IAAI,CAAC,kBAAoB,EAAA;AACvB,IAAqB,kBAAA,GAAA,IAAI,kBAAmB,CAAA,IAAA,EAAM,KAAK,CAAA,CAAA;AAAA,GAClD,MAAA;AACL,IAAA,kBAAA,CAAmB,MAAM,IAAO,GAAA,IAAA,CAAA;AAChC,IAAA,kBAAA,CAAmB,MAAM,KAAQ,GAAA,KAAA,CAAA;AAAA,GACnC;AAEA,EAAO,OAAA,kBAAA,CAAA;AACT;;;;"}
@@ -0,0 +1,17 @@
1
+ import { LoadingState, getDefaultTimeRange } from '@grafana/data';
2
+ import { SceneDataNode } from '../../core/SceneDataNode.js';
3
+ import { SceneTimeRange } from '../../core/SceneTimeRange.js';
4
+ import { SceneVariableSet } from '../sets/SceneVariableSet.js';
5
+
6
+ const EmptyVariableSet = new SceneVariableSet({ variables: [] });
7
+ const EmptyDataNode = new SceneDataNode({
8
+ data: {
9
+ state: LoadingState.Done,
10
+ series: [],
11
+ timeRange: getDefaultTimeRange()
12
+ }
13
+ });
14
+ const DefaultTimeRange = new SceneTimeRange();
15
+
16
+ export { DefaultTimeRange, EmptyDataNode, EmptyVariableSet };
17
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sources":["../../../../src/variables/interpolation/defaults.ts"],"sourcesContent":["import { getDefaultTimeRange, LoadingState } from '@grafana/data';\nimport { SceneDataNode } from '../../core/SceneDataNode';\nimport { SceneTimeRange } from '../../core/SceneTimeRange';\nimport { SceneVariableSet } from '../sets/SceneVariableSet';\n\nexport const EmptyVariableSet = new SceneVariableSet({ variables: [] });\n\nexport const EmptyDataNode = new SceneDataNode({\n data: {\n state: LoadingState.Done,\n series: [],\n timeRange: getDefaultTimeRange(),\n },\n});\n\nexport const DefaultTimeRange = new SceneTimeRange();\n"],"names":[],"mappings":";;;;;AAKO,MAAM,mBAAmB,IAAI,gBAAA,CAAiB,EAAE,SAAW,EAAA,IAAI,EAAA;AAEzD,MAAA,aAAA,GAAgB,IAAI,aAAc,CAAA;AAAA,EAC7C,IAAM,EAAA;AAAA,IACJ,OAAO,YAAa,CAAA,IAAA;AAAA,IACpB,QAAQ,EAAC;AAAA,IACT,WAAW,mBAAoB,EAAA;AAAA,GACjC;AACF,CAAC,EAAA;AAEY,MAAA,gBAAA,GAAmB,IAAI,cAAe;;;;"}
@@ -0,0 +1,280 @@
1
+ import { map, isArray, replace } from 'lodash';
2
+ import { Registry, escapeRegex, textUtil, dateTime } from '@grafana/data';
3
+
4
+ var FormatRegistryID = /* @__PURE__ */ ((FormatRegistryID2) => {
5
+ FormatRegistryID2["lucene"] = "lucene";
6
+ FormatRegistryID2["raw"] = "raw";
7
+ FormatRegistryID2["regex"] = "regex";
8
+ FormatRegistryID2["pipe"] = "pipe";
9
+ FormatRegistryID2["distributed"] = "distributed";
10
+ FormatRegistryID2["csv"] = "csv";
11
+ FormatRegistryID2["html"] = "html";
12
+ FormatRegistryID2["json"] = "json";
13
+ FormatRegistryID2["percentEncode"] = "percentencode";
14
+ FormatRegistryID2["singleQuote"] = "singlequote";
15
+ FormatRegistryID2["doubleQuote"] = "doublequote";
16
+ FormatRegistryID2["sqlString"] = "sqlstring";
17
+ FormatRegistryID2["date"] = "date";
18
+ FormatRegistryID2["glob"] = "glob";
19
+ FormatRegistryID2["text"] = "text";
20
+ FormatRegistryID2["queryParam"] = "queryparam";
21
+ return FormatRegistryID2;
22
+ })(FormatRegistryID || {});
23
+ const formatRegistry = new Registry(() => {
24
+ const formats = [
25
+ {
26
+ id: "lucene" /* lucene */,
27
+ name: "Lucene",
28
+ description: "Values are lucene escaped and multi-valued variables generate an OR expression",
29
+ formatter: (value) => {
30
+ if (typeof value === "string") {
31
+ return luceneEscape(value);
32
+ }
33
+ if (Array.isArray(value)) {
34
+ if (value.length === 0) {
35
+ return "__empty__";
36
+ }
37
+ const quotedValues = map(value, (val) => {
38
+ return '"' + luceneEscape(val) + '"';
39
+ });
40
+ return "(" + quotedValues.join(" OR ") + ")";
41
+ } else {
42
+ return luceneEscape(`${value}`);
43
+ }
44
+ }
45
+ },
46
+ {
47
+ id: "raw" /* raw */,
48
+ name: "raw",
49
+ description: "Keep value as is",
50
+ formatter: (value) => String(value)
51
+ },
52
+ {
53
+ id: "regex" /* regex */,
54
+ name: "Regex",
55
+ description: "Values are regex escaped and multi-valued variables generate a (<value>|<value>) expression",
56
+ formatter: (value) => {
57
+ if (typeof value === "string") {
58
+ return escapeRegex(value);
59
+ }
60
+ if (Array.isArray(value)) {
61
+ const escapedValues = value.map((item) => {
62
+ if (typeof item === "string") {
63
+ return escapeRegex(item);
64
+ } else {
65
+ return escapeRegex(String(item));
66
+ }
67
+ });
68
+ if (escapedValues.length === 1) {
69
+ return escapedValues[0];
70
+ }
71
+ return "(" + escapedValues.join("|") + ")";
72
+ }
73
+ return escapeRegex(`${value}`);
74
+ }
75
+ },
76
+ {
77
+ id: "pipe" /* pipe */,
78
+ name: "Pipe",
79
+ description: "Values are separated by | character",
80
+ formatter: (value) => {
81
+ if (typeof value === "string") {
82
+ return value;
83
+ }
84
+ if (Array.isArray(value)) {
85
+ return value.join("|");
86
+ }
87
+ return `${value}`;
88
+ }
89
+ },
90
+ {
91
+ id: "distributed" /* distributed */,
92
+ name: "Distributed",
93
+ description: "Multiple values are formatted like variable=value",
94
+ formatter: (value, args, variable) => {
95
+ if (typeof value === "string") {
96
+ return value;
97
+ }
98
+ if (Array.isArray(value)) {
99
+ value = map(value, (val, index) => {
100
+ if (index !== 0) {
101
+ return variable.state.name + "=" + val;
102
+ } else {
103
+ return val;
104
+ }
105
+ });
106
+ return value.join(",");
107
+ }
108
+ return `${value}`;
109
+ }
110
+ },
111
+ {
112
+ id: "csv" /* csv */,
113
+ name: "Csv",
114
+ description: "Comma-separated values",
115
+ formatter: (value) => {
116
+ if (typeof value === "string") {
117
+ return value;
118
+ }
119
+ if (isArray(value)) {
120
+ return value.join(",");
121
+ }
122
+ return String(value);
123
+ }
124
+ },
125
+ {
126
+ id: "html" /* html */,
127
+ name: "HTML",
128
+ description: "HTML escaping of values",
129
+ formatter: (value) => {
130
+ if (typeof value === "string") {
131
+ return textUtil.escapeHtml(value);
132
+ }
133
+ if (isArray(value)) {
134
+ return textUtil.escapeHtml(value.join(", "));
135
+ }
136
+ return textUtil.escapeHtml(String(value));
137
+ }
138
+ },
139
+ {
140
+ id: "json" /* json */,
141
+ name: "JSON",
142
+ description: "JSON stringify value",
143
+ formatter: (value) => {
144
+ return JSON.stringify(value);
145
+ }
146
+ },
147
+ {
148
+ id: "percentencode" /* percentEncode */,
149
+ name: "Percent encode",
150
+ description: "Useful for URL escaping values",
151
+ formatter: (value) => {
152
+ if (isArray(value)) {
153
+ return encodeURIComponentStrict("{" + value.join(",") + "}");
154
+ }
155
+ return encodeURIComponentStrict(value);
156
+ }
157
+ },
158
+ {
159
+ id: "singlequote" /* singleQuote */,
160
+ name: "Single quote",
161
+ description: "Single quoted values",
162
+ formatter: (value) => {
163
+ const regExp = new RegExp(`'`, "g");
164
+ if (isArray(value)) {
165
+ return map(value, (v) => `'${replace(v, regExp, `\\'`)}'`).join(",");
166
+ }
167
+ let strVal = typeof value === "string" ? value : String(value);
168
+ return `'${replace(strVal, regExp, `\\'`)}'`;
169
+ }
170
+ },
171
+ {
172
+ id: "doublequote" /* doubleQuote */,
173
+ name: "Double quote",
174
+ description: "Double quoted values",
175
+ formatter: (value) => {
176
+ const regExp = new RegExp('"', "g");
177
+ if (isArray(value)) {
178
+ return map(value, (v) => `"${replace(v, regExp, '\\"')}"`).join(",");
179
+ }
180
+ let strVal = typeof value === "string" ? value : String(value);
181
+ return `"${replace(strVal, regExp, '\\"')}"`;
182
+ }
183
+ },
184
+ {
185
+ id: "sqlstring" /* sqlString */,
186
+ name: "SQL string",
187
+ description: "SQL string quoting and commas for use in IN statements and other scenarios",
188
+ formatter: (value) => {
189
+ const regExp = new RegExp(`'`, "g");
190
+ if (isArray(value)) {
191
+ return map(value, (v) => `'${replace(v, regExp, "''")}'`).join(",");
192
+ }
193
+ let strVal = typeof value === "string" ? value : String(value);
194
+ return `'${replace(strVal, regExp, "''")}'`;
195
+ }
196
+ },
197
+ {
198
+ id: "date" /* date */,
199
+ name: "Date",
200
+ description: "Format date in different ways",
201
+ formatter: (value, args) => {
202
+ var _a;
203
+ let nrValue = NaN;
204
+ if (typeof value === "number") {
205
+ nrValue = value;
206
+ } else if (typeof value === "string") {
207
+ nrValue = parseInt(value, 10);
208
+ }
209
+ if (isNaN(nrValue)) {
210
+ return "NaN";
211
+ }
212
+ const arg = (_a = args[0]) != null ? _a : "iso";
213
+ switch (arg) {
214
+ case "ms":
215
+ return String(value);
216
+ case "seconds":
217
+ return `${Math.round(nrValue / 1e3)}`;
218
+ case "iso":
219
+ return dateTime(nrValue).toISOString();
220
+ default:
221
+ return dateTime(nrValue).format(arg);
222
+ }
223
+ }
224
+ },
225
+ {
226
+ id: "glob" /* glob */,
227
+ name: "Glob",
228
+ description: "Format multi-valued variables using glob syntax, example {value1,value2}",
229
+ formatter: (value) => {
230
+ if (isArray(value) && value.length > 1) {
231
+ return "{" + value.join(",") + "}";
232
+ }
233
+ return String(value);
234
+ }
235
+ },
236
+ {
237
+ id: "text" /* text */,
238
+ name: "Text",
239
+ description: "Format variables in their text representation. Example in multi-variable scenario A + B + C.",
240
+ formatter: (value, _args, variable) => {
241
+ if (variable.getValueText) {
242
+ return variable.getValueText();
243
+ }
244
+ return String(value);
245
+ }
246
+ },
247
+ {
248
+ id: "queryparam" /* queryParam */,
249
+ name: "Query parameter",
250
+ description: "Format variables as URL parameters. Example in multi-variable scenario A + B + C => var-foo=A&var-foo=B&var-foo=C.",
251
+ formatter: (value, _args, variable) => {
252
+ if (Array.isArray(value)) {
253
+ return value.map((v) => formatQueryParameter(variable.state.name, v)).join("&");
254
+ }
255
+ return formatQueryParameter(variable.state.name, value);
256
+ }
257
+ }
258
+ ];
259
+ return formats;
260
+ });
261
+ function luceneEscape(value) {
262
+ if (isNaN(+value) === false) {
263
+ return value;
264
+ }
265
+ return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, "\\$1");
266
+ }
267
+ function encodeURIComponentStrict(str) {
268
+ if (typeof str === "object") {
269
+ str = String(str);
270
+ }
271
+ return encodeURIComponent(str).replace(/[!'()*]/g, (c) => {
272
+ return "%" + c.charCodeAt(0).toString(16).toUpperCase();
273
+ });
274
+ }
275
+ function formatQueryParameter(name, value) {
276
+ return `var-${name}=${encodeURIComponentStrict(value)}`;
277
+ }
278
+
279
+ export { FormatRegistryID, formatRegistry };
280
+ //# sourceMappingURL=formatRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatRegistry.js","sources":["../../../../src/variables/interpolation/formatRegistry.ts"],"sourcesContent":["import { isArray, map, replace } from 'lodash';\n\nimport { dateTime, Registry, RegistryItem, textUtil, escapeRegex } from '@grafana/data';\nimport { VariableType } from '@grafana/schema';\n\nimport { VariableValue, VariableValueSingle } from '../types';\nimport { ALL_VARIABLE_VALUE } from '../constants';\n\nexport interface FormatRegistryItem extends RegistryItem {\n formatter(value: VariableValue, args: string[], variable: FormatVariable): string;\n}\n\n/**\n * Slimmed down version of the SceneVariable interface so that it only contains what the formatters actually use.\n * This is useful as we have some implementations of this interface that does not need to be full scene objects.\n * For example ScopedVarsVariable and LegacyVariableWrapper.\n */\nexport interface FormatVariable {\n state: {\n name: string;\n type: VariableType | string;\n };\n\n getValue(fieldPath?: string): VariableValue | undefined | null;\n getValueText?(fieldPath?: string): string;\n}\n\nexport enum FormatRegistryID {\n lucene = 'lucene',\n raw = 'raw',\n regex = 'regex',\n pipe = 'pipe',\n distributed = 'distributed',\n csv = 'csv',\n html = 'html',\n json = 'json',\n percentEncode = 'percentencode',\n singleQuote = 'singlequote',\n doubleQuote = 'doublequote',\n sqlString = 'sqlstring',\n date = 'date',\n glob = 'glob',\n text = 'text',\n queryParam = 'queryparam',\n}\n\nexport const formatRegistry = new Registry<FormatRegistryItem>(() => {\n const formats: FormatRegistryItem[] = [\n {\n id: FormatRegistryID.lucene,\n name: 'Lucene',\n description: 'Values are lucene escaped and multi-valued variables generate an OR expression',\n formatter: (value) => {\n if (typeof value === 'string') {\n return luceneEscape(value);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '__empty__';\n }\n const quotedValues = map(value, (val: string) => {\n return '\"' + luceneEscape(val) + '\"';\n });\n return '(' + quotedValues.join(' OR ') + ')';\n } else {\n return luceneEscape(`${value}`);\n }\n },\n },\n {\n id: FormatRegistryID.raw,\n name: 'raw',\n description: 'Keep value as is',\n formatter: (value) => String(value),\n },\n {\n id: FormatRegistryID.regex,\n name: 'Regex',\n description: 'Values are regex escaped and multi-valued variables generate a (<value>|<value>) expression',\n formatter: (value) => {\n if (typeof value === 'string') {\n return escapeRegex(value);\n }\n\n if (Array.isArray(value)) {\n const escapedValues = value.map((item) => {\n if (typeof item === 'string') {\n return escapeRegex(item);\n } else {\n return escapeRegex(String(item));\n }\n });\n\n if (escapedValues.length === 1) {\n return escapedValues[0];\n }\n\n return '(' + escapedValues.join('|') + ')';\n }\n\n return escapeRegex(`${value}`);\n },\n },\n {\n id: FormatRegistryID.pipe,\n name: 'Pipe',\n description: 'Values are separated by | character',\n formatter: (value) => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.join('|');\n }\n\n return `${value}`;\n },\n },\n {\n id: FormatRegistryID.distributed,\n name: 'Distributed',\n description: 'Multiple values are formatted like variable=value',\n formatter: (value, args, variable) => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n value = map(value, (val: string, index: number) => {\n if (index !== 0) {\n return variable.state.name + '=' + val;\n } else {\n return val;\n }\n });\n\n return value.join(',');\n }\n\n return `${value}`;\n },\n },\n {\n id: FormatRegistryID.csv,\n name: 'Csv',\n description: 'Comma-separated values',\n formatter: (value) => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (isArray(value)) {\n return value.join(',');\n }\n\n return String(value);\n },\n },\n {\n id: FormatRegistryID.html,\n name: 'HTML',\n description: 'HTML escaping of values',\n formatter: (value) => {\n if (typeof value === 'string') {\n return textUtil.escapeHtml(value);\n }\n\n if (isArray(value)) {\n return textUtil.escapeHtml(value.join(', '));\n }\n\n return textUtil.escapeHtml(String(value));\n },\n },\n {\n id: FormatRegistryID.json,\n name: 'JSON',\n description: 'JSON stringify value',\n formatter: (value) => {\n return JSON.stringify(value);\n },\n },\n {\n id: FormatRegistryID.percentEncode,\n name: 'Percent encode',\n description: 'Useful for URL escaping values',\n formatter: (value) => {\n // like glob, but url escaped\n if (isArray(value)) {\n return encodeURIComponentStrict('{' + value.join(',') + '}');\n }\n\n return encodeURIComponentStrict(value);\n },\n },\n {\n id: FormatRegistryID.singleQuote,\n name: 'Single quote',\n description: 'Single quoted values',\n formatter: (value) => {\n // escape single quotes with backslash\n const regExp = new RegExp(`'`, 'g');\n\n if (isArray(value)) {\n return map(value, (v: string) => `'${replace(v, regExp, `\\\\'`)}'`).join(',');\n }\n\n let strVal = typeof value === 'string' ? value : String(value);\n return `'${replace(strVal, regExp, `\\\\'`)}'`;\n },\n },\n {\n id: FormatRegistryID.doubleQuote,\n name: 'Double quote',\n description: 'Double quoted values',\n formatter: (value) => {\n // escape double quotes with backslash\n const regExp = new RegExp('\"', 'g');\n if (isArray(value)) {\n return map(value, (v: string) => `\"${replace(v, regExp, '\\\\\"')}\"`).join(',');\n }\n\n let strVal = typeof value === 'string' ? value : String(value);\n return `\"${replace(strVal, regExp, '\\\\\"')}\"`;\n },\n },\n {\n id: FormatRegistryID.sqlString,\n name: 'SQL string',\n description: 'SQL string quoting and commas for use in IN statements and other scenarios',\n formatter: (value) => {\n // escape single quotes by pairing them\n const regExp = new RegExp(`'`, 'g');\n if (isArray(value)) {\n return map(value, (v: string) => `'${replace(v, regExp, \"''\")}'`).join(',');\n }\n\n let strVal = typeof value === 'string' ? value : String(value);\n return `'${replace(strVal, regExp, \"''\")}'`;\n },\n },\n {\n id: FormatRegistryID.date,\n name: 'Date',\n description: 'Format date in different ways',\n formatter: (value, args) => {\n let nrValue = NaN;\n\n if (typeof value === 'number') {\n nrValue = value;\n } else if (typeof value === 'string') {\n nrValue = parseInt(value, 10);\n }\n\n if (isNaN(nrValue)) {\n return 'NaN';\n }\n\n const arg = args[0] ?? 'iso';\n switch (arg) {\n case 'ms':\n return String(value);\n case 'seconds':\n return `${Math.round(nrValue! / 1000)}`;\n case 'iso':\n return dateTime(nrValue).toISOString();\n default:\n return dateTime(nrValue).format(arg);\n }\n },\n },\n {\n id: FormatRegistryID.glob,\n name: 'Glob',\n description: 'Format multi-valued variables using glob syntax, example {value1,value2}',\n formatter: (value) => {\n if (isArray(value) && value.length > 1) {\n return '{' + value.join(',') + '}';\n }\n return String(value);\n },\n },\n {\n id: FormatRegistryID.text,\n name: 'Text',\n description: 'Format variables in their text representation. Example in multi-variable scenario A + B + C.',\n formatter: (value, _args, variable) => {\n if (variable.getValueText) {\n return variable.getValueText();\n }\n\n return String(value);\n },\n },\n {\n id: FormatRegistryID.queryParam,\n name: 'Query parameter',\n description:\n 'Format variables as URL parameters. Example in multi-variable scenario A + B + C => var-foo=A&var-foo=B&var-foo=C.',\n formatter: (value, _args, variable) => {\n if (Array.isArray(value)) {\n return value.map((v) => formatQueryParameter(variable.state.name, v)).join('&');\n }\n return formatQueryParameter(variable.state.name, value);\n },\n },\n ];\n\n return formats;\n});\n\nfunction luceneEscape(value: string) {\n if (isNaN(+value) === false) {\n return value;\n }\n\n return value.replace(/([\\!\\*\\+\\-\\=<>\\s\\&\\|\\(\\)\\[\\]\\{\\}\\^\\~\\?\\:\\\\/\"])/g, '\\\\$1');\n}\n\n/**\n * encode string according to RFC 3986; in contrast to encodeURIComponent()\n * also the sub-delims \"!\", \"'\", \"(\", \")\" and \"*\" are encoded;\n * unicode handling uses UTF-8 as in ECMA-262.\n */\nfunction encodeURIComponentStrict(str: VariableValueSingle) {\n if (typeof str === 'object') {\n str = String(str);\n }\n\n return encodeURIComponent(str).replace(/[!'()*]/g, (c) => {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\nfunction formatQueryParameter(name: string, value: VariableValueSingle): string {\n return `var-${name}=${encodeURIComponentStrict(value)}`;\n}\n\nexport function isAllValue(value: VariableValueSingle) {\n return value === ALL_VARIABLE_VALUE || (Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE);\n}\n"],"names":["FormatRegistryID"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { getSceneVariableForScopedVar } from './ScopedVarsVariable.js';
2
+ import { FormatRegistryID, formatRegistry } from './formatRegistry.js';
3
+ import { VARIABLE_REGEX } from '../constants.js';
4
+ import { EmptyVariableSet } from './defaults.js';
5
+
6
+ function sceneInterpolator(sceneObject, target, getVariables, scopedVars, format) {
7
+ if (!target) {
8
+ return target != null ? target : "";
9
+ }
10
+ if (getVariables(sceneObject) === EmptyVariableSet) {
11
+ return target;
12
+ }
13
+ VARIABLE_REGEX.lastIndex = 0;
14
+ return target.replace(VARIABLE_REGEX, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {
15
+ const variableName = var1 || var2 || var3;
16
+ const fmt = fmt2 || fmt3 || format;
17
+ let variable;
18
+ if (scopedVars && scopedVars[variableName]) {
19
+ variable = getSceneVariableForScopedVar(variableName, scopedVars[variableName]);
20
+ } else {
21
+ variable = lookupSceneVariable(variableName, sceneObject);
22
+ }
23
+ if (!variable) {
24
+ return match;
25
+ }
26
+ return formatValue(variable, variable.getValue(fieldPath), fmt);
27
+ });
28
+ }
29
+ function lookupSceneVariable(name, sceneObject) {
30
+ const variables = sceneObject.state.$variables;
31
+ if (!variables) {
32
+ if (sceneObject.parent) {
33
+ return lookupSceneVariable(name, sceneObject.parent);
34
+ } else {
35
+ return null;
36
+ }
37
+ }
38
+ const found = variables.getByName(name);
39
+ if (found) {
40
+ return found;
41
+ } else if (sceneObject.parent) {
42
+ return lookupSceneVariable(name, sceneObject.parent);
43
+ }
44
+ return null;
45
+ }
46
+ function formatValue(variable, value, formatNameOrFn) {
47
+ if (value === null || value === void 0) {
48
+ return "";
49
+ }
50
+ if (typeof value === "object" && "isCustomValue" in value && formatNameOrFn !== FormatRegistryID.text) {
51
+ return value.toString();
52
+ }
53
+ if (!Array.isArray(value) && typeof value === "object") {
54
+ value = `${value}`;
55
+ }
56
+ if (typeof formatNameOrFn === "function") {
57
+ return formatNameOrFn(value, {
58
+ name: variable.state.name,
59
+ type: variable.state.type
60
+ });
61
+ }
62
+ let args = [];
63
+ if (!formatNameOrFn) {
64
+ formatNameOrFn = FormatRegistryID.glob;
65
+ } else {
66
+ args = formatNameOrFn.split(":");
67
+ if (args.length > 1) {
68
+ formatNameOrFn = args[0];
69
+ args = args.slice(1);
70
+ } else {
71
+ args = [];
72
+ }
73
+ }
74
+ let formatter = formatRegistry.getIfExists(formatNameOrFn);
75
+ if (!formatter) {
76
+ console.error(`Variable format ${formatNameOrFn} not found. Using glob format as fallback.`);
77
+ formatter = formatRegistry.get(FormatRegistryID.glob);
78
+ }
79
+ return formatter.formatter(value, args, variable);
80
+ }
81
+
82
+ export { sceneInterpolator };
83
+ //# sourceMappingURL=sceneInterpolator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sceneInterpolator.js","sources":["../../../../src/variables/interpolation/sceneInterpolator.ts"],"sourcesContent":["import { ScopedVars } from '@grafana/data';\nimport { VariableModel, VariableType } from '@grafana/schema';\n\nimport { SceneObject } from '../../core/types';\nimport { SceneVariables, VariableValue } from '../types';\n\nimport { getSceneVariableForScopedVar } from './ScopedVarsVariable';\nimport { formatRegistry, FormatRegistryID, FormatVariable } from './formatRegistry';\nimport { VARIABLE_REGEX } from '../constants';\nimport { EmptyVariableSet } from './defaults';\n\nexport type CustomFormatterFn = (\n value: unknown,\n legacyVariableModel: Partial<VariableModel>,\n legacyDefaultFormatter?: CustomFormatterFn\n) => string;\n\n/**\n * This function will try to parse and replace any variable expression found in the target string. The sceneObject will be used as the source of variables. It will\n * use the scene graph and walk up the parent tree until it finds the closest variable.\n *\n * ScopedVars should not really be needed much in the new scene architecture as they can be added to the local scene node instead of passed in interpolate function.\n * It is supported here for backward compatibility and some edge cases where adding scoped vars to local scene node is not practical.\n */\nexport function sceneInterpolator(\n sceneObject: SceneObject,\n target: string | undefined | null,\n getVariables: (sceneObject: SceneObject) => SceneVariables,\n scopedVars?: ScopedVars,\n format?: string | CustomFormatterFn\n): string {\n if (!target) {\n return target ?? '';\n }\n\n // Skip any interpolation if there are no variables in the scene object graph\n if (getVariables(sceneObject) === EmptyVariableSet) {\n return target;\n }\n\n VARIABLE_REGEX.lastIndex = 0;\n\n return target.replace(VARIABLE_REGEX, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {\n const variableName = var1 || var2 || var3;\n const fmt = fmt2 || fmt3 || format;\n let variable: FormatVariable | undefined | null;\n\n if (scopedVars && scopedVars[variableName]) {\n variable = getSceneVariableForScopedVar(variableName, scopedVars[variableName]);\n } else {\n variable = lookupSceneVariable(variableName, sceneObject);\n }\n\n if (!variable) {\n return match;\n }\n\n return formatValue(variable, variable.getValue(fieldPath), fmt);\n });\n}\n\nfunction lookupSceneVariable(name: string, sceneObject: SceneObject): FormatVariable | null | undefined {\n const variables = sceneObject.state.$variables;\n if (!variables) {\n if (sceneObject.parent) {\n return lookupSceneVariable(name, sceneObject.parent);\n } else {\n return null;\n }\n }\n\n const found = variables.getByName(name);\n if (found) {\n return found;\n } else if (sceneObject.parent) {\n return lookupSceneVariable(name, sceneObject.parent);\n }\n\n return null;\n}\n\nfunction formatValue(\n variable: FormatVariable,\n value: VariableValue | undefined | null,\n formatNameOrFn: string | CustomFormatterFn\n): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n // Special handling for custom values that should not be formatted / escaped\n // This is used by the custom allValue that usually contain wildcards and therefore should not be escaped\n if (typeof value === 'object' && 'isCustomValue' in value && formatNameOrFn !== FormatRegistryID.text) {\n return value.toString();\n }\n\n // if (isAdHoc(variable) && format !== FormatRegistryID.queryParam) {\n // return '';\n // }\n\n // if it's an object transform value to string\n if (!Array.isArray(value) && typeof value === 'object') {\n value = `${value}`;\n }\n\n if (typeof formatNameOrFn === 'function') {\n return formatNameOrFn(value, {\n name: variable.state.name,\n type: variable.state.type as VariableType,\n });\n }\n\n let args: string[] = [];\n\n if (!formatNameOrFn) {\n formatNameOrFn = FormatRegistryID.glob;\n } else {\n // some formats have arguments that come after ':' character\n args = formatNameOrFn.split(':');\n if (args.length > 1) {\n formatNameOrFn = args[0];\n args = args.slice(1);\n } else {\n args = [];\n }\n }\n\n let formatter = formatRegistry.getIfExists(formatNameOrFn);\n\n if (!formatter) {\n console.error(`Variable format ${formatNameOrFn} not found. Using glob format as fallback.`);\n formatter = formatRegistry.get(FormatRegistryID.glob);\n }\n\n return formatter.formatter(value, args, variable);\n}\n"],"names":[],"mappings":"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"}