Repository: VolkovLabs/volkovlabs-dynamictext-panel
Pull request #304 (2024-04-30 14:06:23)

Prepare for Grafana 11
Resolves: #293 

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/VolkovLabs/volkovlabs-dynamictext-panel/pull/304?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VolkovLabs) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 98.98%. Comparing base [(`cf88dc7`)](https://app.codecov.io/gh/VolkovLabs/volkovlabs-dynamictext-panel/commit/cf88dc7de09ae68fff017a905f52c58727f0b88b?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VolkovLabs) to head [(`ce0f98d`)](https://app.codecov.io/gh/VolkovLabs/volkovlabs-dynamictext-panel/pull/304?dropdown=coverage&src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VolkovLabs).


<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main     #304      +/-   ##
==========================================
+ Coverage   98.92%   98.98%   +0.06%     
==========================================
  Files          35       35              
  Lines         463      492      +29     
  Branches       60       85      +25     
==========================================
+ Hits          458      487      +29     
  Misses          5        5              
```



</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/VolkovLabs/volkovlabs-dynamictext-panel/pull/304?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VolkovLabs).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VolkovLabs).


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4a4efc9..4e546cf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,9 +2,16 @@
 
 ## 5.0.0 (IN PROGRESS)
 
+### Breaking changes
+
+- Requires Grafana 10 and Grafana 11
+- Removed non-context code parameters. Please update parameters to use `context`.
+
 ### Features / Enhancements
 
-- Add plugin e2e tests and remove cypress (#301)
+- Added plugin e2e tests and remove cypress (#301)
+- Updated name to Business Text Panel (#304)
+- Prepared for Grafana 11 (#304)
 
 ## 4.5.0 (2024-03-13)
 
diff --git a/README.md b/README.md
index 2decabf..a06f476 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Dynamic Text Panel for Grafana
+# Business Text Panel for Grafana
 
 ![Text](https://github.com/VolkovLabs/volkovlabs-dynamictext-panel/raw/main/src/img/screenshot.png)
 
@@ -10,21 +10,22 @@
 
 ## Introduction
 
-Dynamic Text Panel is a Grafana visualization plugin that converts plain text and table data into visually appealing, easy-to-read information cards.
+Business Text Panel is a Grafana visualization plugin that converts plain text and table data into visually appealing, easy-to-read information cards.
 
-The Dynamic Text Panel plugin allows you to construct a text visualization template from the values of a dataset returned by a data source query.
+The Business Text Panel plugin allows you to construct a text visualization template from the values of a dataset returned by a data source query.
 
-[![Dynamic Text plugin for Grafana | Use HTML, Markdown, JavaScript and CSS | Community use cases](https://raw.githubusercontent.com/volkovlabs/volkovlabs-dynamictext-panel/main/img/video.png)](https://youtu.be/AcQi-6GCrNU)
+[![Business Text plugin for Grafana | Use HTML, Markdown, JavaScript and CSS | Community use cases](https://raw.githubusercontent.com/volkovlabs/volkovlabs-dynamictext-panel/main/img/video.png)](https://youtu.be/AcQi-6GCrNU)
 
 ## Requirements
 
+- Business Text Panel 5.X requires **Grafana 10** or **Grafana 11**.
 - Dynamic Text Panel 4.X requires **Grafana 9.2** or **Grafana 10**.
 - Dynamic Text Panel 2.X and 3.X require **Grafana 8.5** or **Grafana 9**.
 - Dynamic Text Panel 1.X requires **Grafana 7**.
 
 ## Getting Started
 
-You can install Dynamic Text Panel from the [Grafana Plugins catalog](https://grafana.com/grafana/plugins/marcusolsson-dynamictext-panel/) or using the Grafana command line tool.
+You can install the Business Text Panel from the [Grafana Plugins catalog](https://grafana.com/grafana/plugins/marcusolsson-dynamictext-panel/) or using the Grafana command line tool.
 
 For the latter, please use the following command:
 
diff --git a/package-lock.json b/package-lock.json
index 194fd4e..72ee21f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -25,6 +25,7 @@
         "react": "^18.2.0",
         "react-beautiful-dnd": "^13.1.1",
         "react-dom": "^18.2.0",
+        "semver": "^7.6.0",
         "tslib": "^2.6.2",
         "uuid": "^9.0.1"
       },
@@ -151,6 +152,15 @@
         "url": "https://opencollective.com/babel"
       }
     },
+    "node_modules/@babel/core/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/@babel/generator": {
       "version": "7.23.6",
       "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
@@ -194,6 +204,15 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/@babel/helper-create-class-features-plugin": {
       "version": "7.24.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz",
@@ -217,6 +236,15 @@
         "@babel/core": "^7.0.0"
       }
     },
+    "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/@babel/helper-environment-visitor": {
       "version": "7.22.20",
       "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
@@ -1425,39 +1453,6 @@
         "@playwright/test": "^1.41.2"
       }
     },
-    "node_modules/@grafana/plugin-e2e/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@grafana/plugin-e2e/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@grafana/plugin-e2e/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/@grafana/runtime": {
       "version": "10.4.0",
       "resolved": "https://registry.npmjs.org/@grafana/runtime/-/runtime-10.4.0.tgz",
@@ -4063,39 +4058,6 @@
         }
       }
     },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/@typescript-eslint/parser": {
       "version": "6.18.1",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.1.tgz",
@@ -4209,39 +4171,6 @@
         }
       }
     },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/@typescript-eslint/utils": {
       "version": "6.18.1",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz",
@@ -4267,39 +4196,6 @@
         "eslint": "^7.0.0 || ^8.0.0"
       }
     },
-    "node_modules/@typescript-eslint/utils/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/utils/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@typescript-eslint/utils/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/@typescript-eslint/visitor-keys": {
       "version": "6.18.1",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz",
@@ -5076,6 +4972,15 @@
         "node": ">=8"
       }
     },
+    "node_modules/babel-plugin-istanbul/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/babel-plugin-jest-hoist": {
       "version": "29.6.3",
       "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
@@ -5889,39 +5794,6 @@
         }
       }
     },
-    "node_modules/css-loader/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/css-loader/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/css-loader/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/css-tree": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
@@ -7088,39 +6960,6 @@
         "eslint": "^7.0.0 || ^8.0.0"
       }
     },
-    "node_modules/eslint-plugin-jsdoc/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/eslint-plugin-jsdoc/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/eslint-plugin-jsdoc/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/eslint-plugin-react": {
       "version": "7.33.2",
       "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
@@ -7214,6 +7053,15 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/eslint-plugin-react/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/eslint-plugin-simple-import-sort": {
       "version": "10.0.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz",
@@ -7984,18 +7832,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -8026,21 +7862,6 @@
         "url": "https://opencollective.com/webpack"
       }
     },
-    "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -8053,12 +7874,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/fs-monkey": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz",
@@ -9374,39 +9189,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/istanbul-lib-instrument/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/istanbul-lib-instrument/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/istanbul-lib-instrument/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/istanbul-lib-report": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
@@ -9430,18 +9212,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/istanbul-lib-report/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/istanbul-lib-report/node_modules/make-dir": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
@@ -9457,21 +9227,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/istanbul-lib-report/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/istanbul-lib-report/node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -9484,12 +9239,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/istanbul-lib-report/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/istanbul-lib-source-maps": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
@@ -11129,18 +10878,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/jest-snapshot/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/jest-snapshot/node_modules/pretty-format": {
       "version": "29.7.0",
       "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
@@ -11173,21 +10910,6 @@
       "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
       "dev": true
     },
-    "node_modules/jest-snapshot/node_modules/semver": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
-      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/jest-snapshot/node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -11200,12 +10922,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/jest-snapshot/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/jest-util": {
       "version": "29.7.0",
       "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
@@ -14298,14 +14014,35 @@
       "integrity": "sha512-C+6PCOO55NLCfS8uQjUKV/6E5XMuUcfOVsix5m0QqCCCKi495NgeQVNfWtAaD71NKHsdmFCJoXUGfir3qWdr9A=="
     },
     "node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
+      "version": "7.6.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+      "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
       "bin": {
         "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/semver/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
+    "node_modules/semver/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
     "node_modules/serialize-javascript": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
diff --git a/package.json b/package.json
index 53dfaf6..a7bbd92 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,7 @@
     "react": "^18.2.0",
     "react-beautiful-dnd": "^13.1.1",
     "react-dom": "^18.2.0",
+    "semver": "^7.6.0",
     "tslib": "^2.6.2",
     "uuid": "^9.0.1"
   },
diff --git a/provisioning/dashboards/events.json b/provisioning/dashboards/events.json
index b315cfc..beee833 100644
--- a/provisioning/dashboards/events.json
+++ b/provisioning/dashboards/events.json
@@ -221,7 +221,7 @@
         },
         "editors": ["helpers"],
         "everyRow": false,
-        "helpers": "const subscription = eventBus.subscribe({ type: \"theme-changed\" }, () => {\n  console.log(\"React to Theme Changed\");\n});\n\nconst subscription2 = eventBus.subscribe({ type: 'data-hover' }, (data) => {\n  console.log('React to Data Hover', data);\n});\n\nconsole.log(subscription);\n\nreturn () => {\n  subscription.unsubscribe();\n  subscription2.unsubscribe();\n  console.log(\"Unsubscribed\");\n}\n",
+        "helpers": "const subscription = context.grafana.eventBus.subscribe({ type: \"theme-changed\" }, () => {\n  console.log(\"React to Theme Changed\");\n});\n\nconst subscription2 = context.grafana.eventBus.subscribe({ type: 'data-hover' }, (data) => {\n  console.log('React to Data Hover', data);\n});\n\nconsole.log(subscription);\n\nreturn () => {\n  subscription.unsubscribe();\n  subscription2.unsubscribe();\n  console.log(\"Unsubscribed\");\n}\n",
         "styles": ""
       },
       "targets": [
@@ -259,7 +259,7 @@
         },
         "editors": ["helpers"],
         "everyRow": false,
-        "helpers": "eventBus.publish({ type: 'data-hover' })",
+        "helpers": "context.grafana.eventBus.publish({ type: 'data-hover' })",
         "styles": ""
       },
       "targets": [
diff --git a/provisioning/dashboards/panels.json b/provisioning/dashboards/panels.json
index aafe762..599916b 100644
--- a/provisioning/dashboards/panels.json
+++ b/provisioning/dashboards/panels.json
@@ -138,12 +138,12 @@
         "editors": [],
         "externalScripts": [],
         "externalStyles": [],
-        "helpers": "handlebars.registerHelper('replace',\n  (context, pattern, replacement) => context.replace(pattern, replacement));\n",
+        "helpers": "context.handlebars.registerHelper('replace',\n  (context, pattern, replacement) => context.replace(pattern, replacement));\n",
         "renderMode": "everyRow",
         "styles": "",
         "wrap": true
       },
-      "pluginVersion": "4.4.0",
+      "pluginVersion": "6.4.0",
       "targets": [
         {
           "datasource": {
@@ -157,9 +157,7 @@
                 "config": {},
                 "name": "Test",
                 "type": "string",
-                "values": [
-                  "Here is the Pattern to replace"
-                ]
+                "values": ["Here is the Pattern to replace"]
               }
             ],
             "meta": {},
@@ -294,33 +292,25 @@
                 "config": {},
                 "name": "app",
                 "type": "string",
-                "values": [
-                  "auth"
-                ]
+                "values": ["auth"]
               },
               {
                 "config": {},
                 "name": "description",
                 "type": "string",
-                "values": [
-                  "Handles user authentication."
-                ]
+                "values": ["Handles user authentication."]
               },
               {
                 "config": {},
                 "name": "cluster",
                 "type": "string",
-                "values": [
-                  "prod"
-                ]
+                "values": ["prod"]
               },
               {
                 "config": {},
                 "name": "tier",
                 "type": "string",
-                "values": [
-                  "frontend"
-                ]
+                "values": ["frontend"]
               }
             ],
             "meta": {},
@@ -394,9 +384,7 @@
                 "config": {},
                 "name": "test",
                 "type": "string",
-                "values": [
-                  "test"
-                ]
+                "values": ["test"]
               }
             ],
             "meta": {},
@@ -415,9 +403,7 @@
                 "config": {},
                 "name": "test",
                 "type": "string",
-                "values": [
-                  "test2"
-                ]
+                "values": ["test2"]
               }
             ],
             "meta": {},
@@ -470,9 +456,7 @@
           "height": 100,
           "language": "markdown"
         },
-        "editors": [
-          "styles"
-        ],
+        "editors": ["styles"],
         "externalScripts": [],
         "externalStyles": [],
         "helpers": "",
@@ -554,9 +538,7 @@
                 "config": {},
                 "name": "test",
                 "type": "string",
-                "values": [
-                  "Hello"
-                ]
+                "values": ["Hello"]
               }
             ],
             "meta": {},
@@ -608,9 +590,7 @@
           "height": 400,
           "language": "html"
         },
-        "editors": [
-          "styles"
-        ],
+        "editors": ["styles"],
         "externalScripts": [],
         "externalStyles": [],
         "handlebars": "",
@@ -633,73 +613,49 @@
                 "config": {},
                 "name": "Id",
                 "type": "number",
-                "values": [
-                  1,
-                  2
-                ]
+                "values": [1, 2]
               },
               {
                 "config": {},
                 "name": "first_name",
                 "type": "string",
-                "values": [
-                  "John",
-                  "Jessica"
-                ]
+                "values": ["John", "Jessica"]
               },
               {
                 "config": {},
                 "name": "last_name",
                 "type": "string",
-                "values": [
-                  "Smith",
-                  "Johnson"
-                ]
+                "values": ["Smith", "Johnson"]
               },
               {
                 "config": {},
                 "name": "login",
                 "type": "string",
-                "values": [
-                  "j.smith",
-                  "j.johnson"
-                ]
+                "values": ["j.smith", "j.johnson"]
               },
               {
                 "config": {},
                 "name": "last_login_date",
                 "type": "time",
-                "values": [
-                  1667444288509,
-                  1667242005907
-                ]
+                "values": [1667444288509, 1667242005907]
               },
               {
                 "config": {},
                 "name": "status",
                 "type": "string",
-                "values": [
-                  "active",
-                  "not active"
-                ]
+                "values": ["active", "not active"]
               },
               {
                 "config": {},
                 "name": "role",
                 "type": "string",
-                "values": [
-                  "admin",
-                  "analyst"
-                ]
+                "values": ["admin", "analyst"]
               },
               {
                 "config": {},
                 "name": "email",
                 "type": "string",
-                "values": [
-                  "j.smith@company.io",
-                  "j.johnson@company.io"
-                ]
+                "values": ["j.smith@company.io", "j.johnson@company.io"]
               },
               {
                 "config": {},
@@ -782,9 +738,7 @@
                 "config": {},
                 "name": "test",
                 "type": "string",
-                "values": [
-                  "test"
-                ]
+                "values": ["test"]
               }
             ],
             "meta": {},
@@ -803,9 +757,7 @@
                 "config": {},
                 "name": "test",
                 "type": "string",
-                "values": [
-                  "test2"
-                ]
+                "values": ["test2"]
               }
             ],
             "meta": {},
@@ -947,7 +899,7 @@
         "styles": "",
         "wrap": true
       },
-      "pluginVersion": "4.4.0",
+      "pluginVersion": "6.4.0",
       "targets": [
         {
           "datasource": {
@@ -1018,9 +970,7 @@
           "height": 200,
           "language": "html"
         },
-        "editors": [
-          "styles"
-        ],
+        "editors": ["styles"],
         "externalScripts": [],
         "externalStyles": [],
         "helpers": "",
@@ -1041,9 +991,7 @@
                 "config": {},
                 "name": "Value",
                 "type": "string",
-                "values": [
-                  ""
-                ]
+                "values": [""]
               }
             ],
             "meta": {}
@@ -1064,12 +1012,8 @@
       {
         "current": {
           "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
+          "text": ["All"],
+          "value": ["$__all"]
         },
         "hide": 0,
         "includeAll": true,
diff --git a/src/components/Text/Text.tsx b/src/components/Text/Text.tsx
index ac4b60f..4783628 100644
--- a/src/components/Text/Text.tsx
+++ b/src/components/Text/Text.tsx
@@ -181,7 +181,7 @@ export const Text: React.FC<Props> = ({
         const templateData = frames.map((frame) =>
           frame.fields.reduce(
             (acc, { config, name, values, display }) => {
-              values.toArray().forEach((value, i) => {
+              values.forEach((value, i) => {
                 /**
                  * Status Color
                  */
diff --git a/src/constants/editor.ts b/src/constants/editor.ts
index 50f12b2..b07bc77 100644
--- a/src/constants/editor.ts
+++ b/src/constants/editor.ts
@@ -1,4 +1,4 @@
-import { CodeEditorSuggestionItem, CodeEditorSuggestionItemKind } from '@grafana/ui';
+import { CodeEditorSuggestionItem } from '@grafana/ui';
 
 import { afterRenderCodeParameters, beforeRenderCodeParameters } from '../helpers';
 
@@ -41,63 +41,7 @@ export const FORMAT_OPTIONS = [
 /**
  * Helpers Suggestions
  */
-export const HELPERS_EDITOR_SUGGESTIONS: CodeEditorSuggestionItem[] = [
-  {
-    label: 'data',
-    kind: CodeEditorSuggestionItemKind.Property,
-    detail: 'Result set of panel queries.',
-  },
-  {
-    label: 'handlebars',
-    kind: CodeEditorSuggestionItemKind.Property,
-    detail: 'Handlebars library.',
-  },
-  {
-    label: 'getLocale',
-    kind: CodeEditorSuggestionItemKind.Method,
-    detail: 'Returns locale.',
-  },
-  {
-    label: 'timeRange',
-    kind: CodeEditorSuggestionItemKind.Property,
-    detail: 'Selected time range.',
-  },
-  {
-    label: 'timeZone',
-    kind: CodeEditorSuggestionItemKind.Property,
-    detail: 'Selected time zone.',
-  },
-  {
-    label: 'locationService',
-    kind: CodeEditorSuggestionItemKind.Property,
-    detail: 'Browser location and history.',
-  },
-  {
-    label: 'replaceVariables',
-    kind: CodeEditorSuggestionItemKind.Method,
-    detail: 'Interpolate variables.',
-  },
-  {
-    label: 'eventBus',
-    kind: CodeEditorSuggestionItemKind.Property,
-    detail: 'Panels events.',
-  },
-  {
-    label: 'dataFrame',
-    kind: CodeEditorSuggestionItemKind.Constant,
-    detail: 'Selected data frame.',
-  },
-  {
-    label: 'panelData',
-    kind: CodeEditorSuggestionItemKind.Constant,
-    detail: 'Panel data.',
-  },
-
-  /**
-   * Context Suggestions
-   */
-  ...beforeRenderCodeParameters.suggestions,
-];
+export const HELPERS_EDITOR_SUGGESTIONS: CodeEditorSuggestionItem[] = beforeRenderCodeParameters.suggestions;
 
 /**
  * After Render Editor Suggestions
diff --git a/src/helpers/html.ts b/src/helpers/html.ts
index 5af4ba7..fdb1df6 100644
--- a/src/helpers/html.ts
+++ b/src/helpers/html.ts
@@ -82,35 +82,12 @@ export const generateHtml = ({
    * Add Custom Helpers
    */
   if (helpers) {
-    const func = new Function(
-      'data',
-      'handlebars',
-      'getLocale',
-      'timeZone',
-      'timeRange',
-      'replaceVariables',
-      'locationService',
-      'eventBus',
-      'panelData',
-      'dataFrame',
-      'context',
-      helpers
-    );
+    const func = new Function('context', helpers);
 
     /**
      * Unsubscribe
      */
     unsubscribe = func(
-      data,
-      handlebars,
-      getLocale,
-      timeZone,
-      timeRange,
-      replaceVariables,
-      locationService,
-      eventBus,
-      panelData,
-      dataFrame,
       beforeRenderCodeParameters.create({
         data,
         handlebars: handlebars,
diff --git a/src/migration.ts b/src/migration.ts
index d1d9d6b..030a6e4 100644
--- a/src/migration.ts
+++ b/src/migration.ts
@@ -1,4 +1,5 @@
 import { PanelModel } from '@grafana/data';
+import semver from 'semver';
 
 import { PanelOptions, RenderMode } from './types';
 
@@ -14,6 +15,51 @@ interface OutdatedPanelOptions {
   everyRow?: boolean;
 }
 
+/**
+ * Normalize Helpers Option
+ */
+const normalizeHelpersOption = (code: string): string => {
+  const search =
+    /(handlebars|panelData|dataFrame\.|data.|getLocale\(|timezone|timeRange|eventBus|locationService|replaceVariables\()/gm;
+  return code.replace(search, (value) => {
+    switch (value) {
+      case 'data.': {
+        return 'context.data.';
+      }
+      case 'handlebars': {
+        return 'context.handlebars';
+      }
+      case 'dataFrame.': {
+        return 'context.dataFrame.';
+      }
+      case 'panelData': {
+        return 'context.panelData';
+      }
+      case 'getLocale(': {
+        return 'context.grafana.getLocale(';
+      }
+      case 'timezone': {
+        return 'context.grafana.timezone';
+      }
+      case 'timeRange': {
+        return 'context.grafana.timeRange';
+      }
+      case 'eventBus': {
+        return 'context.grafana.eventBus';
+      }
+      case 'locationService': {
+        return 'context.grafana.locationService';
+      }
+      case 'replaceVariables(': {
+        return 'context.grafana.replaceVariables(';
+      }
+      default: {
+        return value;
+      }
+    }
+  });
+};
+
 /**
  * Get Migrated Options
  * @param panel
@@ -21,6 +67,13 @@ interface OutdatedPanelOptions {
 export const getMigratedOptions = (panel: PanelModel<OutdatedPanelOptions & PanelOptions>): PanelOptions => {
   const { everyRow, ...actualOptions } = panel.options;
 
+  /**
+   * Normalize non context code parameters before 5.0.0
+   */
+  if (panel.pluginVersion && semver.lt(panel.pluginVersion, '5.0.0')) {
+    actualOptions.helpers = normalizeHelpersOption(actualOptions.helpers);
+  }
+
   /**
    * Normalize every row
    */
diff --git a/src/plugin.json b/src/plugin.json
index 8ec9bf5..0f53864 100644
--- a/src/plugin.json
+++ b/src/plugin.json
@@ -1,7 +1,7 @@
 {
   "$schema": "https://github.com/grafana/grafana/raw/main/docs/sources/developers/plugins/plugin.schema.json",
   "dependencies": {
-    "grafanaDependency": ">=9.2.0",
+    "grafanaDependency": ">=10.0.0",
     "plugins": []
   },
   "id": "marcusolsson-dynamictext-panel",
@@ -35,6 +35,6 @@
     "updated": "%TODAY%",
     "version": "%VERSION%"
   },
-  "name": "Dynamic Text",
+  "name": "Business Text",
   "type": "panel"
 }


Test patch:
diff --git a/src/components/TextPanel/TextPanel.test.tsx b/src/components/TextPanel/TextPanel.test.tsx
index ee366a7..5d4cfba 100644
--- a/src/components/TextPanel/TextPanel.test.tsx
+++ b/src/components/TextPanel/TextPanel.test.tsx
@@ -216,7 +216,7 @@ describe('Panel', () => {
 
   describe('Helpers execution', () => {
     const helpers = `
-      const subscription = eventBus.subscribe('event', () => {});
+      const subscription = context.grafana.eventBus.subscribe('event', () => {});
       
       return () => {
         subscription.unsubscribe();
diff --git a/src/migration.test.ts b/src/migration.test.ts
index fc2f614..b35c022 100644
--- a/src/migration.test.ts
+++ b/src/migration.test.ts
@@ -26,4 +26,114 @@ describe('Migration', () => {
       );
     });
   });
