@ovh-ux/manager-static-analysis-kit 0.10.0 → 0.11.1

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.
@@ -9,18 +9,17 @@ import {
9
9
  } from '../dist/adapters/perf-budgets/helpers/perfs-bundle-analysis-helper.js';
10
10
  import { bundleAnalysisConfig } from '../dist/configs/bundle-analysis-config.js';
11
11
  import {
12
- appsDir,
13
12
  bundleAnalyzerBinPath,
14
- outputRootDir,
15
13
  perfBudgetCombinedHtmlReportName,
16
14
  perfBudgetCombinedJsonReportName,
15
+ perfBudgetOutputRootDir,
17
16
  perfBudgetsReportDirName,
18
17
  rootDir,
19
18
  } from './cli-path-config.js';
20
19
  import { parseCliTargets } from './utils/args-parse-utils.js';
21
20
  import { logError, logInfo, logWarn } from './utils/log-utils.js';
22
- import { ensureBinExists, runAppsAnalysis, runCommand } from './utils/runner-utils.js';
23
- import { resolveTurboFilters, runTurboBuild } from './utils/turbo-utils.js';
21
+ import { ensureBinExists, runCommand, runModulesAnalysis } from './utils/runner-utils.js';
22
+ import { runTurboBuild } from './utils/turbo-utils.js';
24
23
 
