@mgwilt/nx-uv 0.2.0 → 1.0.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 +8 -5
- package/package.json +26 -27
- package/src/bin/nx-uv.js +0 -0
- package/src/tools/coverage-badge.d.ts +30 -4
- package/src/tools/coverage-badge.js +97 -15
- package/src/tools/coverage-badge.js.map +1 -1
package/README.md
CHANGED
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
[Nx](https://nx.dev/) plugin for running [uv](https://docs.astral.sh/uv/) workflows in [Nx](https://nx.dev/) monorepos.
|
|
4
4
|
|
|
5
5
|
[](https://github.com/mgwilt/nx-uv/actions/workflows/ci.yml)
|
|
6
|
-
[](https://github.com/mgwilt/nx-uv/blob/badges/.github/badges/coverage.json)
|
|
7
|
-
[](https://github.com/mgwilt/nx-uv/blob/badges/.github/badges/coverage-lines.json)
|
|
7
|
+
[](https://github.com/mgwilt/nx-uv/blob/badges/.github/badges/coverage-functions.json)
|
|
8
|
+
[](https://github.com/mgwilt/nx-uv/blob/badges/.github/badges/coverage-statements.json)
|
|
9
|
+
[](https://github.com/mgwilt/nx-uv/blob/badges/.github/badges/coverage-branches.json)
|
|
10
|
+
[](https://github.com/mgwilt/nx-uv/blob/badges/.github/badges/coverage-floor.json)
|
|
11
|
+
[](https://www.npmjs.com/package/@mgwilt/nx-uv?activeTab=versions)
|
|
8
12
|
|
|
9
13
|
## Why this plugin exists
|
|
10
14
|
|
|
@@ -94,10 +98,10 @@ pnpm create nx-workspace@latest acme-monorepo --preset=ts --packageManager=pnpm
|
|
|
94
98
|
cd acme-monorepo
|
|
95
99
|
```
|
|
96
100
|
|
|
97
|
-
2. Install this plugin
|
|
101
|
+
2. Install this plugin and initialize workspace-level [uv](https://docs.astral.sh/uv/) config:
|
|
98
102
|
|
|
99
103
|
```bash
|
|
100
|
-
pnpm add -D @mgwilt/nx-uv
|
|
104
|
+
pnpm add -D @mgwilt/nx-uv
|
|
101
105
|
pnpm nx g @mgwilt/nx-uv:workspace --name=acme --membersGlob='packages/py/*'
|
|
102
106
|
```
|
|
103
107
|
|
|
@@ -297,7 +301,6 @@ pnpm nx g @mgwilt/nx-uv:integration --template=pytorch --project=api
|
|
|
297
301
|
|
|
298
302
|
- Runtime [uv](https://docs.astral.sh/uv/) compatibility checks verify that `uv` is available and executable.
|
|
299
303
|
- `uv 0.9.x` and `0.10.x` are currently the tested ranges. Other versions log a warning and continue.
|
|
300
|
-
- This package is pre-v1 and published on the [npm](https://www.npmjs.com/) `beta` dist-tag.
|
|
301
304
|
|
|
302
305
|
## Troubleshooting
|
|
303
306
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mgwilt/nx-uv",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Nx plugin for uv workflows in Nx monorepos",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -10,6 +10,29 @@
|
|
|
10
10
|
"nx-uv": "./src/bin/nx-uv.js"
|
|
11
11
|
},
|
|
12
12
|
"private": false,
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "nx run nx-uv:build",
|
|
15
|
+
"coverage:badge": "nx run nx-uv:coverage-badge",
|
|
16
|
+
"typecheck": "nx run nx-uv:typecheck",
|
|
17
|
+
"format:check": "nx run nx-uv:format-check",
|
|
18
|
+
"lint": "nx run nx-uv:lint",
|
|
19
|
+
"test": "nx run nx-uv:test",
|
|
20
|
+
"test:unit": "nx run nx-uv:test-unit",
|
|
21
|
+
"test:integration": "nx run nx-uv:test-integration",
|
|
22
|
+
"test:e2e": "nx run nx-uv:test-e2e",
|
|
23
|
+
"test:coverage": "nx run nx-uv:test-coverage",
|
|
24
|
+
"tui:local": "pnpm nx run nx-uv:build && node dist/src/bin/nx-uv.js tui",
|
|
25
|
+
"quality:bootstrap": "node tools/check-nx-bootstrap.cjs",
|
|
26
|
+
"quality:fallback": "pnpm exec eslint . && pnpm exec tsc -p tsconfig.lib.json --noEmit && pnpm exec tsc -p tsconfig.spec.json --noEmit && pnpm exec vitest run -c vitest.unit.config.mts && pnpm exec vitest run -c vitest.integration.config.mts && pnpm exec vitest run -c vitest.e2e.config.mts && pnpm exec vitest run -c vitest.coverage.config.mts",
|
|
27
|
+
"quality:local": "pnpm quality:bootstrap && nx run nx-uv:quality-local",
|
|
28
|
+
"quality:ci": "pnpm quality:bootstrap && nx run nx-uv:quality-ci",
|
|
29
|
+
"samples:generate": "node tools/generate-samples.cjs",
|
|
30
|
+
"llms:generate": "node tools/generate-llms.cjs",
|
|
31
|
+
"llms:check": "node tools/check-llms.cjs",
|
|
32
|
+
"release:version": "nx release version",
|
|
33
|
+
"release:publish": "nx release publish --tag latest",
|
|
34
|
+
"commitlint": "commitlint --from=HEAD~1 --to=HEAD"
|
|
35
|
+
},
|
|
13
36
|
"repository": {
|
|
14
37
|
"type": "git",
|
|
15
38
|
"url": "https://github.com/mgwilt/nx-uv.git"
|
|
@@ -58,29 +81,5 @@
|
|
|
58
81
|
"vite": "^7.3.1"
|
|
59
82
|
},
|
|
60
83
|
"executors": "./executors.json",
|
|
61
|
-
"generators": "./generators.json"
|
|
62
|
-
|
|
63
|
-
"build": "nx run nx-uv:build",
|
|
64
|
-
"coverage:badge": "nx run nx-uv:coverage-badge",
|
|
65
|
-
"typecheck": "nx run nx-uv:typecheck",
|
|
66
|
-
"format:check": "nx run nx-uv:format-check",
|
|
67
|
-
"lint": "nx run nx-uv:lint",
|
|
68
|
-
"test": "nx run nx-uv:test",
|
|
69
|
-
"test:unit": "nx run nx-uv:test-unit",
|
|
70
|
-
"test:integration": "nx run nx-uv:test-integration",
|
|
71
|
-
"test:e2e": "nx run nx-uv:test-e2e",
|
|
72
|
-
"test:coverage": "nx run nx-uv:test-coverage",
|
|
73
|
-
"tui:local": "pnpm nx run nx-uv:build && node dist/src/bin/nx-uv.js tui",
|
|
74
|
-
"quality:bootstrap": "node tools/check-nx-bootstrap.cjs",
|
|
75
|
-
"quality:fallback": "pnpm exec eslint . && pnpm exec tsc -p tsconfig.lib.json --noEmit && pnpm exec tsc -p tsconfig.spec.json --noEmit && pnpm exec vitest run -c vitest.unit.config.mts && pnpm exec vitest run -c vitest.integration.config.mts && pnpm exec vitest run -c vitest.e2e.config.mts && pnpm exec vitest run -c vitest.coverage.config.mts",
|
|
76
|
-
"quality:local": "pnpm quality:bootstrap && nx run nx-uv:quality-local",
|
|
77
|
-
"quality:ci": "pnpm quality:bootstrap && nx run nx-uv:quality-ci",
|
|
78
|
-
"samples:generate": "node tools/generate-samples.cjs",
|
|
79
|
-
"llms:generate": "node tools/generate-llms.cjs",
|
|
80
|
-
"llms:check": "node tools/check-llms.cjs",
|
|
81
|
-
"hooks:install": "lefthook install",
|
|
82
|
-
"release:version": "nx release version --preid beta",
|
|
83
|
-
"release:publish": "nx release publish --tag beta",
|
|
84
|
-
"commitlint": "commitlint --from=HEAD~1 --to=HEAD"
|
|
85
|
-
}
|
|
86
|
-
}
|
|
84
|
+
"generators": "./generators.json"
|
|
85
|
+
}
|
package/src/bin/nx-uv.js
CHANGED
|
File without changes
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
export declare const COVERAGE_METRIC_SPECS: readonly [{
|
|
2
|
+
readonly key: "lines";
|
|
3
|
+
readonly label: "coverage lines";
|
|
4
|
+
readonly fileName: "coverage-lines.json";
|
|
5
|
+
}, {
|
|
6
|
+
readonly key: "functions";
|
|
7
|
+
readonly label: "coverage functions";
|
|
8
|
+
readonly fileName: "coverage-functions.json";
|
|
9
|
+
}, {
|
|
10
|
+
readonly key: "statements";
|
|
11
|
+
readonly label: "coverage statements";
|
|
12
|
+
readonly fileName: "coverage-statements.json";
|
|
13
|
+
}, {
|
|
14
|
+
readonly key: "branches";
|
|
15
|
+
readonly label: "coverage branches";
|
|
16
|
+
readonly fileName: "coverage-branches.json";
|
|
17
|
+
}];
|
|
18
|
+
export type CoverageMetricKey = (typeof COVERAGE_METRIC_SPECS)[number]["key"];
|
|
1
19
|
export interface CoverageMetricSummary {
|
|
2
20
|
pct: number;
|
|
3
21
|
}
|
|
@@ -15,15 +33,23 @@ export interface ShieldsBadgePayload {
|
|
|
15
33
|
message: string;
|
|
16
34
|
color: string;
|
|
17
35
|
}
|
|
36
|
+
export interface CoverageBadgeArtifact {
|
|
37
|
+
fileName: string;
|
|
38
|
+
payload: ShieldsBadgePayload;
|
|
39
|
+
}
|
|
18
40
|
export interface CoverageBadgeCliOptions {
|
|
19
41
|
summaryPath: string;
|
|
20
|
-
|
|
42
|
+
outputDir: string;
|
|
43
|
+
legacyOutputPath: string;
|
|
21
44
|
}
|
|
22
45
|
export declare function loadCoverageSummary(summaryPath: string): CoverageSummary;
|
|
23
46
|
export declare function calculateCoveragePercent(summary: CoverageSummary): number;
|
|
24
47
|
export declare function selectCoverageColor(coveragePercent: number): string;
|
|
25
|
-
export declare function createCoverageBadgePayload(coveragePercent: number): ShieldsBadgePayload;
|
|
48
|
+
export declare function createCoverageBadgePayload(coveragePercent: number, label?: string): ShieldsBadgePayload;
|
|
26
49
|
export declare function writeCoverageBadge(outputPath: string, payload: ShieldsBadgePayload): void;
|
|
27
|
-
export declare function
|
|
50
|
+
export declare function calculateCoverageMetricPercent(summary: CoverageSummary, metric: CoverageMetricKey): number;
|
|
51
|
+
export declare function createCoverageBadgeArtifacts(summary: CoverageSummary): CoverageBadgeArtifact[];
|
|
52
|
+
export declare function writeCoverageBadgeArtifacts(outputDir: string, artifacts: CoverageBadgeArtifact[], legacyOutputPath: string): void;
|
|
53
|
+
export declare function generateCoverageBadges(summaryPath: string, outputDir: string, legacyOutputPath: string): CoverageBadgeArtifact[];
|
|
28
54
|
export declare function parseCoverageBadgeCliArgs(args: string[]): CoverageBadgeCliOptions;
|
|
29
|
-
export declare function runCoverageBadgeCli(args: string[]):
|
|
55
|
+
export declare function runCoverageBadgeCli(args: string[]): CoverageBadgeArtifact[];
|
|
@@ -1,15 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COVERAGE_METRIC_SPECS = void 0;
|
|
3
4
|
exports.loadCoverageSummary = loadCoverageSummary;
|
|
4
5
|
exports.calculateCoveragePercent = calculateCoveragePercent;
|
|
5
6
|
exports.selectCoverageColor = selectCoverageColor;
|
|
6
7
|
exports.createCoverageBadgePayload = createCoverageBadgePayload;
|
|
7
8
|
exports.writeCoverageBadge = writeCoverageBadge;
|
|
8
|
-
exports.
|
|
9
|
+
exports.calculateCoverageMetricPercent = calculateCoverageMetricPercent;
|
|
10
|
+
exports.createCoverageBadgeArtifacts = createCoverageBadgeArtifacts;
|
|
11
|
+
exports.writeCoverageBadgeArtifacts = writeCoverageBadgeArtifacts;
|
|
12
|
+
exports.generateCoverageBadges = generateCoverageBadges;
|
|
9
13
|
exports.parseCoverageBadgeCliArgs = parseCoverageBadgeCliArgs;
|
|
10
14
|
exports.runCoverageBadgeCli = runCoverageBadgeCli;
|
|
11
15
|
const node_fs_1 = require("node:fs");
|
|
12
16
|
const node_path_1 = require("node:path");
|
|
17
|
+
exports.COVERAGE_METRIC_SPECS = [
|
|
18
|
+
{
|
|
19
|
+
key: "lines",
|
|
20
|
+
label: "coverage lines",
|
|
21
|
+
fileName: "coverage-lines.json",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: "functions",
|
|
25
|
+
label: "coverage functions",
|
|
26
|
+
fileName: "coverage-functions.json",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
key: "statements",
|
|
30
|
+
label: "coverage statements",
|
|
31
|
+
fileName: "coverage-statements.json",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
key: "branches",
|
|
35
|
+
label: "coverage branches",
|
|
36
|
+
fileName: "coverage-branches.json",
|
|
37
|
+
},
|
|
38
|
+
];
|
|
13
39
|
function isRecord(value) {
|
|
14
40
|
return typeof value === "object" && value !== null;
|
|
15
41
|
}
|
|
@@ -68,10 +94,10 @@ function selectCoverageColor(coveragePercent) {
|
|
|
68
94
|
}
|
|
69
95
|
return "red";
|
|
70
96
|
}
|
|
71
|
-
function createCoverageBadgePayload(coveragePercent) {
|
|
97
|
+
function createCoverageBadgePayload(coveragePercent, label = "coverage") {
|
|
72
98
|
return {
|
|
73
99
|
schemaVersion: 1,
|
|
74
|
-
label
|
|
100
|
+
label,
|
|
75
101
|
message: `${coveragePercent.toFixed(1)}%`,
|
|
76
102
|
color: selectCoverageColor(coveragePercent),
|
|
77
103
|
};
|
|
@@ -80,16 +106,49 @@ function writeCoverageBadge(outputPath, payload) {
|
|
|
80
106
|
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(outputPath), { recursive: true });
|
|
81
107
|
(0, node_fs_1.writeFileSync)(outputPath, `${JSON.stringify(payload, null, 2)}\n`, "utf-8");
|
|
82
108
|
}
|
|
83
|
-
function
|
|
109
|
+
function calculateCoverageMetricPercent(summary, metric) {
|
|
110
|
+
return Math.round(summary.total[metric].pct * 10) / 10;
|
|
111
|
+
}
|
|
112
|
+
function createCoverageBadgeArtifacts(summary) {
|
|
113
|
+
const metricArtifacts = exports.COVERAGE_METRIC_SPECS.map((spec) => {
|
|
114
|
+
const coveragePercent = calculateCoverageMetricPercent(summary, spec.key);
|
|
115
|
+
return {
|
|
116
|
+
fileName: spec.fileName,
|
|
117
|
+
payload: createCoverageBadgePayload(coveragePercent, spec.label),
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
const floorPercent = calculateCoveragePercent(summary);
|
|
121
|
+
const floorPayload = createCoverageBadgePayload(floorPercent, "coverage floor");
|
|
122
|
+
return [
|
|
123
|
+
...metricArtifacts,
|
|
124
|
+
{
|
|
125
|
+
fileName: "coverage-floor.json",
|
|
126
|
+
payload: floorPayload,
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
function writeCoverageBadgeArtifacts(outputDir, artifacts, legacyOutputPath) {
|
|
131
|
+
const floorArtifact = artifacts.find((artifact) => artifact.fileName === "coverage-floor.json");
|
|
132
|
+
if (!floorArtifact) {
|
|
133
|
+
throw new Error("Coverage floor artifact was not generated.");
|
|
134
|
+
}
|
|
135
|
+
for (const artifact of artifacts) {
|
|
136
|
+
writeCoverageBadge((0, node_path_1.resolve)(outputDir, artifact.fileName), artifact.payload);
|
|
137
|
+
}
|
|
138
|
+
// Keep a compatibility alias for existing references.
|
|
139
|
+
writeCoverageBadge(legacyOutputPath, floorArtifact.payload);
|
|
140
|
+
}
|
|
141
|
+
function generateCoverageBadges(summaryPath, outputDir, legacyOutputPath) {
|
|
84
142
|
const summary = loadCoverageSummary(summaryPath);
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return payload;
|
|
143
|
+
const artifacts = createCoverageBadgeArtifacts(summary);
|
|
144
|
+
writeCoverageBadgeArtifacts(outputDir, artifacts, legacyOutputPath);
|
|
145
|
+
return artifacts;
|
|
89
146
|
}
|
|
90
147
|
function parseCoverageBadgeCliArgs(args) {
|
|
91
148
|
let summaryPath = "coverage/coverage-summary.json";
|
|
92
|
-
let
|
|
149
|
+
let outputDir = ".github/badges";
|
|
150
|
+
let legacyOutputPath = ".github/badges/coverage.json";
|
|
151
|
+
let outputDirExplicitlySet = false;
|
|
93
152
|
for (let index = 0; index < args.length; index += 1) {
|
|
94
153
|
const arg = args[index];
|
|
95
154
|
const next = args[index + 1];
|
|
@@ -101,11 +160,31 @@ function parseCoverageBadgeCliArgs(args) {
|
|
|
101
160
|
index += 1;
|
|
102
161
|
continue;
|
|
103
162
|
}
|
|
163
|
+
if (arg === "--output-dir") {
|
|
164
|
+
if (!next) {
|
|
165
|
+
throw new Error("Missing value for --output-dir");
|
|
166
|
+
}
|
|
167
|
+
outputDir = next;
|
|
168
|
+
outputDirExplicitlySet = true;
|
|
169
|
+
index += 1;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (arg === "--legacy-output") {
|
|
173
|
+
if (!next) {
|
|
174
|
+
throw new Error(`Missing value for ${arg}`);
|
|
175
|
+
}
|
|
176
|
+
legacyOutputPath = next;
|
|
177
|
+
index += 1;
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
104
180
|
if (arg === "--output") {
|
|
105
181
|
if (!next) {
|
|
106
182
|
throw new Error("Missing value for --output");
|
|
107
183
|
}
|
|
108
|
-
|
|
184
|
+
legacyOutputPath = next;
|
|
185
|
+
if (!outputDirExplicitlySet) {
|
|
186
|
+
outputDir = (0, node_path_1.dirname)(next);
|
|
187
|
+
}
|
|
109
188
|
index += 1;
|
|
110
189
|
continue;
|
|
111
190
|
}
|
|
@@ -113,15 +192,18 @@ function parseCoverageBadgeCliArgs(args) {
|
|
|
113
192
|
}
|
|
114
193
|
return {
|
|
115
194
|
summaryPath,
|
|
116
|
-
|
|
195
|
+
outputDir,
|
|
196
|
+
legacyOutputPath,
|
|
117
197
|
};
|
|
118
198
|
}
|
|
119
199
|
function runCoverageBadgeCli(args) {
|
|
120
200
|
const options = parseCoverageBadgeCliArgs(args);
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
201
|
+
const artifacts = generateCoverageBadges((0, node_path_1.resolve)(options.summaryPath), (0, node_path_1.resolve)(options.outputDir), (0, node_path_1.resolve)(options.legacyOutputPath));
|
|
202
|
+
const summaryText = artifacts
|
|
203
|
+
.map((artifact) => `${artifact.fileName}=${artifact.payload.message}`)
|
|
204
|
+
.join(", ");
|
|
205
|
+
process.stdout.write(`coverage badges: ${summaryText}\n`);
|
|
206
|
+
return artifacts;
|
|
125
207
|
}
|
|
126
208
|
/* c8 ignore start */
|
|
127
209
|
if (require.main === module) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-badge.js","sourceRoot":"","sources":["../../../src/tools/coverage-badge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"coverage-badge.js","sourceRoot":"","sources":["../../../src/tools/coverage-badge.ts"],"names":[],"mappings":"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"}
|