@code-pushup/typescript-plugin 0.111.1 → 0.113.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.
package/README.md CHANGED
@@ -84,14 +84,14 @@ Each set is also available as group in the plugin. See more under [Audits and Gr
84
84
 
85
85
  The plugin accepts the following parameters:
86
86
 
87
- | Option | Type | Default | Description |
88
- | ---------- | -------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
89
- | tsconfig | string | `tsconfig.json` | A string that defines the path to your `tsconfig.json` file |
90
- | onlyAudits | string[] | undefined | An array of audit slugs to specify which documentation types you want to measure. Only the specified audits will be included in the results |
87
+ | Option | Type | Default | Description |
88
+ | ---------- | ------------------ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
89
+ | tsconfig | string \| string[] | `tsconfig.json` | Path(s) to your `tsconfig.json` file(s) |
90
+ | onlyAudits | string[] | undefined | An array of audit slugs to specify which documentation types you want to measure. Only the specified audits will be included in the results |
91
91
 
92
92
  #### `tsconfig`
93
93
 
94
- Optional parameter. The `tsconfig` option accepts a string that defines the path to your config file and defaults to `tsconfig.json`.
94
+ Optional parameter. The `tsconfig` option accepts a path or an array of paths to your config files. Defaults to `tsconfig.json`.
95
95
 
96
96
  ```js
97
97
  typescriptPlugin({
@@ -99,6 +99,34 @@ typescriptPlugin({
99
99
  });
100
100
  ```
101
101
 
102
+ You can also provide multiple tsconfigs to combine results from different configurations (e.g., separate configs for source and test files):
103
+
104
+ ```js
105
+ typescriptPlugin({
106
+ tsconfig: ['./tsconfig.lib.json', './tsconfig.spec.json'],
107
+ });
108
+ ```
109
+
110
+ If you're using an Nx monorepo, a helper function is provided to auto-discover tsconfigs from all projects:
111
+
112
+ ```js
113
+ import typescriptPlugin, { tsconfigFromAllNxProjects } from '@code-pushup/typescript-plugin';
114
+
115
+ export default {
116
+ plugins: [
117
+ await typescriptPlugin({
118
+ tsconfig: await tsconfigFromAllNxProjects(),
119
+ }),
120
+ ],
121
+ };
122
+ ```
123
+
124
+ You can exclude specific projects by name:
125
+
126
+ ```js
127
+ await tsconfigFromAllNxProjects({ exclude: ['my-app-e2e'] });
128
+ ```
129
+
102
130
  #### `onlyAudits`
103
131
 
104
132
  The `onlyAudits` option allows you to specify which documentation types you want to measure. Only the specified audits will be included in the results. All audits are included by default. Example:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/typescript-plugin",
3
- "version": "0.111.1",
3
+ "version": "0.113.0",
4
4
  "license": "MIT",
5
5
  "description": "Code PushUp plugin for incrementally adopting strict compilation flags in TypeScript projects",
6
6
  "homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-typescript#readme",
@@ -23,13 +23,19 @@
23
23
  },
24
24
  "type": "module",
25
25
  "dependencies": {
26
- "@code-pushup/models": "0.111.1",
27
- "@code-pushup/utils": "0.111.1",
26
+ "@code-pushup/models": "0.113.0",
27
+ "@code-pushup/utils": "0.113.0",
28
28
  "zod": "^4.2.1"
29
29
  },
30
30
  "peerDependencies": {
31
+ "@nx/devkit": ">=17.0.0",
31
32
  "typescript": ">=4.0.0"
32
33
  },
34
+ "peerDependenciesMeta": {
35
+ "@nx/devkit": {
36
+ "optional": true
37
+ }
38
+ },
33
39
  "scripts": {},
