@grafana/plugin-ui 0.17.6 → 0.17.9

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.
@@ -7,6 +7,7 @@ function getRequestLooper(req, options) {
7
7
  return new Observable((subscriber) => {
8
8
  let nextQuery = void 0;
9
9
  let subscription = void 0;
10
+ let timeoutId = void 0;
10
11
  let loadingState = LoadingState.Loading;
11
12
  let nextRequestDelay = 1;
12
13
  let count = 1;
@@ -50,7 +51,7 @@ function getRequestLooper(req, options) {
50
51
  }
51
52
  if (nextQuery) {
52
53
  const next = nextQuery;
53
- setTimeout(() => {
54
+ timeoutId = setTimeout(() => {
54
55
  subscription = options.query({ ...req, requestId: `${req.requestId}.${++count}`, targets: [next] }).subscribe(observer);
55
56
  nextQuery = void 0;
56
57
  }, nextRequestDelay * DELAY_INTERVAL_MS);
@@ -61,7 +62,8 @@ function getRequestLooper(req, options) {
61
62
  };
62
63
  subscription = options.query(req).subscribe(observer);
63
64
  return function unsubscribe() {
64
- observer.complete();
65
+ clearTimeout(timeoutId);
66
+ subscription == null ? void 0 : subscription.unsubscribe();
65
67
  if (nextQuery || shouldCancel) {
66
68
  options.onCancel();
67
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"requestLooper.js","sources":["../../../src/async-query-data/requestLooper.ts"],"sourcesContent":["import {\n LoadingState,\n type DataFrame,\n type DataQuery,\n type DataQueryRequest,\n type DataQueryResponse,\n} from '@grafana/data';\nimport { Observable, type Subscription, type Observer } from 'rxjs';\n\nexport interface RequestLoopOptions<TQuery extends DataQuery = DataQuery> {\n /**\n * If the response needs an additional request to execute, return it here\n */\n getNextQuery: (rsp: DataQueryResponse) => TQuery | undefined;\n\n /**\n * The datasource execute method\n */\n query: (req: DataQueryRequest<TQuery>) => Observable<DataQueryResponse>;\n\n /**\n * Process the results\n */\n process: (data: DataFrame[]) => DataFrame[];\n\n /**\n * Check if the query should be cancelled\n */\n shouldCancel: () => boolean;\n\n /**\n * Callback that gets executed when unsubscribed\n */\n onCancel: () => void;\n}\n\nconst DELAY_INTERVAL_MS = 10;\nconst MAX_NEXT_REQUEST_DELAY = 10000 / DELAY_INTERVAL_MS; // 10 seconds maximum delay between requests\n\n/**\n * Continue executing requests as long as `getNextQuery` returns a query\n */\nexport function getRequestLooper<T extends DataQuery = DataQuery>(\n req: DataQueryRequest<T>,\n options: RequestLoopOptions<T>\n): Observable<DataQueryResponse> {\n return new Observable<DataQueryResponse>((subscriber) => {\n let nextQuery: T | undefined = undefined;\n let subscription: Subscription | undefined = undefined;\n let loadingState: LoadingState | undefined = LoadingState.Loading;\n let nextRequestDelay = 1; // number of DELAY_INTERVAL_MS to wait before the next request\n let count = 1;\n let shouldCancel = false;\n\n // Single observer gets reused for each request\n const observer: Observer<DataQueryResponse> = {\n next: (rsp: DataQueryResponse) => {\n loadingState = rsp.state;\n let checkstate = false;\n if (loadingState !== LoadingState.Error) {\n nextQuery = options.getNextQuery(rsp);\n const _shouldCancel = options.shouldCancel();\n\n if (nextQuery && _shouldCancel) {\n // `shouldCancel` is set here only if there is a `nextQuery`, otherwise\n // we would try to cancel a finished query in the cleanup function\n shouldCancel = _shouldCancel;\n nextQuery = undefined;\n }\n\n checkstate = true;\n }\n const data = options.process(rsp.data);\n\n // Set the loading status to show a spinner if loading or to show data if streaming.\n if (checkstate) {\n if (nextQuery) {\n if (data.length && data[0].length) {\n loadingState = LoadingState.Streaming;\n } else {\n loadingState = LoadingState.Loading;\n }\n // Calculate the number of DELAY_INTERVAL_MS to wait before the next request.\n // Caps it so the delay is not more than 10s\n nextRequestDelay =\n nextRequestDelay * 2 > MAX_NEXT_REQUEST_DELAY ? MAX_NEXT_REQUEST_DELAY : nextRequestDelay * 2;\n } else {\n loadingState = LoadingState.Done;\n nextRequestDelay = 0;\n }\n }\n subscriber.next({ ...rsp, data, state: loadingState, key: req.requestId });\n },\n error: (err) => {\n subscriber.error(err);\n },\n complete: () => {\n // We unsubscribe from the internal subscription after completing a request\n if (subscription) {\n subscription.unsubscribe();\n subscription = undefined;\n }\n\n // Queues up a new request if the current query is still in a running state.\n // The timeout is set in the `next` callback.\n if (nextQuery) {\n const next = nextQuery;\n setTimeout(() => {\n subscription = options\n .query({ ...req, requestId: `${req.requestId}.${++count}`, targets: [next] })\n .subscribe(observer);\n nextQuery = undefined;\n }, nextRequestDelay * DELAY_INTERVAL_MS);\n } else {\n subscriber.complete();\n }\n },\n };\n\n // This runs the initial query, subsequent queries are run in the `complete` callback of the observer.\n subscription = options.query(req).subscribe(observer);\n\n // Cleanup function\n return function unsubscribe() {\n observer.complete();\n if (nextQuery || shouldCancel) {\n options.onCancel();\n }\n nextQuery = undefined;\n };\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"requestLooper.js","sources":["../../../src/async-query-data/requestLooper.ts"],"sourcesContent":["import {\n LoadingState,\n type DataFrame,\n type DataQuery,\n type DataQueryRequest,\n type DataQueryResponse,\n} from '@grafana/data';\nimport { Observable, type Subscription, type Observer } from 'rxjs';\n\nexport interface RequestLoopOptions<TQuery extends DataQuery = DataQuery> {\n /**\n * If the response needs an additional request to execute, return it here\n */\n getNextQuery: (rsp: DataQueryResponse) => TQuery | undefined;\n\n /**\n * The datasource execute method\n */\n query: (req: DataQueryRequest<TQuery>) => Observable<DataQueryResponse>;\n\n /**\n * Process the results\n */\n process: (data: DataFrame[]) => DataFrame[];\n\n /**\n * Check if the query should be cancelled\n */\n shouldCancel: () => boolean;\n\n /**\n * Callback that gets executed when unsubscribed\n */\n onCancel: () => void;\n}\n\nconst DELAY_INTERVAL_MS = 10;\nconst MAX_NEXT_REQUEST_DELAY = 10000 / DELAY_INTERVAL_MS; // 10 seconds maximum delay between requests\n\n/**\n * Continue executing requests as long as `getNextQuery` returns a query\n */\nexport function getRequestLooper<T extends DataQuery = DataQuery>(\n req: DataQueryRequest<T>,\n options: RequestLoopOptions<T>\n): Observable<DataQueryResponse> {\n return new Observable<DataQueryResponse>((subscriber) => {\n let nextQuery: T | undefined = undefined;\n let subscription: Subscription | undefined = undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\n let loadingState: LoadingState | undefined = LoadingState.Loading;\n let nextRequestDelay = 1; // number of DELAY_INTERVAL_MS to wait before the next request\n let count = 1;\n let shouldCancel = false;\n\n // Single observer gets reused for each request\n const observer: Observer<DataQueryResponse> = {\n next: (rsp: DataQueryResponse) => {\n loadingState = rsp.state;\n let checkstate = false;\n if (loadingState !== LoadingState.Error) {\n nextQuery = options.getNextQuery(rsp);\n const _shouldCancel = options.shouldCancel();\n\n if (nextQuery && _shouldCancel) {\n // `shouldCancel` is set here only if there is a `nextQuery`, otherwise\n // we would try to cancel a finished query in the cleanup function\n shouldCancel = _shouldCancel;\n nextQuery = undefined;\n }\n\n checkstate = true;\n }\n const data = options.process(rsp.data);\n\n // Set the loading status to show a spinner if loading or to show data if streaming.\n if (checkstate) {\n if (nextQuery) {\n if (data.length && data[0].length) {\n loadingState = LoadingState.Streaming;\n } else {\n loadingState = LoadingState.Loading;\n }\n // Calculate the number of DELAY_INTERVAL_MS to wait before the next request.\n // Caps it so the delay is not more than 10s\n nextRequestDelay =\n nextRequestDelay * 2 > MAX_NEXT_REQUEST_DELAY ? MAX_NEXT_REQUEST_DELAY : nextRequestDelay * 2;\n } else {\n loadingState = LoadingState.Done;\n nextRequestDelay = 0;\n }\n }\n subscriber.next({ ...rsp, data, state: loadingState, key: req.requestId });\n },\n error: (err) => {\n subscriber.error(err);\n },\n complete: () => {\n // We unsubscribe from the internal subscription after completing a request\n if (subscription) {\n subscription.unsubscribe();\n subscription = undefined;\n }\n\n // Queues up a new request if the current query is still in a running state.\n // The timeout is set in the `next` callback.\n if (nextQuery) {\n const next = nextQuery;\n timeoutId = setTimeout(() => {\n subscription = options\n .query({ ...req, requestId: `${req.requestId}.${++count}`, targets: [next] })\n .subscribe(observer);\n nextQuery = undefined;\n }, nextRequestDelay * DELAY_INTERVAL_MS);\n } else {\n subscriber.complete();\n }\n },\n };\n\n // This runs the initial query, subsequent queries are run in the `complete` callback of the observer.\n subscription = options.query(req).subscribe(observer);\n\n // Cleanup function\n return function unsubscribe() {\n clearTimeout(timeoutId);\n subscription?.unsubscribe();\n if (nextQuery || shouldCancel) {\n options.onCancel();\n }\n nextQuery = undefined;\n };\n });\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafana/plugin-ui",
3
- "version": "0.17.6",
3
+ "version": "0.17.9",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+ssh://git@github.com/grafana/plugin-ui.git"
@@ -100,14 +100,14 @@
100
100
  "@rollup/plugin-commonjs": "29.0.3",
101
101
  "@rollup/plugin-json": "6.1.0",
102
102
  "@rollup/plugin-node-resolve": "16.0.3",
103
- "@storybook/addon-docs": "10.5.0",
104
- "@storybook/addon-links": "10.5.0",
103
+ "@storybook/addon-docs": "10.6.2",
104
+ "@storybook/addon-links": "10.6.2",
105
105
  "@storybook/addon-webpack5-compiler-swc": "4.0.3",
106
- "@storybook/react-webpack5": "10.5.0",
106
+ "@storybook/react-webpack5": "10.6.2",
107
107
  "@stylistic/eslint-plugin-ts": "4.4.1",
108
108
  "@swc/core": "1.15.43",
109
109
  "@swc/jest": "0.2.39",
110
- "@testing-library/jest-dom": "6.9.1",
110
+ "@testing-library/jest-dom": "7.0.1",
111
111
  "@testing-library/react": "16.3.2",
112
112
  "@testing-library/user-event": "14.6.1",
113
113
  "@types/chance": "1.1.8",
@@ -148,8 +148,8 @@
148
148
  "rollup-plugin-esbuild": "6.2.1",
149
149
  "rollup-plugin-node-externals": "9.0.1",
150
150
  "rxjs": "7.8.2",
151
- "smol-toml": "1.7.1",
152
- "storybook": "10.5.0",
151
+ "smol-toml": "1.9.1",
152
+ "storybook": "10.6.2",
153
153
  "ts-node": "10.9.2",
154
154
  "typescript": "5.9.3"
155
155
  },
@@ -158,7 +158,7 @@
158
158
  "@grafana/e2e-selectors": "^13.0.0",
159
159
  "@grafana/runtime": "^13.0.0",
160
160
  "@grafana/ui": "^13.0.0",
161
- "@testing-library/jest-dom": "^6.9.1",
161
+ "@testing-library/jest-dom": "^7.0.0",
162
162
  "@testing-library/react": "^16.3.2",
163
163
  "@testing-library/user-event": "^14.6.1",
164
164
  "monaco-editor": ">=0.30",
@@ -180,12 +180,16 @@
180
180
  },
181
181
  "packageManager": "yarn@4.17.1",
182
182
  "resolutions": {
183
- "undici": "8.9.0",
183
+ "undici": "8.12.3",
184
+ "dompurify": "3.4.17",
185
+ "zod": "4.6.6",
184
186
  "js-yaml@^3.13.1": "4.3.2",
185
187
  "js-yaml@^4.1.0": "4.3.2",
186
- "fast-uri": "3.1.7",
188
+ "fast-uri": "3.1.8",
187
189
  "react-router@6.30.4": "7.18.2",
188
- "brace-expansion@^1.1.7": "1.1.18",
189
- "brace-expansion@^5.0.5": "5.0.9"
190
+ "brace-expansion@^1.1.7": "5.0.12",
191
+ "brace-expansion@^5.0.5": "5.0.12",
192
+ "webpack-dev-middleware@^6.1.2": "8.3.0",
193
+ "moment@2.30.1": "2.31.0"
190
194
  }
191
195
  }