Skip to content

Commit 2c898c0

Browse files
authored
feat: Add cli (#7)
1 parent 8cd1aa0 commit 2c898c0

File tree

5 files changed

+116
-1
lines changed

5 files changed

+116
-1
lines changed

README.md

+36
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,42 @@ import { getDebugIdForUrl } from "debug-id/node";
2020
const debugId = await getDebugIdForUrl("./path/to/main.js");
2121
```
2222

23+
### CLI
24+
25+
The CLI can be used to add Debug IDs to source files and corresponding source-maps.
26+
27+
```
28+
> debugids ./dist
29+
30+
Adding debug IDs: 22.86ms
31+
21 source files modified
32+
┌─────────┬────────────────────────┬────────────────────────────┬────────────────────────────────────────┐
33+
│ (index) │ source │ map │ debugId │
34+
├─────────┼────────────────────────┼────────────────────────────┼────────────────────────────────────────┤
35+
│ 0 │ 'dist/cjs/browser.js' │ 'dist/cjs/browser.js.map' │ '5d789753-09fa-477c-80f6-6cfe447c9d9c' │
36+
│ 1 │ 'dist/cjs/cli.js' │ 'dist/cjs/cli.js.map' │ '9e422107-9efe-43e9-b689-2a4ab4b433fd' │
37+
│ 2 │ 'dist/cjs/common.js' │ 'dist/cjs/common.js.map' │ 'edbf08d3-65e4-4ba4-bc1e-89dad07dee83' │
38+
│ 3 │ 'dist/cjs/esbuild.js' │ 'dist/cjs/esbuild.js.map' │ 'ba079d7a-bf61-4d37-b0b8-d9a4b6a78b25' │
39+
│ 4 │ 'dist/cjs/node.js' │ 'dist/cjs/node.js.map' │ '8afaca7e-2109-4c76-9f06-aa4aaf838038' │
40+
│ 5 │ 'dist/cjs/parcel.js' │ 'dist/cjs/parcel.js.map' │ 'fcf05632-597b-4c44-8399-2de02a2dc8cc' │
41+
│ 6 │ 'dist/cjs/rolldown.js' │ 'dist/cjs/rolldown.js.map' │ '8186821c-f0ae-4fc2-8f58-d293f543b912' │
42+
│ 7 │ 'dist/cjs/rollup.js' │ 'dist/cjs/rollup.js.map' │ 'b10c5745-792b-4791-9053-f29f891bcd2a' │
43+
│ 8 │ 'dist/cjs/rspack.js' │ 'dist/cjs/rspack.js.map' │ 'c86a146b-13c9-42f9-8ce7-022b6a14041e' │
44+
│ 9 │ 'dist/cjs/vite.js' │ 'dist/cjs/vite.js.map' │ '01a2e113-63e4-4cfe-8e28-ab7b1c9ad4da' │
45+
│ 10 │ 'dist/cjs/webpack.js' │ 'dist/cjs/webpack.js.map' │ '76e02ae5-b2f5-4b86-a8aa-b10c8fe22cae' │
46+
│ 11 │ 'dist/esm/browser.js' │ 'dist/esm/browser.js.map' │ '1132afdb-5d3e-4306-a152-d944227e6c0b' │
47+
│ 12 │ 'dist/esm/common.js' │ 'dist/esm/common.js.map' │ '33975f78-e815-499d-b1c7-30d30a5dadff' │
48+
│ 13 │ 'dist/esm/esbuild.js' │ 'dist/esm/esbuild.js.map' │ '1ee53fe8-75d8-4d2d-a42c-cdd797b9938c' │
49+
│ 14 │ 'dist/esm/node.js' │ 'dist/esm/node.js.map' │ '36afeb8e-347d-47d4-9090-86c49677f099' │
50+
│ 15 │ 'dist/esm/parcel.js' │ 'dist/esm/parcel.js.map' │ '34de941f-bbe1-462b-a12a-d127492ff33b' │
51+
│ 16 │ 'dist/esm/rolldown.js' │ 'dist/esm/rolldown.js.map' │ 'f907c9c7-e5f6-4e9c-ae16-e1910b5f5f22' │
52+
│ 17 │ 'dist/esm/rollup.js' │ 'dist/esm/rollup.js.map' │ '2e809256-e2d2-4ab7-a9d1-f8a0ef960196' │
53+
│ 18 │ 'dist/esm/rspack.js' │ 'dist/esm/rspack.js.map' │ '390da573-a94d-46fc-a005-90680847e7c4' │
54+
│ 19 │ 'dist/esm/vite.js' │ 'dist/esm/vite.js.map' │ 'b1c9503c-b550-4528-9927-4a51e4968bea' │
55+
│ 20 │ 'dist/esm/webpack.js' │ 'dist/esm/webpack.js.map' │ '760e8f6b-b7d6-4775-819c-91804cb035cb' │
56+
└─────────┴────────────────────────┴────────────────────────────┴────────────────────────────────────────┘
57+
```
58+
2359
## Bundler Plugins
2460

2561
Bundler plugins to inject Debug IDs into both source and source-maps.

cli.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env node
2+
3+
require('./dist/cjs/cli.js');

package.json

+4
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,12 @@
4040
"import": "./dist/esm/browser.js"
4141
}
4242
},
43+
"bin": {
44+
"debugids": "cli.js"
45+
},
4346
"scripts": {
4447
"build": "rollup --config rollup.config.mjs",
48+
"postbuild": "node cli.js ./dist",
4549
"test": "vitest run ./test/**/*.test.ts",
4650
"lint": "prettier --check \"{src,test}/**/*.{ts,js}\"",
4751
"fix": "prettier --write \"{src,test}/**/*.{ts,js}\""

rollup.config.mjs

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const nodeInputs = [
4040
];
4141

4242
export default [
43-
transpile('cjs', nodeInputs, 'dist/cjs'),
43+
transpile('cjs', [...nodeInputs, 'src/cli.ts'], 'dist/cjs'),
4444
transpile('esm', nodeInputs, 'dist/esm'),
4545
transpile('cjs', ['src/browser.ts'], 'dist/cjs', false),
4646
transpile('esm', ['src/browser.ts'], 'dist/esm', false),

src/cli.ts

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { opendir, readFile, writeFile } from 'fs/promises';
2+
import { join } from 'path';
3+
import { addDebugIdToSource, stringToUUID, DEFAULT_EXTENSIONS, addDebugIdToSourcemap } from './common';
4+
5+
async function walk(path: string, extensions = DEFAULT_EXTENSIONS): Promise<string[]> {
6+
const extensionsAndMaps = [...extensions, ...extensions.map((e) => `${e}.map`)];
7+
let files = [];
8+
9+
for await (const file of await opendir(path)) {
10+
if (file.isDirectory()) {
11+
files.push(...(await walk(join(path, file.name))));
12+
} else {
13+
if (extensionsAndMaps.some((ext) => file.name.endsWith(ext))) {
14+
files.push(join(path, file.name));
15+
}
16+
}
17+
}
18+
19+
return files;
20+
}
21+
22+
async function groupSourceAndMapFiles(files: string[]): Promise<Array<[string, string | undefined]>> {
23+
const sourceFiles = files.filter((f) => !f.endsWith('.map'));
24+
const mapFiles = files.filter((f) => f.endsWith('.map'));
25+
26+
return sourceFiles.map((sourceFile) => {
27+
const mapFile = mapFiles.find((f) => f === `${sourceFile}.map`);
28+
return [sourceFile, mapFile];
29+
});
30+
}
31+
32+
(async () => {
33+
console.time('Adding debug IDs');
34+
if (!process.argv[2]) {
35+
console.error('Usage: debugids <dir>');
36+
process.exit(1);
37+
}
38+
39+
const results = await walk(process.argv[2]);
40+
const groupedResults = await groupSourceAndMapFiles(results);
41+
let modifiedFiles: Array<{ source: string; map: string; debugId: string }> = [];
42+
let missingMaps = new Set<string>();
43+
let addedDebugIds = 0;
44+
45+
const promises = groupedResults.map(async ([source, map]) => {
46+
if (!map) {
47+
missingMaps.add(source);
48+
return;
49+
}
50+
51+
const [sourceContent, mapContent] = await Promise.all([readFile(source, 'utf-8'), readFile(map, 'utf-8')]);
52+
53+
const debugId = stringToUUID(sourceContent);
54+
const newSourceContent = addDebugIdToSource(sourceContent, debugId);
55+
const newMapContent = addDebugIdToSourcemap(mapContent, debugId);
56+
57+
modifiedFiles.push({ source, map, debugId });
58+
59+
await Promise.all([writeFile(source, newSourceContent), writeFile(map, newMapContent)]);
60+
addedDebugIds++;
61+
});
62+
63+
await Promise.all(promises);
64+
65+
console.timeEnd('Adding debug IDs');
66+
console.log(`${addedDebugIds} source files modified`);
67+
console.table(modifiedFiles.sort((a, b) => a.source.localeCompare(b.source)));
68+
69+
if (missingMaps.size > 0) {
70+
console.log(`The following files were missing sourcemaps: ${[...missingMaps].join(', ')}`);
71+
}
72+
})();

0 commit comments

Comments
 (0)