25
24
  /**
26
25
  * Run vite-bundle-analyzer for a given mode (html or json).
@@ -34,7 +33,7 @@ function runAppBundleAnalyzer(appDir, appShortName, mode) {
34
33
  const reportFile = `${bundleAnalysisConfig?.reportFile || 'bundle-report'}${
35
34
  mode === 'json' ? '.json' : '.html'
36
35
  }`;
37
- const outputDir = path.join(outputRootDir, perfBudgetsReportDirName, appShortName);
36
+ const outputDir = path.join(perfBudgetOutputRootDir, perfBudgetsReportDirName, appShortName);
38
37
  fs.mkdirSync(outputDir, { recursive: true });
39
38
 
40
39
  logInfo(`Running bundle analyzer (${mode}) for ${appShortName} → ${outputDir}`);
@@ -91,25 +90,26 @@ function main() {
91
90
  try {
92
91
  ensureBinExists(bundleAnalyzerBinPath, 'vite-bundle-analyzer');
93
92
 
94
- const { appFolders, packageNames } = parseCliTargets(appsDir);
95
- const turboFilters = resolveTurboFilters({ appsDir, appFolders, packageNames });
93
+ const modules = parseCliTargets();
96
94
 
97
95
  // Step 1: build
98
- runTurboBuild(rootDir, turboFilters, ['--continue']);
96
+ runTurboBuild(
97
+ rootDir,
98
+ modules.map((item) => item.packageName),
99
+ ['--continue'],
100
+ );
99
101
 
100
- // Step 2: analyze apps + combined
101
- runAppsAnalysis({
102
- appsDir,
103
- appFolders,
104
- requireReact: false,
102
+ // Step 2: analyze
103
+ runModulesAnalysis({
104
+ modules,
105
105
  binaryLabel: 'Perf budgets',
106
- appRunner: runAppPerfBudgets,
106
+ analysisRunner: runAppPerfBudgets,
107
107
  reportsRootDirName: perfBudgetsReportDirName,
108
108
  combinedJson: perfBudgetCombinedJsonReportName,
109
109
  combinedHtml: perfBudgetCombinedHtmlReportName,
110
110
  collectFn: collectPerfBudgets,
111
111
  generateHtmlFn: generatePerfBudgetsHtml,
112
- outputRootDir,
112
+ outputRootDir: perfBudgetOutputRootDir,
113
113
  });
114
114
  } catch (err) {
115
115
  logError(`Fatal error: ${err.stack || err.message}`);
@@ -5,8 +5,6 @@ import { logError, logInfo } from './utils/log-utils.js';
5
5
 
6
6
  // Define the set of validation test cases
7
7
  const cases = [
8
- // This case take too much time since it builds all apps, use it only for debug
9
- // { name: 'Auto-discovery (all apps)', cmd: 'yarn manager-perf-budgets', expect: 0 },
10
8
  { name: 'Single app (zimbra)', cmd: 'yarn manager-perf-budgets --app zimbra', expect: 0 },
11
9
  {
12
10
  name: 'Multiple apps (container,zimbra)',
@@ -23,6 +21,36 @@ const cases = [
23
21
  cmd: 'yarn manager-perf-budgets --packages @ovh-ux/manager-zimbra-app,@ovh-ux/manager-pci-workflow-app',
24
22
  expect: 0,
25
23
  },
24
+ {
25
+ name: 'Single library static path by folder name (manager-react-components)',
26
+ cmd: 'yarn manager-perf-budgets --library manager-react-components',
27
+ expect: 0,
28
+ },
29
+ {
30
+ name: 'Single library static path by package name (manager-react-components)',
31
+ cmd: 'yarn manager-perf-budgets --library @ovh-ux/manager-react-components',
32
+ expect: 0,
33
+ },
34
+ {
35
+ name: 'Single library dynamic path by folder name (shell-client)',
36
+ cmd: 'yarn manager-perf-budgets --library shell-client',
37
+ expect: 0,
38
+ },
39
+ {
40
+ name: 'Single library static path by package name (shell-client)',
41
+ cmd: 'yarn manager-perf-budgets --library @ovh-ux/manager-react-shell-client',
42
+ expect: 0,
43
+ },
44
+ {
45
+ name: 'Multiple libraries by folder names (manager-wiki,manager-react-components,shell-client,logs-to-customer)',
46
+ cmd: 'yarn manager-perf-budgets --libraries manager-wiki,manager-react-components,shell-client,logs-to-customer',
47
+ expect: 0,
48
+ },
49
+ {
50
+ name: 'Multiple libraries by package names (manager-wiki,manager-react-components,shell-client,logs-to-customer)',
51
+ cmd: 'yarn manager-perf-budgets --libraries @ovh-ux/manager-wiki,@ovh-ux/manager-react-components,@ovh-ux/manager-react-shell-client,@ovh-ux/logs-to-customer',
52
+ expect: 0,
53
+ },
26
54
  {
27
55
  name: 'Mixed valid+invalid apps',
28
56
  cmd: 'yarn manager-perf-budgets --apps zimbra,unknown-app,container',
@@ -30,7 +58,12 @@ const cases = [
30
58
  },
31
59
  {
32
60
  name: 'Mixed valid+invalid packages',
33
- cmd: 'yarn manager-perf-budgets --packages @ovh-ux/manager-zimbra-app,@ovh-ux/manager-ghost-app',
61
+ cmd: 'yarn manager-perf-budgets --packages @ovh-ux/manager-wiki,manager-react-components,@ovh-ux/manager-ghost-app',
62
+ expect: 0,
63
+ },
64
+ {
65
+ name: 'Mixed valid+invalid libraries',
66
+ cmd: 'yarn manager-perf-budgets --libraries @ovh-ux/manager-zimbra-app,@ovh-ux/manager-ghost-app',
34
67
  expect: 0,
35
68
  },
36
69
  {
@@ -4,9 +4,9 @@ import { writeFileSync } from 'node:fs';
4
4
  import { resolve } from 'node:path';
5
5
  import process from 'node:process';
6
6
 
7
- import { outputRootDir } from './cli-path-config.js';
7
+ import { combinedReportOutputRootDir } from './cli-path-config.js';
8
8
 
9
- const qualityCheckEntryFile = resolve(outputRootDir, 'index.html');
9
+ const qualityCheckEntryFile = resolve(combinedReportOutputRootDir, 'index.html');
10
10
 
11
11
  const isTests = process.argv.includes('--tests');
12
12
 
@@ -3,14 +3,12 @@ import { spawnSync } from 'node:child_process';
3
3
 
4
4
  import { logError, logInfo } from './utils/log-utils.js';
5
5
 
6
+ // Define the set of validation test cases
6
7
  const cases = [
7
- // Debug only — very slow, runs across all apps
8
- // { name: 'Auto-discovery (all apps)', cmd: 'yarn manager-tests-coverage', expect: 0 },
9
-
10
8
  { name: 'Single app (zimbra)', cmd: 'yarn manager-tests-coverage --app zimbra', expect: 0 },
11
9
  {
12
- name: 'Multiple apps (container,zimbra,web-ongoing-operations,key-management-service)',
13
- cmd: 'yarn manager-tests-coverage --apps container,zimbra,web-ongoing-operations,key-management-service',
10
+ name: 'Multiple apps (container,zimbra)',
11
+ cmd: 'yarn manager-tests-coverage --apps container,zimbra',
14
12
  expect: 0,
15
13
  },
16
14
  {
@@ -23,6 +21,36 @@ const cases = [
23
21
  cmd: 'yarn manager-tests-coverage --packages @ovh-ux/manager-zimbra-app,@ovh-ux/manager-pci-workflow-app',
24
22
  expect: 0,
25
23
  },
24
+ {
25
+ name: 'Single library static path by folder name (manager-react-components)',
26
+ cmd: 'yarn manager-tests-coverage --library manager-react-components',
27
+ expect: 0,
28
+ },
29
+ {
30
+ name: 'Single library static path by package name (manager-react-components)',
31
+ cmd: 'yarn manager-tests-coverage --library @ovh-ux/manager-react-components',
32
+ expect: 0,
33
+ },
34
+ {
35
+ name: 'Single library dynamic path by folder name (shell-client)',
36
+ cmd: 'yarn manager-tests-coverage --library shell-client',
37
+ expect: 0,
38
+ },
39
+ {
40
+ name: 'Single library static path by package name (shell-client)',
41
+ cmd: 'yarn manager-tests-coverage --library @ovh-ux/manager-react-shell-client',
42
+ expect: 0,
43
+ },
44
+ {
45
+ name: 'Multiple libraries by folder names (manager-wiki,manager-react-components,shell-client,logs-to-customer)',
46
+ cmd: 'yarn manager-tests-coverage --libraries manager-wiki,manager-react-components,shell-client,logs-to-customer',
47
+ expect: 0,
48
+ },
49
+ {
50
+ name: 'Multiple libraries by package names (manager-wiki,manager-react-components,shell-client,logs-to-customer)',
51
+ cmd: 'yarn manager-tests-coverage --libraries @ovh-ux/manager-wiki,@ovh-ux/manager-react-components,@ovh-ux/manager-react-shell-client,@ovh-ux/logs-to-customer',
52
+ expect: 0,
53
+ },
26
54
  {
27
55
  name: 'Mixed valid+invalid apps',
28
56
  cmd: 'yarn manager-tests-coverage --apps zimbra,unknown-app,container',
@@ -30,7 +58,12 @@ const cases = [
30
58
  },
31
59
  {
32
60
  name: 'Mixed valid+invalid packages',
33
- cmd: 'yarn manager-tests-coverage --packages @ovh-ux/manager-zimbra-app,@ovh-ux/manager-ghost-app',
61
+ cmd: 'yarn manager-tests-coverage --packages @ovh-ux/manager-wiki,manager-react-components,@ovh-ux/manager-ghost-app',
62
+ expect: 0,
63
+ },
64
+ {
65
+ name: 'Mixed valid+invalid libraries',
66
+ cmd: 'yarn manager-tests-coverage --libraries @ovh-ux/manager-zimbra-app,@ovh-ux/manager-ghost-app',
34
67
  expect: 0,
35
68
  },
36
69
  {
@@ -43,6 +76,11 @@ const cases = [
43
76
  cmd: 'yarn manager-tests-coverage --packages @ovh-ux/manager-ghost-app,@ovh-ux/manager-missing-app',
44
77
  expect: 1,
45
78
  },
79
+ {
80
+ name: 'Turbo build failure simulation (pci-ai-tools)',
81
+ cmd: 'yarn manager-tests-coverage --app pci-ai-tools',
82
+ expect: 0,
83
+ },
46
84
  ];
47
85
 
48
86
  let failed = 0;
@@ -8,17 +8,16 @@ import {
8
8
  generateTestsCoverageHtml,
9
9
  } from '../dist/adapters/tests-coverage/helpers/tests-coverage-analysis-helper.js';
10
10
  import {
11
- appsDir,
12
- outputRootDir,
13
11
  rootDir,
14
12
  testsCoverageCombinedHtmlReportName,
15
13
  testsCoverageCombinedJsonReportName,
14
+ testsCoverageOutputRootDir,
16
15
  testsCoverageReportsRootDirName,
17
16
  } from './cli-path-config.js';
18
17
  import { parseCliTargets } from './utils/args-parse-utils.js';
19
18
  import { logError, logInfo, logWarn } from './utils/log-utils.js';
20
- import { runAppsAnalysis } from './utils/runner-utils.js';
21
- import { resolveTurboFilters, runTurboBuild, runTurboTests } from './utils/turbo-utils.js';
19
+ import { runModulesAnalysis } from './utils/runner-utils.js';
20
+ import { runTurboBuild, runTurboTests } from './utils/turbo-utils.js';
22
21
 
23
22
  /**
24
23
  * Locate common coverage artifacts inside an app directory.
@@ -63,7 +62,11 @@ function findCoverageFiles(appDir) {
63
62
  */
