@pagopa/dx-savemoney 0.6.1 → 0.6.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.
Files changed (118) hide show
  1. package/dist/azure/pricing/pricing-service.d.ts.map +1 -1
  2. package/dist/azure/pricing/pricing-service.js +6 -1
  3. package/dist/azure/pricing/pricing-service.js.map +1 -1
  4. package/dist/azure/pricing/schema.d.ts.map +1 -1
  5. package/dist/azure/pricing/schema.js +22 -14
  6. package/dist/azure/pricing/schema.js.map +1 -1
  7. package/dist/azure/resources/app-service.d.ts.map +1 -1
  8. package/dist/azure/resources/app-service.js +2 -2
  9. package/dist/azure/resources/app-service.js.map +1 -1
  10. package/dist/azure/resources/container-app.d.ts.map +1 -1
  11. package/dist/azure/resources/container-app.js +1 -1
  12. package/dist/azure/resources/container-app.js.map +1 -1
  13. package/dist/azure/resources/disk.js +3 -1
  14. package/dist/azure/resources/disk.js.map +1 -1
  15. package/dist/azure/resources/nic.js +3 -1
  16. package/dist/azure/resources/nic.js.map +1 -1
  17. package/dist/azure/resources/private-endpoint.d.ts.map +1 -1
  18. package/dist/azure/resources/private-endpoint.js +1 -1
  19. package/dist/azure/resources/private-endpoint.js.map +1 -1
  20. package/dist/azure/resources/public-ip.d.ts.map +1 -1
  21. package/dist/azure/resources/public-ip.js +4 -2
  22. package/dist/azure/resources/public-ip.js.map +1 -1
  23. package/dist/azure/resources/static-web-app.d.ts.map +1 -1
  24. package/dist/azure/resources/static-web-app.js +1 -1
  25. package/dist/azure/resources/static-web-app.js.map +1 -1
  26. package/dist/azure/resources/vm.js +6 -2
  27. package/dist/azure/resources/vm.js.map +1 -1
  28. package/dist/azure/utils.d.ts.map +1 -1
  29. package/dist/azure/utils.js +7 -2
  30. package/dist/azure/utils.js.map +1 -1
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/telemetry/savemoney-command-telemetry.d.ts +20 -0
  36. package/dist/telemetry/savemoney-command-telemetry.d.ts.map +1 -0
  37. package/dist/telemetry/savemoney-command-telemetry.js +42 -0
  38. package/dist/telemetry/savemoney-command-telemetry.js.map +1 -0
  39. package/package.json +1 -8
  40. package/src/__tests__/savemoney-command-telemetry.test.ts +117 -0
  41. package/src/azure/pricing/__tests__/schema.test.ts +30 -0
  42. package/src/azure/pricing/pricing-service.ts +6 -3
  43. package/src/azure/pricing/schema.ts +22 -14
  44. package/src/azure/resources/app-service.ts +4 -2
  45. package/src/azure/resources/container-app.ts +2 -1
  46. package/src/azure/resources/disk.ts +3 -3
  47. package/src/azure/resources/nic.ts +3 -3
  48. package/src/azure/resources/private-endpoint.ts +2 -1
  49. package/src/azure/resources/public-ip.ts +5 -4
  50. package/src/azure/resources/static-web-app.ts +2 -1
  51. package/src/azure/resources/vm.ts +6 -6
  52. package/src/azure/utils.ts +8 -2
  53. package/src/index.ts +7 -0
  54. package/src/telemetry/savemoney-command-telemetry.ts +83 -0
  55. package/dist/__tests__/finding.test.d.ts +0 -17
  56. package/dist/__tests__/finding.test.d.ts.map +0 -1
  57. package/dist/__tests__/finding.test.js +0 -146
  58. package/dist/__tests__/finding.test.js.map +0 -1
  59. package/dist/azure/__tests__/analyzer-tags.test.d.ts +0 -8
  60. package/dist/azure/__tests__/analyzer-tags.test.d.ts.map +0 -1
  61. package/dist/azure/__tests__/analyzer-tags.test.js +0 -70
  62. package/dist/azure/__tests__/analyzer-tags.test.js.map +0 -1
  63. package/dist/azure/__tests__/azqr.test.d.ts +0 -13
  64. package/dist/azure/__tests__/azqr.test.d.ts.map +0 -1
  65. package/dist/azure/__tests__/azqr.test.js +0 -177
  66. package/dist/azure/__tests__/azqr.test.js.map +0 -1
  67. package/dist/azure/__tests__/config.test.d.ts +0 -9
  68. package/dist/azure/__tests__/config.test.d.ts.map +0 -1
  69. package/dist/azure/__tests__/config.test.js +0 -102
  70. package/dist/azure/__tests__/config.test.js.map +0 -1
  71. package/dist/azure/__tests__/report.test.d.ts +0 -9
  72. package/dist/azure/__tests__/report.test.d.ts.map +0 -1
  73. package/dist/azure/__tests__/report.test.js +0 -191
  74. package/dist/azure/__tests__/report.test.js.map +0 -1
  75. package/dist/azure/__tests__/utils.test.d.ts +0 -15
  76. package/dist/azure/__tests__/utils.test.d.ts.map +0 -1
  77. package/dist/azure/__tests__/utils.test.js +0 -181
  78. package/dist/azure/__tests__/utils.test.js.map +0 -1
  79. package/dist/azure/analyzers/__tests__/advisor.test.d.ts +0 -9
  80. package/dist/azure/analyzers/__tests__/advisor.test.d.ts.map +0 -1
  81. package/dist/azure/analyzers/__tests__/advisor.test.js +0 -314
  82. package/dist/azure/analyzers/__tests__/advisor.test.js.map +0 -1
  83. package/dist/azure/pricing/__tests__/cache.test.d.ts +0 -8
  84. package/dist/azure/pricing/__tests__/cache.test.d.ts.map +0 -1
  85. package/dist/azure/pricing/__tests__/cache.test.js +0 -56
  86. package/dist/azure/pricing/__tests__/cache.test.js.map +0 -1
  87. package/dist/azure/pricing/__tests__/client.test.d.ts +0 -9
  88. package/dist/azure/pricing/__tests__/client.test.d.ts.map +0 -1
  89. package/dist/azure/pricing/__tests__/client.test.js +0 -181
  90. package/dist/azure/pricing/__tests__/client.test.js.map +0 -1
  91. package/dist/azure/pricing/__tests__/pricing-service.test.d.ts +0 -6
  92. package/dist/azure/pricing/__tests__/pricing-service.test.d.ts.map +0 -1
  93. package/dist/azure/pricing/__tests__/pricing-service.test.js +0 -283
  94. package/dist/azure/pricing/__tests__/pricing-service.test.js.map +0 -1
  95. package/dist/azure/pricing/resolvers/__tests__/app-service.test.d.ts +0 -5
  96. package/dist/azure/pricing/resolvers/__tests__/app-service.test.d.ts.map +0 -1
  97. package/dist/azure/pricing/resolvers/__tests__/app-service.test.js +0 -137
  98. package/dist/azure/pricing/resolvers/__tests__/app-service.test.js.map +0 -1
  99. package/dist/azure/pricing/resolvers/__tests__/disk.test.d.ts +0 -5
  100. package/dist/azure/pricing/resolvers/__tests__/disk.test.d.ts.map +0 -1
  101. package/dist/azure/pricing/resolvers/__tests__/disk.test.js +0 -160
  102. package/dist/azure/pricing/resolvers/__tests__/disk.test.js.map +0 -1
  103. package/dist/azure/pricing/resolvers/__tests__/public-ip.test.d.ts +0 -5
  104. package/dist/azure/pricing/resolvers/__tests__/public-ip.test.d.ts.map +0 -1
  105. package/dist/azure/pricing/resolvers/__tests__/public-ip.test.js +0 -113
  106. package/dist/azure/pricing/resolvers/__tests__/public-ip.test.js.map +0 -1
  107. package/dist/azure/pricing/resolvers/__tests__/vm.test.d.ts +0 -9
  108. package/dist/azure/pricing/resolvers/__tests__/vm.test.d.ts.map +0 -1
  109. package/dist/azure/pricing/resolvers/__tests__/vm.test.js +0 -204
  110. package/dist/azure/pricing/resolvers/__tests__/vm.test.js.map +0 -1
  111. package/dist/azure/resources/__tests__/app-service.test.d.ts +0 -5
  112. package/dist/azure/resources/__tests__/app-service.test.d.ts.map +0 -1
  113. package/dist/azure/resources/__tests__/app-service.test.js +0 -105
  114. package/dist/azure/resources/__tests__/app-service.test.js.map +0 -1
  115. package/dist/azure/resources/__tests__/storage.test.d.ts +0 -11
  116. package/dist/azure/resources/__tests__/storage.test.d.ts.map +0 -1
  117. package/dist/azure/resources/__tests__/storage.test.js +0 -99
  118. package/dist/azure/resources/__tests__/storage.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-service.test.js","sourceRoot":"","sources":["../../../../src/azure/resources/__tests__/app-service.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Tests for analyzeStorageAccount() — verifies that custom thresholds