+
+  describe('5.0.0', () => {
+    describe('helpers', () => {
+      it.each([
+        {
+          name: 'data',
+          initial: `
+          const data = [];
+          data.series.forEach();
+          `,
+          expected: `
+          const data = [];
+          context.data.series.forEach();
+          `,
+        },
+        {
+          name: 'handlebars',
+          initial: `
+          const helpers = handlebars.helpers;
+          `,
+          expected: `
+          const helpers = context.handlebars.helpers;
+          `,
+        },
+        {
+          name: 'panelData',
+          initial: `
+          const state = panelData.state;
+          `,
+          expected: `
+          const state = context.panelData.state;
+          `,
+        },
+        {
+          name: 'dataFrame',
+          initial: `
+          const id = dataFrame.refId
+          `,
+          expected: `
+          const id = context.dataFrame.refId
+          `,
+        },
+        {
+          name: 'timezone',
+          initial: `
+          const zone = timezone
+          `,
+          expected: `
+          const zone = context.grafana.timezone
+          `,
+        },
+        {
+          name: 'timeRange',
+          initial: `
+          const zoneRaw = timeRange.raw
+          `,
+          expected: `
+          const zoneRaw = context.grafana.timeRange.raw
+          `,
+        },
+        {
+          name: 'locale',
+          initial: `
+          const locale = getLocale();
+          `,
+          expected: `
+          const locale = context.grafana.getLocale();
+          `,
+        },
+        {
+          name: 'grafana.replaceVariables',
+          initial: `
+          const replaceVariables = () => {};
+          replaceVariables('123')
+          `,
+          expected: `
+          const replaceVariables = () => {};
+          context.grafana.replaceVariables('123')
+          `,
+        },
+        {
+          name: 'grafana.eventBus',
+          initial: `
+          eventBus.subscribe();
+          `,
+          expected: `
+          context.grafana.eventBus.subscribe();
+          `,
+        },
+        {
+          name: 'grafana.locationService',
+          initial: `
+          locationService.replace()
+          `,
+          expected: `
+          context.grafana.locationService.replace()
+          `,
+        },
+      ])('Should migrate $name', ({ initial, expected }) => {
+        expect(
+          getMigratedOptions({
+            pluginVersion: '4.8.0',
+            options: {
+              helpers: initial,
+            },
+          } as any).helpers
+        ).toEqual(expected);
+      });
+    });
+  });
 });