@grafana/create-plugin 1.0.0 → 1.0.1-canary.210.207e8c7.0

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.
@@ -85,11 +85,11 @@ var migrate = function () { return __awaiter(void 0, void 0, void 0, function ()
85
85
  }
86
86
  _a.label = 5;
87
87
  case 5:
88
- if (!(0, utils_npm_1.hasNpmDependenciesToUpdate)()) return [3, 7];
89
- return [4, (0, utils_console_1.confirmPrompt)(constants_1.TEXT.updateNpmDependenciesPrompt + (0, utils_npm_1.getPackageJsonUpdatesAsText)({ ignoreGrafanaDependencies: true }))];
88
+ if (!(0, utils_npm_1.hasNpmDependenciesToUpdate)({ dontUpdateGrafanaDependencies: true })) return [3, 7];
89
+ return [4, (0, utils_console_1.confirmPrompt)(constants_1.TEXT.updateNpmDependenciesPrompt + (0, utils_npm_1.getPackageJsonUpdatesAsText)({ dontUpdateGrafanaDependencies: true }))];
90
90
  case 6:
91
91
  if (_a.sent()) {
92
- (0, utils_npm_1.updatePackageJson)({ ignoreGrafanaDependencies: true });
92
+ (0, utils_npm_1.updatePackageJson)({ dontUpdateGrafanaDependencies: true });
93
93
  (0, utils_console_1.printSuccessMessage)(constants_1.TEXT.updateNpmDependenciesSuccess);
94
94
  }
95
95
  else {
@@ -41,60 +41,113 @@ var constants_1 = require("../constants");
41
41
  var utils_templates_1 = require("../utils/utils.templates");
42
42
  var utils_console_1 = require("../utils/utils.console");
43
43
  var utils_npm_1 = require("../utils/utils.npm");
44
+ function updateConfigurationFiles() {
45
+ return __awaiter(this, void 0, void 0, function () {
46
+ return __generator(this, function (_a) {
47
+ switch (_a.label) {
48
+ case 0: return [4, (0, utils_console_1.confirmPrompt)(constants_1.TEXT.updateConfigPrompt)];
49
+ case 1:
50
+ if (_a.sent()) {
51
+ (0, utils_templates_1.compileTemplateFiles)(constants_1.UDPATE_CONFIG.filesToOverride, (0, utils_templates_1.getTemplateData)());
52
+ (0, utils_console_1.printSuccessMessage)(constants_1.TEXT.overrideFilesSuccess);
53
+ }
54
+ else {
55
+ (0, utils_console_1.printMessage)(constants_1.TEXT.overrideFilesAborted);
56
+ process.exit(0);
57
+ }
58
+ return [2];
59
+ }
60
+ });
61
+ });
62
+ }
63
+ function updateNpmDependencies() {
64
+ return __awaiter(this, void 0, void 0, function () {
65
+ var shouldUpdateGrafanaPackages, updatadableDependenciesText, PROMPT_CHOICES, shouldUpdateDeps;
66
+ return __generator(this, function (_a) {
67
+ switch (_a.label) {
68
+ case 0:
69
+ if (!(0, utils_npm_1.hasNpmDependenciesToUpdate)()) return [3, 3];
70
+ return [4, (0, utils_console_1.confirmPrompt)(constants_1.TEXT.updateNpmGrafanaPackagesPrompt)];
71
+ case 1:
72
+ shouldUpdateGrafanaPackages = _a.sent();
73
+ updatadableDependenciesText = (0, utils_npm_1.getPackageJsonUpdatesAsText)({
74
+ dontUpdateGrafanaDependencies: !shouldUpdateGrafanaPackages
75
+ });
76
+ if (updatadableDependenciesText.length === 0) {
77
+ return [2];
78
+ }
79
+ PROMPT_CHOICES = {
80
+ ALL: 'Yes, all of them',
81
+ ONLY_OUTDATED: 'Yes, but only the outdated ones',
82
+ NONE: 'No'
83
+ };
84
+ return [4, (0, utils_console_1.selectPrompt)(constants_1.TEXT.updateNpmDependenciesPrompt + updatadableDependenciesText, [
85
+ PROMPT_CHOICES.ALL,
86
+ PROMPT_CHOICES.ONLY_OUTDATED,
87
+ PROMPT_CHOICES.NONE,
88
+ ])];
89
+ case 2:
90
+ shouldUpdateDeps = _a.sent();
91
+ if (shouldUpdateDeps && shouldUpdateDeps !== PROMPT_CHOICES.NONE) {
92
+ (0, utils_npm_1.updatePackageJson)({
93
+ dontUpdateGrafanaDependencies: !shouldUpdateGrafanaPackages,
94
+ onlyOutdated: shouldUpdateDeps === PROMPT_CHOICES.ONLY_OUTDATED
95
+ });
96
+ (0, utils_console_1.printSuccessMessage)(constants_1.TEXT.updateNpmDependenciesSuccess);
97
+ }
98
+ else {
99
+ (0, utils_console_1.printMessage)(constants_1.TEXT.updateNpmDependenciesAborted);
100
+ }
101
+ return [3, 4];
102
+ case 3:
103
+ (0, utils_console_1.printMessage)(constants_1.TEXT.updateNpmDependenciesAborted);
104
+ _a.label = 4;
105
+ case 4: return [2];
106
+ }
107
+ });
108
+ });
109
+ }
110
+ function updatePackageJsonScripts() {
111
+ return __awaiter(this, void 0, void 0, function () {
112
+ return __generator(this, function (_a) {
113
+ switch (_a.label) {
114
+ case 0: return [4, (0, utils_console_1.confirmPrompt)(constants_1.TEXT.updateNpmScriptsPrompt)];
115
+ case 1:
116
+ if (_a.sent()) {
117
+ (0, utils_npm_1.updateNpmScripts)();
118
+ (0, utils_console_1.printSuccessMessage)(constants_1.TEXT.updateNpmScriptsSuccess);
119
+ }
120
+ else {
121
+ (0, utils_console_1.printMessage)(constants_1.TEXT.updateNpmScriptsAborted);
122
+ }
123
+ return [2];
124
+ }
125
+ });
126
+ });
127
+ }
44
128
  var update = function () { return __awaiter(void 0, void 0, void 0, function () {
45
- var PROMPT_CHOICES, shouldUpdateDeps, error_1;
129
+ var error_1;
46
130
  return __generator(this, function (_a) {
47
131
  switch (_a.label) {
48
132
  case 0:
49
- _a.trys.push([0, 5, , 6]);
133
+ _a.trys.push([0, 4, , 5]);
50
134
  (0, utils_console_1.printMessage)(constants_1.TEXT.updateCommandWarning);
51
- return [4, (0, utils_console_1.confirmPrompt)(constants_1.TEXT.updateConfigPrompt)];
135
+ return [4, updateConfigurationFiles()];
52
136
  case 1:
53
- if (_a.sent()) {
54
- (0, utils_templates_1.compileTemplateFiles)(constants_1.UDPATE_CONFIG.filesToOverride, (0, utils_templates_1.getTemplateData)());
55
- (0, utils_console_1.printSuccessMessage)(constants_1.TEXT.overrideFilesSuccess);
56
- }
57
- else {
58
- (0, utils_console_1.printMessage)(constants_1.TEXT.overrideFilesAborted);
59
- process.exit(0);
60
- }
61
- if (!(0, utils_npm_1.hasNpmDependenciesToUpdate)()) return [3, 3];
62
- PROMPT_CHOICES = {
63
- ALL: 'Yes, all of them',
64
- ONLY_OUTDATED: 'Yes, but only the outdated ones',
65
- NONE: 'No'
66
- };
67
- return [4, (0, utils_console_1.selectPrompt)(constants_1.TEXT.updateNpmDependenciesPrompt + (0, utils_npm_1.getPackageJsonUpdatesAsText)(), [
68
- PROMPT_CHOICES.ALL,
69
- PROMPT_CHOICES.ONLY_OUTDATED,
70
- PROMPT_CHOICES.NONE,
71
- ])];
137
+ _a.sent();
138
+ return [4, updateNpmDependencies()];
72
139
  case 2:
73
- shouldUpdateDeps = _a.sent();
74
- if (shouldUpdateDeps && shouldUpdateDeps !== PROMPT_CHOICES.NONE) {
75
- (0, utils_npm_1.updatePackageJson)({ onlyOutdated: shouldUpdateDeps === PROMPT_CHOICES.ONLY_OUTDATED });
76
- (0, utils_console_1.printSuccessMessage)(constants_1.TEXT.updateNpmDependenciesSuccess);
77
- }
78
- else {
79
- (0, utils_console_1.printMessage)(constants_1.TEXT.updateNpmDependenciesAborted);
80
- }
81
- _a.label = 3;
82
- case 3: return [4, (0, utils_console_1.confirmPrompt)(constants_1.TEXT.updateNpmScriptsPrompt)];
83
- case 4:
84
- if (_a.sent()) {
85
- (0, utils_npm_1.updateNpmScripts)();
86
- (0, utils_console_1.printSuccessMessage)(constants_1.TEXT.updateNpmScriptsSuccess);
87
- }
88
- else {
89
- (0, utils_console_1.printMessage)(constants_1.TEXT.updateNpmScriptsAborted);
90
- }
140
+ _a.sent();
141
+ return [4, updatePackageJsonScripts()];
142
+ case 3:
143
+ _a.sent();
91
144
  (0, utils_console_1.printSuccessMessage)(constants_1.TEXT.updateCommandSuccess);
92
- return [3, 6];
93
- case 5:
145
+ return [3, 5];
146
+ case 4:
94
147
  error_1 = _a.sent();
95
148
  console.error(error_1);
96
- return [3, 6];
97
- case 6: return [2];
149
+ return [3, 5];
150
+ case 5: return [2];
98
151
  }
99
152
  });
100
153
  }); };
package/dist/constants.js CHANGED
@@ -72,6 +72,7 @@ exports.TEXT = {
72
72
  updateNpmDependenciesPrompt: '**Would you like to update the following dependencies in the `package.json?`**',
73
73
  updateNpmDependenciesSuccess: 'Successfully updated the NPM dependencies.',
74
74
  updateNpmDependenciesAborted: 'No NPM dependencies have been updated.',
75
+ updateNpmGrafanaPackagesPrompt: 'Would you like to update the `@grafana/*` packages dependencies?',
75
76
  removeNpmDependenciesPrompt: '**Would you like to remove the following possibly unnecessary NPM dependencies?**',
76
77
  removeNpmDependenciesSuccess: 'Unnecessary NPM dependencies removed successfully.',
77
78
  removeNpmDependenciesAborted: 'No NPM dependencies have been removed.',
@@ -1,6 +1,67 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (_) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
2
61
  exports.__esModule = true;
62
+ var files = __importStar(require("../utils.files"));
3
63
  var utils_npm_1 = require("../utils.npm");
64
+ var templates = __importStar(require("../utils.templates"));
4
65
  describe('Utils / NPM', function () {
5
66
  describe('getDepenciesToBeUpdated()', function () {
6
67
  test('it should return a summary of dependencies to be updated', function () {
@@ -135,4 +196,83 @@ describe('Utils / NPM', function () {
135
196
  });
136
197
  });
137
198
  });
199
+ describe('getPackageJsonUpdates()', function () {
200
+ var spies;
201
+ beforeEach(function () {
202
+ spies = [
203
+ jest.spyOn(templates, 'renderTemplateFromFile').mockReturnValue(JSON.stringify({
204
+ scripts: {},
205
+ dependencies: {
206
+ '@emotion/css': '^11.1.3',
207
+ '@grafana/data': '9.3.0',
208
+ '@grafana/runtime': '9.3.0',
209
+ '@grafana/ui': '9.3.0'
210
+ },
211
+ devDependencies: {
212
+ '@babel/core': '^7.16.7',
213
+ '@grafana/e2e': '{{ grafanaVersion }}',
214
+ '@grafana/e2e-selectors': '{{ grafanaVersion }}',
215
+ '@grafana/eslint-config': '^5.1.0',
216
+ '@grafana/tsconfig': '^1.2.0-rc1',
217
+ '@swc/core': '^1.2.144'
218
+ }
219
+ })),
220
+ jest.spyOn(files, 'readJsonFile').mockImplementation(function () {
221
+ return {
222
+ dependencies: {
223
+ '@grafana/data': '9.0.0',
224
+ '@grafana/runtime': '9.0.0',
225
+ underscore: '2.0.0'
226
+ },
227
+ devDependencies: {
228
+ 'eslint-plugin-react': '7.26.1'
229
+ }
230
+ };
231
+ }),
232
+ ];
233
+ });
234
+ afterEach(function () {
235
+ spies.forEach(function (s) { return s.mockRestore(); });
236
+ });
237
+ it('updates @grafana dependencies by default', function () { return __awaiter(void 0, void 0, void 0, function () {
238
+ var result;
239
+ return __generator(this, function (_a) {
240
+ result = (0, utils_npm_1.getPackageJsonUpdates)({ dontUpdateGrafanaDependencies: false });
241
+ expect(result.dependencyUpdates['@grafana/data']).toBeDefined();
242
+ expect(result.dependencyUpdates['@grafana/runtime']).toBeDefined();
243
+ expect(result.devDependencyUpdates['@grafana/data']).not.toBeDefined();
244
+ expect(result.devDependencyUpdates['@grafana/runtime']).not.toBeDefined();
245
+ return [2];
246
+ });
247
+ }); });
248
+ it('does not update @grafana dependencies when instructed', function () { return __awaiter(void 0, void 0, void 0, function () {
249
+ var result;
250
+ return __generator(this, function (_a) {
251
+ result = (0, utils_npm_1.getPackageJsonUpdates)({ dontUpdateGrafanaDependencies: true });
252
+ expect(result.dependencyUpdates['@grafana/data'].next).toEqual(result.dependencyUpdates['@grafana/data'].prev);
253
+ expect(result.dependencyUpdates['@grafana/runtime'].next).toEqual(result.dependencyUpdates['@grafana/runtime'].prev);
254
+ return [2];
255
+ });
256
+ }); });
257
+ it('moves @grafana/* dependencies from devDependencies to dependencies when instructed keeping their version', function () {
258
+ var spy = jest.spyOn(files, 'readJsonFile').mockImplementation(function () {
259
+ return {
260
+ dependencies: {
261
+ underscore: '2.0.0'
262
+ },
263
+ devDependencies: {
264
+ 'eslint-plugin-react': '7.26.1',
265
+ '@grafana/data': '9.0.0',
266
+ '@grafana/runtime': '9.0.0'
267
+ }
268
+ };
269
+ });
270
+ var result = (0, utils_npm_1.getPackageJsonUpdates)({ dontUpdateGrafanaDependencies: true });
271
+ expect(result.dependencyUpdates['@grafana/data'].next).toEqual(result.dependencyUpdates['@grafana/data'].prev);
272
+ expect(result.dependencyUpdates['@grafana/runtime'].next).toEqual(result.dependencyUpdates['@grafana/runtime'].prev);
273
+ expect(result.devDependencyUpdates['@grafana/data']).not.toBeDefined();
274
+ expect(result.devDependencyUpdates['@grafana/runtime']).not.toBeDefined();
275
+ spy.mockRestore();
276
+ });
277
+ });
138
278
  });
@@ -38,7 +38,7 @@ exports.writePackageJson = writePackageJson;
38
38
  function getNpmDependencyUpdatesAsText(dependencyUpdates) {
39
39
  return Object.entries(dependencyUpdates)
40
40
  .filter(function (_a) {
41
- var packageName = _a[0], _b = _a[1], prev = _b.prev, next = _b.next;
41
+ var _ = _a[0], _b = _a[1], prev = _b.prev, next = _b.next;
42
42
  return prev !== next;
43
43
  })
44
44
  .map(function (_a) {
@@ -96,50 +96,33 @@ function getPackageJsonUpdates(options) {
96
96
  var devDependencies = packageJson.devDependencies || {};
97
97
  var newDependencies = newPackageJson.dependencies || {};
98
98
  var newDevDependencies = newPackageJson.devDependencies || {};
99
+ for (var _i = 0, GRAFANA_FE_PACKAGES_1 = constants_1.GRAFANA_FE_PACKAGES; _i < GRAFANA_FE_PACKAGES_1.length; _i++) {
100
+ var grafanaPackage = GRAFANA_FE_PACKAGES_1[_i];
101
+ if (devDependencies[grafanaPackage]) {
102
+ dependencies[grafanaPackage] = devDependencies[grafanaPackage];
103
+ delete devDependencies[grafanaPackage];
104
+ }
105
+ }
99
106
  var dependencyUpdates = getUpdatableNpmDependencies(dependencies, newDependencies, options);
100
107
  var devDependencyUpdates = getUpdatableNpmDependencies(devDependencies, newDevDependencies, options);
101
- if (options.ignoreGrafanaDependencies) {
102
- var prevGrafanaDependencies = Object.entries(__assign(__assign({}, dependencies), devDependencies)).reduce(function (acc, _a) {
103
- var key = _a[0], value = _a[1];
104
- if (constants_1.GRAFANA_FE_PACKAGES.includes(key)) {
105
- acc[key] = value;
106
- }
107
- return acc;
108
- }, {});
109
- return {
110
- dependencyUpdates: ignoreGrafanaDependencies(dependencyUpdates, prevGrafanaDependencies),
111
- devDependencyUpdates: ignoreGrafanaDependencies(devDependencyUpdates, prevGrafanaDependencies)
112
- };
113
- }
114
108
  return {
115
109
  dependencyUpdates: dependencyUpdates,
116
110
  devDependencyUpdates: devDependencyUpdates
117
111
  };
118
112
  }
119
113
  exports.getPackageJsonUpdates = getPackageJsonUpdates;
120
- function ignoreGrafanaDependencies(dependencyUpdates, prevGrafanaDependencies) {
121
- var whatever = Object.keys(prevGrafanaDependencies);
122
- var result = Object.entries(dependencyUpdates).reduce(function (acc, _a) {
123
- var packageName = _a[0], value = _a[1];
124
- if (whatever.includes(packageName)) {
125
- acc[packageName] = {
126
- prev: prevGrafanaDependencies[packageName],
127
- next: prevGrafanaDependencies[packageName]
128
- };
129
- }
130
- else {
131
- acc[packageName] = value;
132
- }
133
- return acc;
134
- }, {});
135
- return result;
136
- }
137
114
  function getUpdatableNpmDependencies(prevDeps, nextDeps, options) {
138
115
  if (options === void 0) { options = {}; }
139
116
  var updateSummary = {};
140
117
  for (var _i = 0, _a = Object.entries(nextDeps); _i < _a.length; _i++) {
141
118
  var _b = _a[_i], packageName = _b[0], newSemverRange = _b[1];
142
119
  var currentSemverRange = prevDeps[packageName];
120
+ if (options.dontUpdateGrafanaDependencies && constants_1.GRAFANA_FE_PACKAGES.includes(packageName)) {
121
+ if (currentSemverRange) {
122
+ updateSummary[packageName] = { prev: currentSemverRange, next: currentSemverRange };
123
+ }
124
+ continue;
125
+ }
143
126
  if (!currentSemverRange) {
144
127
  updateSummary[packageName] = { prev: null, next: newSemverRange };
145
128
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafana/create-plugin",
3
- "version": "1.0.0",
3
+ "version": "1.0.1-canary.210.207e8c7.0",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "directory": "packages/create-plugin",
@@ -60,5 +60,5 @@
60
60
  "engines": {
61
61
  "node": ">=16"
62
62
  },
63
- "gitHead": "1b6746b0c95271772741cf1a8cba405919f53874"
63
+ "gitHead": "207e8c72cf7509ce7d29526db5df3a916d8db1c1"
64
64
  }
@@ -57,13 +57,13 @@ export const migrate = async () => {
57
57
  // 4. Add / update dependencies inside the `package.json`
58
58
  // (skipped automatically if there is nothing to update)
59
59
  // ------------------------------------------------
60
- if (hasNpmDependenciesToUpdate()) {
60
+ if (hasNpmDependenciesToUpdate({ dontUpdateGrafanaDependencies: true })) {
61
61
  if (
62
62
  await confirmPrompt(
63
- TEXT.updateNpmDependenciesPrompt + getPackageJsonUpdatesAsText({ ignoreGrafanaDependencies: true })
63
+ TEXT.updateNpmDependenciesPrompt + getPackageJsonUpdatesAsText({ dontUpdateGrafanaDependencies: true })
64
64
  )
65
65
  ) {
66
- updatePackageJson({ ignoreGrafanaDependencies: true });
66
+ updatePackageJson({ dontUpdateGrafanaDependencies: true });
67
67
  printSuccessMessage(TEXT.updateNpmDependenciesSuccess);
68
68
  } else {
69
69
  printMessage(TEXT.updateNpmDependenciesAborted);
@@ -8,54 +8,79 @@ import {
8
8
  updateNpmScripts,
9
9
  } from '../utils/utils.npm';
10
10
 
11
+ async function updateConfigurationFiles() {
12
+ if (await confirmPrompt(TEXT.updateConfigPrompt)) {
13
+ compileTemplateFiles(UDPATE_CONFIG.filesToOverride, getTemplateData());
14
+ printSuccessMessage(TEXT.overrideFilesSuccess);
15
+ } else {
16
+ printMessage(TEXT.overrideFilesAborted);
17
+ process.exit(0);
18
+ }
19
+ }
20
+
21
+ async function updateNpmDependencies() {
22
+ if (hasNpmDependenciesToUpdate()) {
23
+ // ask if we should update the grafana dependencies
24
+ const shouldUpdateGrafanaPackages = await confirmPrompt(TEXT.updateNpmGrafanaPackagesPrompt);
25
+
26
+ const updatadableDependenciesText = getPackageJsonUpdatesAsText({
27
+ dontUpdateGrafanaDependencies: !shouldUpdateGrafanaPackages,
28
+ });
29
+
30
+ if (updatadableDependenciesText.length === 0) {
31
+ // No dependencies to update
32
+ return;
33
+ }
34
+
35
+ const PROMPT_CHOICES = {
36
+ ALL: 'Yes, all of them',
37
+ ONLY_OUTDATED: 'Yes, but only the outdated ones',
38
+ NONE: 'No',
39
+ };
40
+
41
+ const shouldUpdateDeps = await selectPrompt(TEXT.updateNpmDependenciesPrompt + updatadableDependenciesText, [
42
+ PROMPT_CHOICES.ALL,
43
+ PROMPT_CHOICES.ONLY_OUTDATED,
44
+ PROMPT_CHOICES.NONE,
45
+ ]);
46
+
47
+ if (shouldUpdateDeps && shouldUpdateDeps !== PROMPT_CHOICES.NONE) {
48
+ updatePackageJson({
49
+ dontUpdateGrafanaDependencies: !shouldUpdateGrafanaPackages,
50
+ onlyOutdated: shouldUpdateDeps === PROMPT_CHOICES.ONLY_OUTDATED,
51
+ });
52
+ printSuccessMessage(TEXT.updateNpmDependenciesSuccess);
53
+ } else {
54
+ printMessage(TEXT.updateNpmDependenciesAborted);
55
+ }
56
+ } else {
57
+ printMessage(TEXT.updateNpmDependenciesAborted);
58
+ }
59
+ }
60
+
61
+ async function updatePackageJsonScripts() {
62
+ if (await confirmPrompt(TEXT.updateNpmScriptsPrompt)) {
63
+ updateNpmScripts();
64
+ printSuccessMessage(TEXT.updateNpmScriptsSuccess);
65
+ } else {
66
+ printMessage(TEXT.updateNpmScriptsAborted);
67
+ }
68
+ }
69
+
11
70
  export const update = async () => {
12
71
  try {
13
- // 0. Warning
14
- // ----------
15
72
  printMessage(TEXT.updateCommandWarning);
16
73
 
17
74
  // 1. Add / update configuration files
18
- // -----------------------------------
19
- if (await confirmPrompt(TEXT.updateConfigPrompt)) {
20
- compileTemplateFiles(UDPATE_CONFIG.filesToOverride, getTemplateData());
21
- printSuccessMessage(TEXT.overrideFilesSuccess);
22
- } else {
23
- printMessage(TEXT.overrideFilesAborted);
24
- process.exit(0);
25
- }
75
+ await updateConfigurationFiles();
26
76
 
27
77
  // 2. Add / update dependencies inside the `package.json`
28
78
  // (skipped automatically if there is nothing to update)
29
- // ------------------------------------------------
30
- if (hasNpmDependenciesToUpdate()) {
31
- const PROMPT_CHOICES = {
32
- ALL: 'Yes, all of them',
33
- ONLY_OUTDATED: 'Yes, but only the outdated ones',
34
- NONE: 'No',
35
- };
36
- const shouldUpdateDeps = await selectPrompt(TEXT.updateNpmDependenciesPrompt + getPackageJsonUpdatesAsText(), [
37
- PROMPT_CHOICES.ALL,
38
- PROMPT_CHOICES.ONLY_OUTDATED,
39
- PROMPT_CHOICES.NONE,
40
- ]);
41
-
42
- if (shouldUpdateDeps && shouldUpdateDeps !== PROMPT_CHOICES.NONE) {
43
- updatePackageJson({ onlyOutdated: shouldUpdateDeps === PROMPT_CHOICES.ONLY_OUTDATED });
44
- printSuccessMessage(TEXT.updateNpmDependenciesSuccess);
45
- } else {
46
- printMessage(TEXT.updateNpmDependenciesAborted);
47
- }
48
- }
79
+ await updateNpmDependencies();
49
80
 
50
81
  // 3. Add / update NPM scripts
51
82
  // (skipped automatically if there is nothing to update)
52
- // ------------------------------------------------
53
- if (await confirmPrompt(TEXT.updateNpmScriptsPrompt)) {
54
- updateNpmScripts();
55
- printSuccessMessage(TEXT.updateNpmScriptsSuccess);
56
- } else {
57
- printMessage(TEXT.updateNpmScriptsAborted);
58
- }
83
+ await updatePackageJsonScripts();
59
84
 
60
85
  // 4. Summary
61
86
  // -------------
package/src/constants.ts CHANGED
@@ -95,6 +95,7 @@ export const TEXT = {
95
95
  updateNpmDependenciesPrompt: '**Would you like to update the following dependencies in the `package.json?`**',
96
96
  updateNpmDependenciesSuccess: 'Successfully updated the NPM dependencies.',
97
97
  updateNpmDependenciesAborted: 'No NPM dependencies have been updated.',
98
+ updateNpmGrafanaPackagesPrompt: 'Would you like to update the `@grafana/*` packages dependencies?',
98
99
 
99
100
  removeNpmDependenciesPrompt: '**Would you like to remove the following possibly unnecessary NPM dependencies?**',
100
101
  removeNpmDependenciesSuccess: 'Unnecessary NPM dependencies removed successfully.',
@@ -1,4 +1,6 @@
1
- import { updateNpmDependencies, getUpdatableNpmDependencies } from '../utils.npm';
1
+ import * as files from '../utils.files';
2
+ import { updateNpmDependencies, getUpdatableNpmDependencies, getPackageJsonUpdates } from '../utils.npm';
3
+ import * as templates from '../utils.templates';
2
4
 
3
5
  describe('Utils / NPM', () => {
4
6
  describe('getDepenciesToBeUpdated()', () => {
@@ -190,4 +192,95 @@ describe('Utils / NPM', () => {
190
192
  });
191
193
  });
192
194
  });
195
+
196
+ describe('getPackageJsonUpdates()', () => {
197
+ let spies: jest.SpyInstance[];
198
+ beforeEach(() => {
199
+ spies = [
200
+ // template package.json
201
+ jest.spyOn(templates, 'renderTemplateFromFile').mockReturnValue(
202
+ JSON.stringify({
203
+ scripts: {},
204
+ dependencies: {
205
+ '@emotion/css': '^11.1.3',
206
+ '@grafana/data': '9.3.0',
207
+ '@grafana/runtime': '9.3.0',
208
+ '@grafana/ui': '9.3.0',
209
+ },
210
+ devDependencies: {
211
+ '@babel/core': '^7.16.7',
212
+ '@grafana/e2e': '{{ grafanaVersion }}',
213
+ '@grafana/e2e-selectors': '{{ grafanaVersion }}',
214
+ '@grafana/eslint-config': '^5.1.0',
215
+ '@grafana/tsconfig': '^1.2.0-rc1',
216
+ '@swc/core': '^1.2.144',
217
+ },
218
+ })
219
+ ),
220
+ // plugin package.json
221
+ jest.spyOn(files, 'readJsonFile').mockImplementation(() => {
222
+ return {
223
+ dependencies: {
224
+ '@grafana/data': '9.0.0',
225
+ '@grafana/runtime': '9.0.0',
226
+ underscore: '2.0.0',
227
+ },
228
+ devDependencies: {
229
+ 'eslint-plugin-react': '7.26.1',
230
+ },
231
+ };
232
+ }),
233
+ ];
234
+ });
235
+
236
+ afterEach(() => {
237
+ spies.forEach((s) => s.mockRestore());
238
+ });
239
+
240
+ it('updates @grafana dependencies by default', async () => {
241
+ const result = getPackageJsonUpdates({ dontUpdateGrafanaDependencies: false }); // false by default
242
+ expect(result.dependencyUpdates['@grafana/data']).toBeDefined();
243
+ expect(result.dependencyUpdates['@grafana/runtime']).toBeDefined();
244
+ // shouldn't be in devDependencies
245
+ expect(result.devDependencyUpdates['@grafana/data']).not.toBeDefined();
246
+ expect(result.devDependencyUpdates['@grafana/runtime']).not.toBeDefined();
247
+ });
248
+
249
+ it('does not update @grafana dependencies when instructed', async () => {
250
+ // the plugin package.json
251
+ const result = getPackageJsonUpdates({ dontUpdateGrafanaDependencies: true });
252
+ expect(result.dependencyUpdates['@grafana/data'].next).toEqual(result.dependencyUpdates['@grafana/data'].prev);
253
+ expect(result.dependencyUpdates['@grafana/runtime'].next).toEqual(
254
+ result.dependencyUpdates['@grafana/runtime'].prev
255
+ );
256
+ });
257
+
258
+ it('moves @grafana/* dependencies from devDependencies to dependencies when instructed keeping their version', () => {
259
+ // the plugin package.json
260
+ const spy = jest.spyOn(files, 'readJsonFile').mockImplementation(() => {
261
+ return {
262
+ dependencies: {
263
+ underscore: '2.0.0',
264
+ },
265
+ devDependencies: {
266
+ 'eslint-plugin-react': '7.26.1',
267
+ '@grafana/data': '9.0.0',
268
+ '@grafana/runtime': '9.0.0',
269
+ },
270
+ };
271
+ });
272
+ const result = getPackageJsonUpdates({ dontUpdateGrafanaDependencies: true });
273
+
274
+ // should be in dependencies
275
+ expect(result.dependencyUpdates['@grafana/data'].next).toEqual(result.dependencyUpdates['@grafana/data'].prev);
276
+ expect(result.dependencyUpdates['@grafana/runtime'].next).toEqual(
277
+ result.dependencyUpdates['@grafana/runtime'].prev
278
+ );
279
+ // should not be in devDependencies
280
+ expect(result.devDependencyUpdates['@grafana/data']).not.toBeDefined();
281
+ expect(result.devDependencyUpdates['@grafana/runtime']).not.toBeDefined();
282
+
283
+ spy.mockRestore();
284
+ });
285
+ });
193
286
  });
@@ -9,7 +9,7 @@ type UpdateSummary = Record<string, { prev: string | null; next: string | null }
9
9
 
10
10
  type UpdateOptions = {
11
11
  onlyOutdated?: Boolean;
12
- ignoreGrafanaDependencies?: boolean;
12
+ dontUpdateGrafanaDependencies?: boolean;
13
13
  };
14
14
 
15
15
  type PackageJson = {
@@ -36,7 +36,7 @@ export function writePackageJson(json: PackageJson) {
36
36
 
37
37
  export function getNpmDependencyUpdatesAsText(dependencyUpdates: UpdateSummary) {
38
38
  return Object.entries(dependencyUpdates)
39
- .filter(([packageName, { prev, next }]) => prev !== next)
39
+ .filter(([_, { prev, next }]) => prev !== next)
40
40
  .map(([packageName, { prev, next }]) => {
41
41
  // New package
42
42
  if (!prev) {
@@ -99,47 +99,24 @@ export function getPackageJsonUpdates(options: UpdateOptions = {}) {
99
99
  const devDependencies = packageJson.devDependencies || {};
100
100
  const newDependencies = newPackageJson.dependencies || {};
101
101
  const newDevDependencies = newPackageJson.devDependencies || {};
102
- const dependencyUpdates = getUpdatableNpmDependencies(dependencies, newDependencies, options);
103
- const devDependencyUpdates = getUpdatableNpmDependencies(devDependencies, newDevDependencies, options);
104
102
 
105
- if (options.ignoreGrafanaDependencies) {
106
- const prevGrafanaDependencies = Object.entries({ ...dependencies, ...devDependencies }).reduce<
107
- Record<string, string>
108
- >((acc, [key, value]) => {
109
- if (GRAFANA_FE_PACKAGES.includes(key)) {
110
- acc[key] = value;
111
- }
112
- return acc;
113
- }, {});
114
- return {
115
- dependencyUpdates: ignoreGrafanaDependencies(dependencyUpdates, prevGrafanaDependencies),
116
- devDependencyUpdates: ignoreGrafanaDependencies(devDependencyUpdates, prevGrafanaDependencies),
117
- };
103
+ // Move grafana dependencies from devDependencies to dependencies
104
+ for (const grafanaPackage of GRAFANA_FE_PACKAGES) {
105
+ if (devDependencies[grafanaPackage]) {
106
+ dependencies[grafanaPackage] = devDependencies[grafanaPackage];
107
+ delete devDependencies[grafanaPackage];
108
+ }
118
109
  }
119
110
 
111
+ const dependencyUpdates = getUpdatableNpmDependencies(dependencies, newDependencies, options);
112
+ const devDependencyUpdates = getUpdatableNpmDependencies(devDependencies, newDevDependencies, options);
113
+
120
114
  return {
121
115
  dependencyUpdates,
122
116
  devDependencyUpdates,
123
117
  };
124
118
  }
125
119
 
126
- function ignoreGrafanaDependencies(dependencyUpdates: UpdateSummary, prevGrafanaDependencies: Record<string, string>) {
127
- const whatever = Object.keys(prevGrafanaDependencies);
128
- const result = Object.entries(dependencyUpdates).reduce<UpdateSummary>((acc, [packageName, value]) => {
129
- if (whatever.includes(packageName)) {
130
- acc[packageName] = {
131
- prev: prevGrafanaDependencies[packageName],
132
- next: prevGrafanaDependencies[packageName],
133
- };
134
- } else {
135
- acc[packageName] = value;
136
- }
137
- return acc;
138
- }, {});
139
-
140
- return result;
141
- }
142
-
143
120
  export function getUpdatableNpmDependencies(
144
121
  prevDeps: Record<string, string>,
145
122
  nextDeps: Record<string, string>,
@@ -151,6 +128,14 @@ export function getUpdatableNpmDependencies(
151
128
  for (const [packageName, newSemverRange] of Object.entries(nextDeps)) {
152
129
  const currentSemverRange = prevDeps[packageName];
153
130
 
131
+ // keep grafana dependencies at the same version when instructed
132
+ if (options.dontUpdateGrafanaDependencies && GRAFANA_FE_PACKAGES.includes(packageName)) {
133
+ if (currentSemverRange) {
134
+ updateSummary[packageName] = { prev: currentSemverRange, next: currentSemverRange };
135
+ }
136
+ continue;
137
+ }
138
+
154
139
  // New dependency
155
140
  if (!currentSemverRange) {
156
141
  updateSummary[packageName] = { prev: null, next: newSemverRange };
@@ -9,7 +9,6 @@ import (
9
9
 
10
10
  "github.com/grafana/grafana-plugin-sdk-go/backend"
11
11
  "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
12
- "github.com/grafana/grafana-plugin-sdk-go/backend/log"
13
12
  "github.com/grafana/grafana-plugin-sdk-go/data"
14
13
  )
15
14
 
@@ -45,10 +44,6 @@ func (d *Datasource) Dispose() {
45
44
  // The QueryDataResponse contains a map of RefID to the response for each query, and each response
46
45
  // contains Frames ([]*Frame).
47
46
  func (d *Datasource) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
48
- // when logging at a non-Debug level, make sure you don't include sensitive information in the message
49
- // (like the *backend.QueryDataRequest)
50
- log.DefaultLogger.Debug("QueryData called", "numQueries", len(req.Queries))
51
-
52
47
  // create response struct
53
48
  response := backend.NewQueryDataResponse()
54
49
 
@@ -99,10 +94,6 @@ func (d *Datasource) query(_ context.Context, pCtx backend.PluginContext, query
99
94
  // datasource configuration page which allows users to verify that
100
95
  // a datasource is working as expected.
101
96
  func (d *Datasource) CheckHealth(_ context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
102
- // when logging at a non-Debug level, make sure you don't include sensitive information in the message
103
- // (like the *backend.QueryDataRequest)
104
- log.DefaultLogger.Debug("CheckHealth called")
105
-
106
97
  var status = backend.HealthStatusOk
107
98
  var message = "Data source is working"
108
99