3
- * actually change the analysis outcome.
4
- *
5
- * Key scenario:
6
- * - Metric: 30 avg transactions/day
7
- * - Default threshold: 10 → 30 >= 10 → NOT flagged
8
- * - Custom threshold: 50 → 30 < 50 → IS flagged ✓ proves the feature works
9
- */
10
- export {};
11
- //# sourceMappingURL=storage.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.test.d.ts","sourceRoot":"","sources":["../../../../src/azure/resources/__tests__/storage.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -1,99 +0,0 @@
1
- /**
2
- * Tests for analyzeStorageAccount() — verifies that custom thresholds
3
- * actually change the analysis outcome.
4
- *
5
- * Key scenario:
6
- * - Metric: 30 avg transactions/day
7
- * - Default threshold: 10 → 30 >= 10 → NOT flagged
8
- * - Custom threshold: 50 → 30 < 50 → IS flagged ✓ proves the feature works
9
- */
10
- import { beforeEach, describe, expect, it, vi } from "vitest";
11
- import { DEFAULT_THRESHOLDS } from "../../../types.js";
12
- // Mock the utils module so we control getMetric without real Azure calls
13
- vi.mock("../../utils.js", () => ({
14
- getMetric: vi.fn(),
15
- verboseLog: vi.fn(),
16
- verboseLogAnalysisResult: vi.fn(),
17
- verboseLogResourceStart: vi.fn(),
18
- }));
19
- // Import after vi.mock so the module resolves the mock
20
- import { getMetric } from "../../utils.js";
21
- import { analyzeStorageAccount } from "../storage.js";
22
- // ── helpers ────────────────────────────────────────────────────────────────
23
- // Minimal stub: analyzeStorageAccount only needs monitorClient to be passed
24
- // through to getMetric, which is fully mocked. We provide only the shape that
25
- // TypeScript requires without unsafe type assertions.
26
- const FAKE_CLIENT = {
27
- metrics: { list: vi.fn() },
28
- };
29
- const FAKE_RESOURCE = {
30
- id: "/subscriptions/sub1/resourceGroups/rg1/providers/Microsoft.Storage/storageAccounts/st1",
31
- name: "st1",
32
- type: "Microsoft.Storage/storageAccounts",
33
- };
34
- const mockGetMetric = vi.mocked(getMetric);
35
- // ── tests ──────────────────────────────────────────────────────────────────
36
- describe("analyzeStorageAccount — threshold sensitivity", () => {
37
- beforeEach(() => {
38
- mockGetMetric.mockReset();
39
- });
40
- describe("with DEFAULT threshold (transactionsPerDay = 10)", () => {
41
- it("does NOT flag a resource with 30 transactions/day (30 ≥ 10)", async () => {
42
- mockGetMetric.mockResolvedValue(30);
43
- const result = await analyzeStorageAccount(FAKE_RESOURCE, FAKE_CLIENT, 30, DEFAULT_THRESHOLDS);
44
- expect(result.suspectedUnused).toBe(false);
45
- });
46
- it("flags a resource with 5 transactions/day (5 < 10)", async () => {
47
- mockGetMetric.mockResolvedValue(5);
48
- const result = await analyzeStorageAccount(FAKE_RESOURCE, FAKE_CLIENT, 30, DEFAULT_THRESHOLDS);
49
- expect(result.suspectedUnused).toBe(true);
50
- });
51
- it("does not flag when metric is exactly at the threshold (10)", async () => {
52
- mockGetMetric.mockResolvedValue(10);
53
- const result = await analyzeStorageAccount(FAKE_RESOURCE, FAKE_CLIENT, 30, DEFAULT_THRESHOLDS);
54
- // 10 < 10 is false → not flagged
55
- expect(result.suspectedUnused).toBe(false);
56
- });
57
- });
58
- describe("with CUSTOM threshold (transactionsPerDay = 50)", () => {
59
- const customThresholds = {
60
- ...DEFAULT_THRESHOLDS,
61
- storage: { transactionsPerDay: 50 },
62
- };
63
- it("DOES flag a resource with 30 transactions/day (30 < 50) — proves override works", async () => {
64
- mockGetMetric.mockResolvedValue(30);
65
- const result = await analyzeStorageAccount(FAKE_RESOURCE, FAKE_CLIENT, 30, customThresholds);
66
- expect(result.suspectedUnused).toBe(true);
67
- });
68
- it("does NOT flag a resource with 60 transactions/day (60 ≥ 50)", async () => {
69
- mockGetMetric.mockResolvedValue(60);
70
- const result = await analyzeStorageAccount(FAKE_RESOURCE, FAKE_CLIENT, 30, customThresholds);
71
- expect(result.suspectedUnused).toBe(false);
72
- });
73
- it("flags at threshold boundary (49 < 50)", async () => {
74
- mockGetMetric.mockResolvedValue(49);
75
- const result = await analyzeStorageAccount(FAKE_RESOURCE, FAKE_CLIENT, 30, customThresholds);
76
- expect(result.suspectedUnused).toBe(true);
77
- });
78
- });
79
- describe("edge cases", () => {
80
- it("returns suspectedUnused: false when metric is null (data unavailable)", async () => {
81
- mockGetMetric.mockResolvedValue(null);
82
- const result = await analyzeStorageAccount(FAKE_RESOURCE, FAKE_CLIENT, 30, DEFAULT_THRESHOLDS);
83
- expect(result.suspectedUnused).toBe(false);
84
- });
85
- it("returns suspectedUnused: false when resource id is missing", async () => {
86
- const resourceWithoutId = { ...FAKE_RESOURCE, id: undefined };
87
- const result = await analyzeStorageAccount(resourceWithoutId, FAKE_CLIENT, 30, DEFAULT_THRESHOLDS);
88
- expect(result.suspectedUnused).toBe(false);
89
- expect(mockGetMetric).not.toHaveBeenCalled();
90
- });
91
- it("applies default thresholds when the parameter is omitted", async () => {
92
- // 5 < DEFAULT 10 → flagged even without explicit thresholds argument
93
- mockGetMetric.mockResolvedValue(5);
94
- const result = await analyzeStorageAccount(FAKE_RESOURCE, FAKE_CLIENT, 30);
95
- expect(result.suspectedUnused).toBe(true);
96
- });
97
- });
98
- });
99
- //# sourceMappingURL=storage.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../../../src/azure/resources/__tests__/storage.test.ts"],"names":[],"mappings":"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"}