64
63
  function harvestAppCoverage(appDir, appShortName) {
65
64
  const { summary, lcov } = findCoverageFiles(appDir);
66
- const outDir = path.join(outputRootDir, testsCoverageReportsRootDirName, appShortName);
65
+ const outDir = path.join(
66
+ testsCoverageOutputRootDir,
67
+ testsCoverageReportsRootDirName,
68
+ appShortName,
69
+ );
67
70
  fs.mkdirSync(outDir, { recursive: true });
68
71
 
69
72
  if (!summary) {
@@ -89,34 +92,39 @@ function harvestAppCoverage(appDir, appShortName) {
89
92
  */
90
93
  function main() {
91
94
  try {
92
- const { appFolders, packageNames } = parseCliTargets(appsDir);
93
- const turboFilters = resolveTurboFilters({ appsDir, appFolders, packageNames });
95
+ const modules = parseCliTargets();
94
96
 
95
97
  // 1) Build all selected targets (best-effort)
96
- runTurboBuild(rootDir, turboFilters, ['--continue']);
98
+ runTurboBuild(
99
+ rootDir,
100
+ modules.map((item) => item.packageName),
101
+ ['--continue'],
102
+ );
97
103
 
98
104
  // 2) Run tests with coverage; keep args minimal for Vitest/Jest compatibility
99
105
  // (Projects should already be configured to emit json-summary/lcov.)
100
- runTurboTests(rootDir, turboFilters, [
101
- '--continue', // turbo: keep going even if some tests fail
102
- '--', // pass the rest to the test runner
103
- '--coverage',
104
- '--coverage.reportOnFailure',
105
- '--coverage.reporter',
106
- 'json-summary',
107
- '--coverage.reporter',
108
- 'lcov',
109
- '--coverage.reporter',
110
- 'html',
111
- ]);
106
+ runTurboTests(
107
+ rootDir,
108
+ modules.map((item) => item.packageName),
109
+ [
110
+ '--continue', // turbo: keep going even if some tests fail
111
+ '--', // pass the rest to the test runner
112
+ '--coverage',
113
+ '--coverage.reportOnFailure',
114
+ '--coverage.reporter',
115
+ 'json-summary',
116
+ '--coverage.reporter',
117
+ 'lcov',
118
+ '--coverage.reporter',
119
+ 'html',
120
+ ],
121
+ );
112
122
 
113
123
  // 3) Per-app harvest + combined reports
114
- runAppsAnalysis({
115
- appsDir,
116
- appFolders,
117
- requireReact: false,
124
+ runModulesAnalysis({
125
+ modules,
118
126
  binaryLabel: 'Tests coverage',
119
- appRunner: harvestAppCoverage,
127
+ analysisRunner: harvestAppCoverage,
120
128
  reportsRootDirName: testsCoverageReportsRootDirName,
121
129
  combinedJson: testsCoverageCombinedJsonReportName,
122
130
  combinedHtml: testsCoverageCombinedHtmlReportName,
@@ -124,9 +132,9 @@ function main() {
124
132
  generateHtmlFn: (combined) =>
125
133
  generateTestsCoverageHtml(
126
134
  combined,
127
- path.join(outputRootDir, testsCoverageReportsRootDirName),
135
+ path.join(testsCoverageOutputRootDir, testsCoverageReportsRootDirName),
128
136
  ),
129
- outputRootDir,
137
+ outputRootDir: testsCoverageOutputRootDir,
130
138
  });
131
139
  } catch (err) {
132
140
  logError(`Fatal error: ${err.stack || err.message}`);
@@ -9,16 +9,15 @@ import {
9
9
  generateTypesCoverageHtml,
10
10
  } from '../dist/adapters/types-coverage/helpers/types-coverage-analysis-helper.js';
11
11
  import {
12
- appsDir,
13
- outputRootDir,
14
12
  tsTypesCoverageBin,
15
13
  typesCoverageCombinedHtmlReportName,
16
14
  typesCoverageCombinedJsonReportName,
15
+ typesCoverageOutputRootDir,
17
16
  typesCoverageReportsRootDirName,
18
17
  } from './cli-path-config.js';
19
18
  import { buildTypesCoverageArgs, parseCliTargets } from './utils/args-parse-utils.js';
20
19
  import { logError, logInfo, logWarn } from './utils/log-utils.js';
21
- import { ensureBinExists, runAppsAnalysis, runCommand } from './utils/runner-utils.js';
20
+ import { ensureBinExists, runCommand, runModulesAnalysis } from './utils/runner-utils.js';
22
21
 
23
22
  /**
24
23
  * Temporarily strip "extends" from tsconfig.json before analysis,
@@ -131,7 +130,7 @@ export function countLooseTypes(appDir) {
131
130
  function runAppTypesCoverage(appDir, appShortName) {
132
131
  return patchTsConfig(appDir, () => {
133
132
  const absoluteOutputDir = path.join(
134
- outputRootDir,
133
+ typesCoverageOutputRootDir,
135
134
  typesCoverageReportsRootDirName,
136
135
  appShortName,
137
136
  );
@@ -171,20 +170,18 @@ function main() {
171
170
  try {
172
171
  ensureBinExists(tsTypesCoverageBin, 'typescript-coverage-report');
173
172
 
174
- const { appFolders } = parseCliTargets(appsDir);
173
+ const modules = parseCliTargets();
175
174
 
176
- runAppsAnalysis({
177
- appsDir,
178
- appFolders,
179
- requireReact: true,
175
+ runModulesAnalysis({
176
+ modules,
180
177
  binaryLabel: 'Type coverage',
181
- appRunner: runAppTypesCoverage,
178
+ analysisRunner: runAppTypesCoverage,
182
179
  reportsRootDirName: typesCoverageReportsRootDirName,
183
180
  combinedJson: typesCoverageCombinedJsonReportName,
184
181
  combinedHtml: typesCoverageCombinedHtmlReportName,
185
182
  collectFn: collectTypesCoverage,
186
183
  generateHtmlFn: generateTypesCoverageHtml,
187
- outputRootDir,
184
+ outputRootDir: typesCoverageOutputRootDir,
188
185
  });
189
186
  } catch (err) {
190
187
  logError(`Fatal error: ${err.stack || err.message}`);
@@ -3,15 +3,12 @@ import { spawnSync } from 'node:child_process';
3
3
 
4
4
  import { logError, logInfo } from './utils/log-utils.js';
5
5
 
6
- // Define the set of validation test cases for types-coverage-tests CLI
6
+ // Define the set of validation test cases
7
7
  const cases = [
8
- // Debug only — very slow, runs across all apps
9
- // { name: 'Auto-discovery (all apps)', cmd: 'yarn manager-types-coverage', expect: 0 },
10
-
11
8
  { name: 'Single app (zimbra)', cmd: 'yarn manager-types-coverage --app zimbra', expect: 0 },
12
9
  {
13
- name: 'Multiple apps (container,zimbra,web-ongoing-operations,key-management-service)',
14
- cmd: 'yarn manager-types-coverage --apps container,zimbra,web-ongoing-operations,key-management-service',
10
+ name: 'Multiple apps (container,zimbra)',
11
+ cmd: 'yarn manager-types-coverage --apps container,zimbra',
15
12
  expect: 0,
16
13
  },
17
14
  {
@@ -24,6 +21,36 @@ const cases = [
24
21
  cmd: 'yarn manager-types-coverage --packages @ovh-ux/manager-zimbra-app,@ovh-ux/manager-pci-workflow-app',
25
22
  expect: 0,
26
23
  },
24
+ {
25
+ name: 'Single library static path by folder name (manager-react-components)',
26
+ cmd: 'yarn manager-types-coverage --library manager-react-components',
27
+ expect: 0,
28
+ },
29
+ {
30
+ name: 'Single library static path by package name (manager-react-components)',
31
+ cmd: 'yarn manager-types-coverage --library @ovh-ux/manager-react-components',
32
+ expect: 0,
33
+ },
34
+ {
35
+ name: 'Single library dynamic path by folder name (shell-client)',
36
+ cmd: 'yarn manager-types-coverage --library shell-client',
37
+ expect: 0,
38
+ },
39
+ {
40
+ name: 'Single library static path by package name (shell-client)',
41
+ cmd: 'yarn manager-types-coverage --library @ovh-ux/manager-react-shell-client',
42
+ expect: 0,
43
+ },
44
+ {
45
+ name: 'Multiple libraries by folder names (manager-wiki,manager-react-components,shell-client,logs-to-customer)',
46
+ cmd: 'yarn manager-types-coverage --libraries manager-wiki,manager-react-components,shell-client,logs-to-customer',
47
+ expect: 0,
48
+ },
49
+ {
50
+ name: 'Multiple libraries by package names (manager-wiki,manager-react-components,shell-client,logs-to-customer)',
51
+ cmd: 'yarn manager-types-coverage --libraries @ovh-ux/manager-wiki,@ovh-ux/manager-react-components,@ovh-ux/manager-react-shell-client,@ovh-ux/logs-to-customer',
52
+ expect: 0,
53
+ },
27
54
  {
28
55
  name: 'Mixed valid+invalid apps',
29
56
  cmd: 'yarn manager-types-coverage --apps zimbra,unknown-app,container',
@@ -31,7 +58,12 @@ const cases = [
31
58
  },
32
59
  {
33
60
  name: 'Mixed valid+invalid packages',
34
- cmd: 'yarn manager-types-coverage --packages @ovh-ux/manager-zimbra-app,@ovh-ux/manager-ghost-app',
61
+ cmd: 'yarn manager-types-coverage --packages @ovh-ux/manager-wiki,manager-react-components,@ovh-ux/manager-ghost-app',
62
+ expect: 0,
63
+ },
64
+ {
65
+ name: 'Mixed valid+invalid libraries',
66
+ cmd: 'yarn manager-types-coverage --libraries @ovh-ux/manager-zimbra-app,@ovh-ux/manager-ghost-app',
35
67
  expect: 0,
36
68
  },
37
69
  {
@@ -44,6 +76,11 @@ const cases = [
44
76
  cmd: 'yarn manager-types-coverage --packages @ovh-ux/manager-ghost-app,@ovh-ux/manager-missing-app',
45
77
  expect: 1,
46
78
  },
79
+ {
80
+ name: 'Turbo build failure simulation (pci-ai-tools)',
81
+ cmd: 'yarn manager-types-coverage --app pci-ai-tools',
82
+ expect: 0,
83
+ },
47
84
  ];
48
85
 
49
86
  let failed = 0;