34
40
  "files": [
35
41
  "src",
package/src/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export default typescriptPlugin;
3
3
  export { TYPESCRIPT_PLUGIN_SLUG } from './lib/constants.js';
4
4
  export { typescriptPluginConfigSchema, type TypescriptPluginConfig, type TypescriptPluginOptions, } from './lib/schema.js';
5
5
  export { getCategories, getCategoryRefsFromGroups } from './lib/utils.js';
6
+ export { tsconfigFromAllNxProjects } from './lib/nx/tsconfig-paths.js';
package/src/index.js CHANGED
@@ -3,4 +3,5 @@ export default typescriptPlugin;
3
3
  export { TYPESCRIPT_PLUGIN_SLUG } from './lib/constants.js';
4
4
  export { typescriptPluginConfigSchema, } from './lib/schema.js';
5
5
  export { getCategories, getCategoryRefsFromGroups } from './lib/utils.js';
6
+ export { tsconfigFromAllNxProjects } from './lib/nx/tsconfig-paths.js';
6
7
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,eAAe,gBAAgB,CAAC;AAEhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,4BAA4B,GAG7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,eAAe,gBAAgB,CAAC;AAEhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,4BAA4B,GAG7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Finds all tsconfig files from Nx projects in the workspace.
3
+ *
4
+ * @param options - Configuration options
5
+ * @param options.exclude - Array of project names to exclude
6
+ * @returns Array of tsconfig file paths
7
+ */
8
+ export declare function tsconfigFromAllNxProjects(options?: {
9
+ exclude?: string[];
10
+ }): Promise<string[]>;
@@ -0,0 +1,55 @@
1
+ import { readdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { readConfigFile, sys } from 'typescript';
4
+ import { loadNxProjectGraph, logger, pluralizeToken } from '@code-pushup/utils';
5
+ import { formatMetaLog } from '../format.js';
6
+ const TSCONFIG_PATTERN = /^tsconfig(\..+)?\.json$/;
7
+ /**
8
+ * Returns true only if config explicitly defines files or include with values.
9
+ */
10
+ function hasFilesToCompile(tsconfigPath) {
11
+ const { config } = readConfigFile(tsconfigPath, sys.readFile);
12
+ if (!config) {
13
+ return false;
14
+ }
15
+ const { files, include } = config;
16
+ const hasFiles = Array.isArray(files) && files.length > 0;
17
+ const hasInclude = Array.isArray(include) && include.length > 0;
18
+ return hasFiles || hasInclude;
19
+ }
20
+ function isProjectIncluded(project, exclude) {
21
+ return !exclude?.includes(project.name ?? '');
22
+ }
23
+ /**
24
+ * Finds non-empty tsconfig files in a project directory.
25
+ */
26
+ async function findTsconfigsInProject(projectRoot) {
27
+ const absoluteRoot = path.resolve(process.cwd(), projectRoot);
28
+ const files = await readdir(absoluteRoot);
29
+ return files
30
+ .filter(file => TSCONFIG_PATTERN.test(file))
31
+ .filter(file => hasFilesToCompile(path.join(absoluteRoot, file)))
32
+ .map(file => path.join(projectRoot, file));
33
+ }
34
+ /**
35
+ * Finds all tsconfig files from Nx projects in the workspace.
36
+ *
37
+ * @param options - Configuration options
38
+ * @param options.exclude - Array of project names to exclude
39
+ * @returns Array of tsconfig file paths
40
+ */
41
+ export async function tsconfigFromAllNxProjects(options = {}) {
42
+ const projectGraph = await loadNxProjectGraph();
43
+ const { readProjectsConfigurationFromProjectGraph } = await import('@nx/devkit');
44
+ const { projects } = readProjectsConfigurationFromProjectGraph(projectGraph);
45
+ const projectRoots = Object.values(projects)
46
+ .filter(project => isProjectIncluded(project, options.exclude))
47
+ .map(project => project.root)
48
+ .toSorted();
49
+ const tsconfigs = (await Promise.all(projectRoots.map(findTsconfigsInProject))).flat();
50
+ logger.info(formatMetaLog(`Found ${pluralizeToken('tsconfig', tsconfigs.length)} in ${pluralizeToken('Nx project', projectRoots.length)}${options.exclude?.length
51
+ ? ` (excluding ${pluralizeToken('project', options.exclude.length)})`
52
+ : ''}`));
53
+ return tsconfigs;
54
+ }
55
+ //# sourceMappingURL=tsconfig-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig-paths.js","sourceRoot":"","sources":["../../../../src/lib/nx/tsconfig-paths.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { RunnerFunction } from '@code-pushup/models';
2
2
  import type { AuditSlug } from '../types.js';
3
- import { type DiagnosticsOptions } from './ts-runner.js';
4
- export type RunnerOptions = DiagnosticsOptions & {
3
+ export type RunnerOptions = {
4
+ tsconfig: string[];
5
5
  expectedAudits: {
6
6
  slug: AuditSlug;
7
7
  }[];
@@ -1,33 +1,60 @@
1
- import { formatAsciiTable, logger, pluralizeToken, toSentenceCase, } from '@code-pushup/utils';
2
- import { getTypeScriptDiagnostics, } from './ts-runner.js';
1
+ import { formatAsciiTable, logger, pluralizeToken, stringifyError, toSentenceCase, } from '@code-pushup/utils';
2
+ import { getTypeScriptDiagnostics } from './ts-runner.js';
3
3
  import { getIssueFromDiagnostic, tsCodeToAuditSlug } from './utils.js';
4
- export function createRunnerFunction(options) {
5
- const { tsconfig, expectedAudits } = options;
6
- return () => {
7
- const diagnostics = getTypeScriptDiagnostics({ tsconfig });
8
- const result = diagnostics.reduce((acc, diag) => {
9
- const slug = tsCodeToAuditSlug(diag.code);
10
- const existingIssues = acc[slug]?.details?.issues ?? [];
4
+ function collectDiagnostics(tsconfigs) {
5
+ return tsconfigs.reduce((acc, config) => {
6
+ try {
7
+ const diagnostics = getTypeScriptDiagnostics({ tsconfig: config }).map(diag => ({
8
+ code: diag.code,
9
+ issue: getIssueFromDiagnostic(diag),
10
+ }));
11
11
  return {
12
12
  ...acc,
13
- [slug]: {
14
- slug,
15
- details: {
16
- issues: [...existingIssues, getIssueFromDiagnostic(diag)],
17
- },
18
- },
13
+ diagnostics: [...acc.diagnostics, ...diagnostics],
19
14
  };
20
- }, {});
21
- logger.debug(formatAsciiTable({
22
- columns: ['left', 'right'],
23
- rows: Object.values(result).map(audit => [
24
- `• ${toSentenceCase(audit.slug)}`,
25
- audit.details?.issues?.length ?? 0,
26
- ]),
27
- }, { borderless: true }));
15
+ }
16
+ catch (error) {
17
+ if (tsconfigs.length === 1) {
18
+ throw error;
19
+ }
20
+ logger.warn(`Skipping ${config}: ${stringifyError(error, { oneline: true })}`);
21
+ return { ...acc, skipped: acc.skipped + 1 };
22
+ }
23
+ }, { diagnostics: [], skipped: 0 });
24
+ }
25
+ function groupDiagnosticsByAudit(diagnostics) {
26
+ return diagnostics.reduce((acc, { code, issue }) => {
27
+ const slug = tsCodeToAuditSlug(code);
28
+ const existingIssues = acc[slug]?.details?.issues ?? [];
29
+ return {
30
+ ...acc,
31
+ [slug]: { slug, details: { issues: [...existingIssues, issue] } },
32
+ };
33
+ }, {});
34
+ }
35
+ function logDiagnosticsSummary(result) {
36
+ logger.debug(formatAsciiTable({
37
+ columns: ['left', 'right'],
38
+ rows: Object.values(result).map(audit => [
39
+ `• ${toSentenceCase(audit.slug)}`,
40
+ audit.details?.issues?.length ?? 0,
41
+ ]),
42
+ }, { borderless: true }));
43
+ }
44
+ export function createRunnerFunction(options) {
45
+ const { tsconfig, expectedAudits } = options;
46
+ return () => {
47
+ const { diagnostics, skipped } = collectDiagnostics(tsconfig);
48
+ if (skipped === tsconfig.length) {
49
+ throw new Error(`All ${tsconfig.length} TypeScript configurations failed to load`);
50
+ }
51
+ logger.info(diagnostics.length === 0
52
+ ? 'No TypeScript errors found'
53
+ : `TypeScript compiler found ${pluralizeToken('error', diagnostics.length)} in total`);
54
+ const result = groupDiagnosticsByAudit(diagnostics);
55
+ logDiagnosticsSummary(result);
28
56
  return expectedAudits.map(({ slug }) => {
29
- const { details } = result[slug] ?? {};
30
- const issues = details?.issues ?? [];
57
+ const issues = result[slug]?.details?.issues ?? [];
31
58
  return {
32
59
  slug,
33
60
  score: issues.length === 0 ? 1 : 0,
@@ -35,7 +62,7 @@ export function createRunnerFunction(options) {
35
62
  displayValue: issues.length === 0
36
63
  ? 'passed'
37
64
  : pluralizeToken('error', issues.length),
38
- ...(issues.length > 0 ? { details } : {}),
65
+ ...(issues.length > 0 ? { details: { issues } } : {}),
39
66
  };
40
67
  });
41
68
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/runner.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,MAAM,EACN,cAAc,EACd,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEL,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMvE,MAAM,UAAU,oBAAoB,CAAC,OAAsB;IACzD,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAE7C,OAAO,GAAiB,EAAE;QACxB,MAAM,WAAW,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE3D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAE/B,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACd,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,cAAc,GAAY,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;YACjE,OAAO;gBACL,GAAG,GAAG;gBACN,CAAC,IAAI,CAAC,EAAE;oBACN,IAAI;oBACJ,OAAO,EAAE;wBACP,MAAM,EAAE,CAAC,GAAG,cAAc,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;qBAC1D;iBACF;aACF,CAAC;QACJ,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,CAAC,KAAK,CACV,gBAAgB,CACd;YACE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,KAAK,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBACjC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;aACnC,CAAC;SACH,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CACF,CAAC;QAEF,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAe,EAAE;YAClD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAEvC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;YACrC,OAAO;gBACL,IAAI;gBACJ,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,YAAY,EACV,MAAM,CAAC,MAAM,KAAK,CAAC;oBACjB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC5C,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/runner.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,MAAM,EACN,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAcvE,SAAS,kBAAkB,CAAC,SAAmB;IAC7C,OAAO,SAAS,CAAC,MAAM,CACrB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QACd,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CACpE,IAAI,CAAC,EAAE,CAAC,CAAC;gBACP,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,sBAAsB,CAAC,IAAI,CAAC;aACpC,CAAC,CACH,CAAC;YAEF,OAAO;gBACL,GAAG,GAAG;gBACN,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;aAClD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,CAAC,IAAI,CACT,YAAY,MAAM,KAAK,cAAc,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAClE,CAAC;YACF,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC,EACD,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,WAA+B;IAE/B,OAAO,WAAW,CAAC,MAAM,CAAqB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACrE,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,cAAc,GAAY,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;QACjE,OAAO;YACL,GAAG,GAAG;YACN,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,cAAc,EAAE,KAAK,CAAC,EAAE,EAAE;SAClE,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA0B;IACvD,MAAM,CAAC,KAAK,CACV,gBAAgB,CACd;QACE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,KAAK,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACjC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;SACnC,CAAC;KACH,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAsB;IACzD,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAE7C,OAAO,GAAiB,EAAE;QACxB,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAE9D,IAAI,OAAO,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,OAAO,QAAQ,CAAC,MAAM,2CAA2C,CAClE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,IAAI,CACT,WAAW,CAAC,MAAM,KAAK,CAAC;YACtB,CAAC,CAAC,4BAA4B;YAC9B,CAAC,CAAC,6BAA6B,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,CACxF,CAAC;QAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAEpD,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAE9B,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAe,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;YACnD,OAAO;gBACL,IAAI;gBACJ,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,YAAY,EACV,MAAM,CAAC,MAAM,KAAK,CAAC;oBACjB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC5C,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -3,11 +3,15 @@ import { logger, pluralizeToken, stringifyError } from '@code-pushup/utils';
3
3
  import { loadTargetConfig } from './utils.js';
4
4
  export function getTypeScriptDiagnostics({ tsconfig, }) {
5
5
  const { fileNames, options } = loadTargetConfig(tsconfig);
6
- logger.info(`Parsed TypeScript config file ${tsconfig}, program includes ${pluralizeToken('file', fileNames.length)}`);
7
6
  try {
8
7
  const program = createProgram(fileNames, options);
9
8
  const diagnostics = getPreEmitDiagnostics(program);
10
- logger.info(`TypeScript compiler found ${pluralizeToken('diagnostic', diagnostics.length)}`);
9
+ if (diagnostics.length > 0) {
10
+ logger.info(` ${tsconfig} - ${pluralizeToken('error', diagnostics.length)}`);
11
+ }
12
+ else {
13
+ logger.debug(` ${tsconfig}: ${pluralizeToken('file', fileNames.length)}, 0 errors`);
14
+ }
11
15
  return diagnostics;
12
16
  }
13
17
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"ts-runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/ts-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAM9C,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,GACW;IACnB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,CAAC,IAAI,CACT,iCAAiC,QAAQ,sBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAC1G,CAAC;IACF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CACT,6BAA6B,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAChF,CAAC;QACF,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,iDAAiD,cAAc,CAAC,KAAK,CAAC,EAAE,CACzE,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"ts-runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/ts-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAM9C,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,GACW;IACnB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAEnD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CACT,KAAK,QAAQ,MAAM,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CACjE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV,KAAK,QAAQ,KAAK,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,YAAY,CACvE,CAAC;QACJ,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,iDAAiD,cAAc,CAAC,KAAK,CAAC,EAAE,CACzE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  export declare const typescriptPluginConfigSchema: z.ZodObject<{
3
- tsconfig: z.ZodDefault<z.ZodString>;
3
+ tsconfig: z.ZodPipe<z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>, z.ZodTransform<string[], string | string[]>>;
4
4
  onlyAudits: z.ZodOptional<z.ZodArray<z.ZodEnum<{
5
5
  "syntax-errors": "syntax-errors";
6
6
  "semantic-errors": "semantic-errors";
package/src/lib/schema.js CHANGED
@@ -1,12 +1,14 @@
1
1
  import { z } from 'zod';
2
2
  import { pluginScoreTargetsSchema } from '@code-pushup/models';
3
+ import { toArray } from '@code-pushup/utils';
3
4
  import { AUDITS, DEFAULT_TS_CONFIG } from './constants.js';
4
5
  const auditSlugs = AUDITS.map(({ slug }) => slug);
5
6
  export const typescriptPluginConfigSchema = z
6
7
  .object({
7
8
  tsconfig: z
8
- .string()
9
+ .union([z.string(), z.array(z.string()).min(1)])
9
10
  .default(DEFAULT_TS_CONFIG)
11
+ .transform(toArray)
10
12
  .meta({
11
13
  description: `Path to a tsconfig file (default is ${DEFAULT_TS_CONFIG})`,
12
14
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/lib/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAG/C,CAAC;AACF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC;KAC1C,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,OAAO,CAAC,iBAAiB,CAAC;SAC1B,IAAI,CAAC;QACJ,WAAW,EAAE,uCAAuC,iBAAiB,GAAG;KACzE,CAAC;IACJ,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SACzB,IAAI,CAAC;QACJ,WAAW,EAAE,wDAAwD;KACtE,CAAC;SACD,QAAQ,EAAE;IACb,YAAY,EAAE,wBAAwB;CACvC,CAAC;KACD,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/lib/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAG/C,CAAC;AACF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC;KAC1C,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C,OAAO,CAAC,iBAAiB,CAAC;SAC1B,SAAS,CAAC,OAAO,CAAC;SAClB,IAAI,CAAC;QACJ,WAAW,EAAE,uCAAuC,iBAAiB,GAAG;KACzE,CAAC;IACJ,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SACzB,IAAI,CAAC;QACJ,WAAW,EAAE,wDAAwD;KACtE,CAAC;SACD,QAAQ,EAAE;IACb,YAAY,EAAE,wBAAwB;CACvC,CAAC;KACD,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC"}
@@ -7,7 +7,7 @@ import { typescriptPluginConfigSchema, } from './schema.js';
7
7
  import { getAudits, getGroups, logAuditsAndGroups } from './utils.js';
8
8
  const packageJson = createRequire(import.meta.url)('../../package.json');
9
9
  export function typescriptPlugin(options) {
10
- const { tsconfig = DEFAULT_TS_CONFIG, onlyAudits, scoreTargets, } = parseOptions(options ?? {});
10
+ const { tsconfig = [DEFAULT_TS_CONFIG], onlyAudits, scoreTargets, } = parseOptions(options ?? {});
11
11
  const audits = getAudits({ onlyAudits });
12
12
  const groups = getGroups({ onlyAudits });
13
13
  logAuditsAndGroups(audits, groups);
@@ -1 +1 @@
1
- {"version":3,"file":"typescript-plugin.js","sourceRoot":"","sources":["../../../src/lib/typescript-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAqB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAGL,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,oBAAoB,CACkB,CAAC;AAEzC,MAAM,UAAU,gBAAgB,CAC9B,OAAiC;IAEjC,MAAM,EACJ,QAAQ,GAAG,iBAAiB,EAC5B,UAAU,EACV,YAAY,GACb,GAAG,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAEzC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,yCAAyC;QACtD,OAAO,EAAE,+DAA+D;QACxE,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,MAAM;QACN,MAAM;QACN,MAAM,EAAE,oBAAoB,CAAC;YAC3B,QAAQ;YACR,cAAc,EAAE,MAAM;SACvB,CAAC;QACF,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,eAAwC;IAExC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,4BAA4B,EAAE,eAAe,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,4CAA4C,cAAc,CAAC,KAAK,CAAC,EAAE,CACpE,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"typescript-plugin.js","sourceRoot":"","sources":["../../../src/lib/typescript-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAqB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAGL,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,oBAAoB,CACkB,CAAC;AAEzC,MAAM,UAAU,gBAAgB,CAC9B,OAAiC;IAEjC,MAAM,EACJ,QAAQ,GAAG,CAAC,iBAAiB,CAAC,EAC9B,UAAU,EACV,YAAY,GACb,GAAG,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAEzC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,yCAAyC;QACtD,OAAO,EAAE,+DAA+D;QACxE,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,MAAM;QACN,MAAM;QACN,MAAM,EAAE,oBAAoB,CAAC;YAC3B,QAAQ;YACR,cAAc,EAAE,MAAM;SACvB,CAAC;QACF,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,eAAwC;IAExC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,4BAA4B,EAAE,eAAe,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,4CAA4C,cAAc,CAAC,KAAK,CAAC,EAAE,CACpE,CAAC;IACJ,CAAC;AACH,CAAC"}