powerbi-visuals-tools 5.4.1 → 5.4.3

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.
package/Changelog.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  This page contains information about changes to the PowerBI Visual Tools (pbiviz).
4
4
 
5
+ ## 5.4.3
6
+ * Fixed bug with missing plugins for Eslint.
7
+ * New flag `--use-default` for `pbiviz package` and `pbiviz lint` commands. Use this command to lint files according to recommended lint config.
8
+
9
+ ## 5.4.2
10
+ * Added the **node: false** option to the webpack plugin to eliminate the use of the potentially dangerous **new Function()** method, which ensures compatibility with the Node.js runtime.
11
+ * Introduced support for *.mjs ECMAScript modules.
12
+
5
13
  ## 5.4.1
6
14
  * Updated R-based visuals settings.ts file to work properly with the new API
7
15
 
package/bin/pbiviz.js CHANGED
@@ -72,6 +72,7 @@ pbiviz
72
72
  pbiviz
73
73
  .command('lint')
74
74
  .option('--fix', 'Enable autofixing of lint errors')
75
+ .option('--use-default', 'Use recommended eslintrc file')
75
76
  .action(options => {
76
77
  CommandManager.lint({ ...options, verbose: true }, rootPath);
77
78
  });
@@ -100,6 +101,7 @@ pbiviz
100
101
  .option('-l, --all-locales', "Keeps all locale files in the package. By default only used inside stringResources folder locales are included.")
101
102
  .option('-v, --verbose', "Enables verbose logging")
102
103
  .option('--fix', 'Enable autofixing of lint errors')
104
+ .option('--use-default', 'Use recommended eslintrc file')
103
105
  .option('-p, --pbiviz-file <pbiviz-file>', "Path to pbiviz.json file (useful for debugging)", pbivizFile)
104
106
  .addOption(new Option('-c, --compression <compressionLevel>', "Enables compression of visual package")
105
107
  .choices(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
@@ -1,28 +1,28 @@
1
1
  -----BEGIN PRIVATE KEY-----
2
- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2M9oZ9Fo33YJc
3
- 4pJP9cIR0G7cAr1b1z1bdEbNZ8qErjQHtkhsQiJ+QDL3okHOIEJ44+z3yJ7mC57K
4
- q8bL8f5WvSUN0ZlTvZxgaHYLsNUJNDxlFdn1AGl/JEdWYnBXH8p+Zkx14smrP8a3
5
- d7LL3Hup7Q3frerswHT1hHwxSAQ9EcLCYJQ2hiYZtkdfz/gpWRHfKrrs+EYwCPn8
6
- 4SWPYtIZ/HidB13dBwefYoKH9tkqF/U08yAxQ+afzBrMbLQhfZeC55xV3D5MBOBs
7
- bCkMG4DCx9yM3OALArmpAie26ahSMSXQD+HIiGwcAUB7/ggPz4NYrXp0xkt+OesW
8
- 0ToDfmy1AgMBAAECggEAAfF9owc7Kxtet5TnEJlDb6M0e34//MnH6sDLvIcd3tpo
9
- zahBD36JFaWjpYaCgytO6jEsJtxp7XQ0Rl8cqLI1D0HHMmWI6B6+mzyh/a/uJcH7
10
- 3uwjvfw6I9QEOsSkBBnftAdtS1iW5A+zE+Pf8VKxsvdHTZpyRgIrfS7jkDb/bJNO
11
- RuDMNWJACvh+mtZHEkXC7uV61s40RcPaJvkElu/BTuHwhSWlo8ZCa6kK2N2b1VuH
12
- UaHJ86cf/WvkZ2nlbOFTumaskByLZ1HO4+fByTAx+NwKFDYPmV5zPf1v+0cxMMjH
13
- kpuKsEGfWoRoEVgpKsBmuzHMogKtuO5RD31dmepmJQKBgQD0q6fSQs4ObKoev/CC
14
- T+JpZupK5A41pcc8eDErWqa1v87e+VXS6xSSj0DUonYqehBLaGnbE+rc5wSPPRxx
15
- DSpR9zjLiq65g3+5bRZGMx9vZpy8LLbe2G9gbab7yGFoaIfFpM8Q3sGipV5r6CfM
16
- Kay+n7y0gQeddu0ltdSwMS7D2wKBgQC+o7IiNL3LyK9KMmky/iYCsIBChFIMKA86
17
- 1e4II8L6yoW3ReAiC/yj+IXXrmZsaTapAfeo74o+oEjkE8gUpi2xUauIW2+eeDyP
18
- euMAKqmbC5eOJ7JX1qHGNZ0a0qJydk7IxWWyluSYViD309g+fqYSJYTL4a9lSk6a
19
- 91qgyp6+rwKBgAX/24qdVr4lzfoZDMW1PcEF5ALYGr0YBo2mCNaeT24veNwg0wjr
20
- +MIrPxS3sxwRiCrBMa9MirrF82erwPHIt9vwqvTavrQP1GbwlNY91Kx/oKJAmm9W
21
- cUy1A54y6KiNv56KDwXD4I2jbnBI7gjkkLbP5emrLEuhKel9zuxPGG13AoGBAIu+
22
- 4XCzqsF8XgqMw5LuvJxSF+Mqrh5dKzTc5z0uQdqnpLeBUFiE4vCr2CkPneMwiTIA
23
- 0DQVTAi2ZFhUq+F/I5WNIam2JS9MQlCHK2nO3D9ckv9Q2CoNms76NC0aZJx1XzFL
24
- ik4M0Ite75Hbx/Of0UsSF7OAv5sHinGMivG9NfrfAoGASYwLii8HELbM3OuS9Vut
25
- wcQuDePXVekfxcwRwUfTdbYJzV3s6sBd3L5SYG9iYJeiFO8K46xwukwHpZVRnq72
26
- EB3Vqulm+q3YGLME0Aaf0uC/wzUDNCmZ6EWSRyZnAkKFwWzwlB2MHCK45UiGGFCt
27
- WGzVQcRyYuTdGCpS08HVIOg=
2
+ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDA/HV0YoD7zmrM
3
+ +IwncAJLHH7ld0deBjC4tIPzv06sGwOqLgnUy5zSjHIb5k7/ojuyW1KQ1dcWU3az
4
+ yj6To9Sl7aieuzHbobsUM7jSKTmCk5zowjZa9JSmU3gP/Ma2/IptvtkWoa8oTCU9
5
+ /iisjLugVBUNyAjSObIWOqtLDlXgHjfX7U/PhrZmQaAC6Z33uHB+J+L3tQq1B7fx
6
+ bNDuW1qQhdTodZ7ecKeyYXZ6uGP961+WyUWFIkLJxYojXYI9QwEfOIMQN3H9LqaP
7
+ m7ZsYtdzUfKcWryRRHiejUALNdkDIpLYixfPsoVzBty2uVE4qFb0vuWA9pVhIdIx
8
+ zAmQbvxnAgMBAAECggEAPzp3wQoE+HtIwp8sTD+GgNV1Pfk2iLe+fsWl9dZYEEtJ
9
+ iBhNYErVtqYNPNbYSyj8JhOFma52KfpuiblZh0XGBhc3h8oNK8hxYs0PYMvg68cx
10
+ QZFf/azkhxoR3CsVcB6NvCcrOR8AJFPOX+FFskLptj3WKA3B1h7RGjdep9iqiiLK
11
+ fxMAJgZE0QYcvAzLcLKYIGvRgVRx9Koq3v+2pRUhcI75e+QSFuXf+NpETVCMlr8i
12
+ o0wJsl1gyCOVpsxv1FgUWFs8BT1mawbKK3z0sJ1FT6sICeGtb3O/cV3QhGieJRS7
13
+ A8p8cCa/4+FXAiXExniABDcZwoft/c0AZh0k4mfKAQKBgQDsG94VmPc8CnKbOXZy
14
+ UkXyPOhp571qMRGR1znVtiZ7nuExSsep7rguE3a8z9ELdhtXDC3Z16UGAfu0B5tO
15
+ tWDjaI+0jauHr/YfMOYNm6MwqaxYgfmUumVhHzxHLu1HNu5NIab1sdrrSUZqPWqa
16
+ DzFOTlw8HUQKEce/EcPjJZ1caQKBgQDRPpG3b1SYOJQZvqdZdWYt6LAwarK5NKbM
17
+ Vfi7ctH6uiCDcE7Kpc0vnvxPIhImFTeBEqKDu4VnEDml6cErIMdOWiVSIPSxvHeb
18
+ wQ6NLybINQpsEkByy2ln7+W+FHLjR5d3ZrTScVtqulVNCxYq/4e+Su0teKkw0kXg
19
+ J7EISFS4TwKBgQDK8jk2v0Dj7ucL3ZyeL3HIAeqT/YmmmX7MqP8hX2w8nhha0jhF
20
+ LNhLYpeRO+AnxeFCNUnEEcPbIiFEYbVxNh6N2faL76oc+3bG4LUdxUXEMlPdz/rD
21
+ iGRT0xFw7jkuGV1EF0T3s2TFETrhXuEegyiScnB9i3pMXXQgHBkQSei04QKBgDFP
22
+ 8p1tYl1hcB3FHcFqdoM5RFSUwLv/GZQsaqsaezwAo2r2i8scWgfwCvxHRkmtVGBZ
23
+ 2Oz8w4qvezaLqVeVqQLhIcyCMci1ZubRD7HcO+KRBXzErGWhZJz3H4i1XwILPDoK
24
+ fXDfADFd6n52r2nAwOfq1oyR1CXKWGdkU0dlbHnnAoGAGxJ3vRghrEMx3FjUo59S
25
+ sjFZUuTNdyZZFGV5ljlqYT//h4meLqENAXaqZ+shGc5Fkd8vqOO9m2dWyP5fANLo
26
+ Q+ll6+24umDaKOKTJ3uZ1Y1lNjNsf3NyCgljvFp7zUEesCZTP9I0ZpPPb2pPXAHw
27
+ vE2wID0n9rOdFO88j56f6z0=
28
28
  -----END PRIVATE KEY-----
@@ -1,19 +1,19 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIDCTCCAfGgAwIBAgIUEJaSr5fWCwdYr5J5IwlBQ4WCJqcwDQYJKoZIhvcNAQEL
3
- BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI0MDEyMjIwNTAxNloXDTI1MDEy
4
- MTIwNTAxNlowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
5
- AAOCAQ8AMIIBCgKCAQEAtjPaGfRaN92CXOKST/XCEdBu3AK9W9c9W3RGzWfKhK40
6
- B7ZIbEIifkAy96JBziBCeOPs98ie5gueyqvGy/H+Vr0lDdGZU72cYGh2C7DVCTQ8
7
- ZRXZ9QBpfyRHVmJwVx/KfmZMdeLJqz/Gt3eyy9x7qe0N363q7MB09YR8MUgEPRHC
8
- wmCUNoYmGbZHX8/4KVkR3yq67PhGMAj5/OElj2LSGfx4nQdd3QcHn2KCh/bZKhf1
9
- NPMgMUPmn8wazGy0IX2XguecVdw+TATgbGwpDBuAwsfcjNzgCwK5qQIntumoUjEl
10
- 0A/hyIhsHAFAe/4ID8+DWK16dMZLfjnrFtE6A35stQIDAQABo1MwUTAdBgNVHQ4E
11
- FgQUt3Zr2J0e25cf2KfYRlQuRmFk4jQwHwYDVR0jBBgwFoAUt3Zr2J0e25cf2KfY
12
- RlQuRmFk4jQwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAU6vo
13
- pod8A+W98ufblViqJHoSvs1p7wq2bYOR9natW9Dn8HEf75kxz+QcYIeD9DS4SRFW
14
- 93FvbLWIC+l9acXFrgNCN17+r2wzIKQ3NbORiaPi6WRcNd6h8fYTU3EgsC+Wm9EF
15
- MeRxgscOuZVx3gcib6BP6Q1wWL4VdqDKApoN3IOX/rOQNdFckn48XGLxTfQCJWtL
16
- 5J1jWaqf2H0eSSuDXbHINOA6WRNLaMKUAc0Po4zl5lxfRCSUI3M1SHgaaYtdSNKy
17
- fhyKYhkIOuc3zlwVOfr6gK0NwMasuvPpYIYiM+re2IIfvhSpPs7iEVueZmWUXYUV
18
- mr1gzRPv5N321GdYuw==
2
+ MIIDCTCCAfGgAwIBAgIUK/pAQEwJJMgHkQ4n58nNO/cwsNcwDQYJKoZIhvcNAQEL
3
+ BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI0MDMyOTE3MDU0OFoXDTI1MDMy
4
+ OTE3MDU0OFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
5
+ AAOCAQ8AMIIBCgKCAQEAwPx1dGKA+85qzPiMJ3ACSxx+5XdHXgYwuLSD879OrBsD
6
+ qi4J1Muc0oxyG+ZO/6I7sltSkNXXFlN2s8o+k6PUpe2onrsx26G7FDO40ik5gpOc
7
+ 6MI2WvSUplN4D/zGtvyKbb7ZFqGvKEwlPf4orIy7oFQVDcgI0jmyFjqrSw5V4B43
8
+ 1+1Pz4a2ZkGgAumd97hwfifi97UKtQe38WzQ7ltakIXU6HWe3nCnsmF2erhj/etf
9
+ lslFhSJCycWKI12CPUMBHziDEDdx/S6mj5u2bGLXc1HynFq8kUR4no1ACzXZAyKS
10
+ 2IsXz7KFcwbctrlROKhW9L7lgPaVYSHSMcwJkG78ZwIDAQABo1MwUTAdBgNVHQ4E
11
+ FgQUNVa/M6yDr6zThWXt51Ag6kZlAaYwHwYDVR0jBBgwFoAUNVa/M6yDr6zThWXt
12
+ 51Ag6kZlAaYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAGYjh
13
+ ykXpTW2OcRUM6xPcp9MGdr/b1V1sQQ2OI4GXBuBuqBybY1mROSvprzmEre+SslWI
14
+ joR/wepusgPsoWl54Gylg1eir4xWPq06U6KkNtngMpwHO1ln97Fw6eEND0bJWcn3
15
+ HKagaqOd96vNii4AjMeQnncNUqQGfizDjEOwDY0JY6A4DDjf+Zud6dcpkr7emZby
16
+ 3ZQEQ5Jzt2aCqmc1Dzbw2RE/mnlcc87x0jWXyTGVC+L+e08et8WLPFcDtgVa+2L0
17
+ NSVE+P9vchDdX8oHcqGovC0LZibkJZ46oNtqeQQ5/LN2P3Zk6dji4BI7u//U03Gf
18
+ ko5df8qJp7CXHrl6+Q==
19
19
  -----END CERTIFICATE-----
@@ -49,6 +49,7 @@ export default class CommandManager {
49
49
  const lintOptions = {
50
50
  verbose: options.verbose,
51
51
  fix: options.fix,
52
+ useDefault: options.useDefault
52
53
  };
53
54
  const visual = new VisualManager(rootPath).prepareVisual(options.pbivizFile);
54
55
  await visual.runLintValidation(lintOptions);
@@ -1,37 +1,44 @@
1
1
  import { ESLint } from "eslint";
2
+ import path from 'path';
3
+ import fs from 'fs';
2
4
  import ConsoleWriter from "./ConsoleWriter.js";
3
5
  import { fileExists, getRootPath } from "./utils.js";
4
6
  export class LintValidator {
5
7
  visualPath;
6
8
  rootPath;
9
+ isVerboseMode;
10
+ useDefault;
11
+ shouldFix;
7
12
  config;
8
- defaultConfig;
9
13
  linterInstance;
10
- constructor(fix = false) {
14
+ constructor({ verbose, fix, useDefault }) {
11
15
  this.visualPath = process.cwd();
12
16
  this.rootPath = getRootPath();
13
- this.prepareConfig(fix);
17
+ this.isVerboseMode = verbose;
18
+ this.useDefault = useDefault;
19
+ this.shouldFix = fix;
20
+ this.prepareConfig();
14
21
  this.linterInstance = new ESLint(this.config);
15
22
  }
16
23
  /**
17
24
  * Runs lint validation in the visual folder
18
25
  */
19
- async runLintValidation({ verbose, fix }) {
26
+ async runLintValidation() {
20
27
  ConsoleWriter.info("Running lint check...");
21
28
  // By default it will lint all files in the src of current working directory, but some files can be excluded in .eslintignore
22
- const results = await this.linterInstance.lintFiles("src/**/*");
23
- if (fix) {
29
+ const results = await this.linterInstance.lintFiles("src/");
30
+ if (this.shouldFix) {
24
31
  await this.fixErrors(results);
25
32
  }
26
- await this.outputResults(results, verbose);
33
+ await this.outputResults(results);
27
34
  ConsoleWriter.info("Lint check completed.");
28
35
  }
29
36
  async fixErrors(results) {
30
37
  ConsoleWriter.info("Lint fixing errors...");
31
38
  await ESLint.outputFixes(results);
32
39
  }
33
- async outputResults(results, verbose) {
34
- if (verbose) {
40
+ async outputResults(results) {
41
+ if (this.isVerboseMode) {
35
42
  const formatter = await this.linterInstance.loadFormatter("stylish");
36
43
  const formattedResults = await formatter.format(results);
37
44
  console.log(formattedResults);
@@ -46,33 +53,42 @@ export class LintValidator {
46
53
  }
47
54
  }
48
55
  }
49
- prepareConfig(fix) {
50
- this.defaultConfig = {
51
- overrideConfig: {
52
- env: {
53
- browser: true,
54
- es6: true,
55
- es2022: true
56
- },
57
- plugins: [
58
- "powerbi-visuals"
59
- ],
60
- extends: [
61
- "plugin:powerbi-visuals/recommended"
62
- ]
63
- },
64
- extensions: [".ts", ".tsx"],
65
- resolvePluginsRelativeTo: this.rootPath,
66
- useEslintrc: false,
67
- fix
56
+ prepareConfig() {
57
+ const requiredConfig = {
58
+ extensions: [".js", ".jsx", ".ts", ".tsx"],
59
+ fix: this.shouldFix,
60
+ resolvePluginsRelativeTo: this.getPluginPath()
68
61
  };
69
- const eslintrcExtensions = ['.json', '.js', '.ts'];
70
- if (eslintrcExtensions.some(el => fileExists(this.visualPath, `.eslintrc${el}`))) {
71
- this.config = { fix };
62
+ const eslintrcExtensions = ['.json', '.js', '.cjs', '.ts', ''];
63
+ if (!this.useDefault && eslintrcExtensions.some(el => fileExists(this.visualPath, `.eslintrc${el}`))) {
64
+ this.config = requiredConfig;
72
65
  }
73
66
  else {
74
- ConsoleWriter.warning("No .eslintrc file found in the visual folder. Using default config.");
75
- this.config = this.defaultConfig;
67
+ ConsoleWriter.warning("Using recommended eslint config.");
68
+ this.config = {
69
+ ...requiredConfig,
70
+ overrideConfig: {
71
+ env: {
72
+ browser: true,
73
+ es6: true,
74
+ es2022: true
75
+ },
76
+ plugins: [
77
+ "powerbi-visuals"
78
+ ],
79
+ extends: [
80
+ "plugin:powerbi-visuals/recommended"
81
+ ]
82
+ },
83
+ useEslintrc: false,
84
+ };
76
85
  }
77
86
  }
87
+ getPluginPath() {
88
+ const pluginPaths = [
89
+ path.resolve(this.visualPath, "node_modules", "eslint-plugin-powerbi-visuals"),
90
+ path.resolve(this.rootPath, "node_modules", "eslint-plugin-powerbi-visuals")
91
+ ];
92
+ return pluginPaths.find(fs.existsSync);
93
+ }
78
94
  }
@@ -68,9 +68,17 @@ export default class VisualManager {
68
68
  }
69
69
  return this;
70
70
  }
71
- runLintValidation(options) {
72
- const linter = new LintValidator(options.fix);
73
- linter.runLintValidation(options);
71
+ async runLintValidation(options) {
72
+ try {
73
+ const linter = new LintValidator(options);
74
+ await linter.runLintValidation();
75
+ }
76
+ catch (error) {
77
+ ConsoleWriter.error("Can't run lint validation.");
78
+ if (options.verbose) {
79
+ ConsoleWriter.error(error.message);
80
+ }
81
+ }
74
82
  }
75
83
  createVisualInstance() {
76
84
  this.capabilities = readJsonFromVisual("capabilities.json", this.basePath);
@@ -10,6 +10,7 @@ const webpackConfig = {
10
10
  'visual.js': ['./src/visual.ts']
11
11
  },
12
12
  target: 'web',
13
+ node: false,
13
14
  devtool: false,
14
15
  mode: "production",
15
16
  optimization: {
@@ -71,7 +72,7 @@ const webpackConfig = {
71
72
  "powerbi-visuals-api": 'null'
72
73
  },
73
74
  resolve: {
74
- extensions: ['.tsx', '.ts', '.jsx', '.js', '.css'],
75
+ extensions: ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.css'],
75
76
  modules: ['node_modules', path.resolve(rootPath, 'node_modules')],
76
77
  fallback: {
77
78
  assert: "assert",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powerbi-visuals-tools",
3
- "version": "5.4.1",
3
+ "version": "5.4.3",
4
4
  "description": "Command line tool for creating and publishing visuals for Power BI",
5
5
  "main": "./bin/pbiviz.js",
6
6
  "type": "module",
@@ -29,7 +29,7 @@
29
29
  },
30
30
  "homepage": "https://github.com/Microsoft/PowerBI-visuals-tools#readme",
31
31
  "dependencies": {
32
- "@typescript-eslint/parser": "^6.17.0",
32
+ "@typescript-eslint/parser": "^6.21.0",
33
33
  "assert": "^2.1.0",
34
34
  "async": "^3.2.5",
35
35
  "browserify-zlib": "^0.2.0",
@@ -40,13 +40,13 @@
40
40
  "console-browserify": "^1.2.0",
41
41
  "constants-browserify": "^1.0.0",
42
42
  "crypto-browserify": "^3.12.0",
43
- "css-loader": "^6.8.1",
43
+ "css-loader": "^6.10.0",
44
44
  "domain-browser": "^5.7.0",
45
45
  "events": "^3.3.0",
46
46
  "extra-watch-webpack-plugin": "^1.0.3",
47
47
  "fs-extra": "^11.2.0",
48
48
  "https-browserify": "^1.0.0",
49
- "inline-source-map": "^0.6.2",
49
+ "inline-source-map": "^0.6.3",
50
50
  "json-loader": "0.5.7",
51
51
  "jszip": "^3.10.1",
52
52
  "less": "^4.2.0",
@@ -55,7 +55,7 @@
55
55
  "lodash.defaults": "4.2.0",
56
56
  "lodash.isequal": "4.5.0",
57
57
  "lodash.ismatch": "^4.4.0",
58
- "mini-css-extract-plugin": "^2.7.6",
58
+ "mini-css-extract-plugin": "^2.8.1",
59
59
  "os-browserify": "^0.3.0",
60
60
  "path-browserify": "^1.0.1",
61
61
  "powerbi-visuals-webpack-plugin": "4.1.0",
@@ -74,17 +74,17 @@
74
74
  "url": "^0.11.3",
75
75
  "util": "^0.12.5",
76
76
  "vm-browserify": "^1.1.2",
77
- "webpack": "^5.89.0",
77
+ "webpack": "^5.91.0",
78
78
  "webpack-bundle-analyzer": "4.10.1",
79
- "webpack-dev-server": "^4.15.1"
79
+ "webpack-dev-server": "^4.15.2"
80
80
  },
81
81
  "devDependencies": {
82
- "@typescript-eslint/eslint-plugin": "^6.17.0",
83
- "eslint": "^8.56.0",
82
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
83
+ "eslint": "^8.57.0",
84
84
  "eslint-plugin-powerbi-visuals": "^0.8.1",
85
85
  "jasmine": "5.1.0",
86
86
  "jasmine-spec-reporter": "7.0.0",
87
- "semver": "7.5.4",
87
+ "semver": "7.6.0",
88
88
  "tree-kill": "1.2.2",
89
89
  "webpack-cli": "^5.1.4"
90
90
  },