@@ -3,7 +3,12 @@ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
33import { tmpdir } from "node:os" ;
44import { join } from "node:path" ;
55
6- import { registerPinDriftTool } from "./pin-drift-tool.js" ;
6+ import {
7+ parseGoMod ,
8+ parsePackageJson ,
9+ parseVersionsEnv ,
10+ registerPinDriftTool ,
11+ } from "./pin-drift-tool.js" ;
712import { captureTool } from "./test-harness.js" ;
813
914// ---------------------------------------------------------------------------
@@ -218,6 +223,49 @@ replace github.com/Rethunk-Tech/satcom => github.com/Rethunk-Tech/satcom v0.0.0-
218223 } ) ;
219224} ) ;
220225
226+ describe ( "parseGoMod source parser" , ( ) => {
227+ test ( "reads real go.mod files and reports pins plus ambiguous replacements" , ( ) => {
228+ const dir = _makeTmpDir ( ) ;
229+ _writeFile (
230+ dir ,
231+ "go.mod" ,
232+ `
233+ module example.com/myapp
234+
235+ go 1.21
236+
237+ require (
238+ github.com/Rethunk-Tech/satcom v0.0.0-20260401000000-aaaaaaaaaaaa
239+ )
240+
241+ replace github.com/foo/bar => github.com/Rethunk-AI/bar v1.2.3
242+ replace github.com/foo/baz => github.com/Rethunk-AI/baz main
243+ ` ,
244+ ) ;
245+
246+ const { pins, skipped } = parseGoMod ( dir ) ;
247+
248+ expect ( pins ) . toContainEqual ( {
249+ source : "go.mod" ,
250+ owner : "Rethunk-AI" ,
251+ repo : "bar" ,
252+ pinnedRef : "v1.2.3" ,
253+ } ) ;
254+ expect ( pins ) . toContainEqual ( {
255+ source : "go.mod" ,
256+ owner : "Rethunk-Tech" ,
257+ repo : "satcom" ,
258+ pinnedRef : "aaaaaaaaaaaa" ,
259+ } ) ;
260+ expect ( skipped ) . toContainEqual ( {
261+ source : "go.mod" ,
262+ key : "replace github.com/Rethunk-AI/baz" ,
263+ value : "main" ,
264+ reason : "ambiguous_ref" ,
265+ } ) ;
266+ } ) ;
267+ } ) ;
268+
221269describe ( "parsePackageJson" , ( ) => {
222270 test ( "parses GitHub shorthand dep" , ( ) => {
223271 const { pins } = parsePackageJsonFixture (
@@ -256,6 +304,48 @@ describe("parsePackageJson", () => {
256304 } ) ;
257305} ) ;
258306
307+ describe ( "parsePackageJson source parser" , ( ) => {
308+ test ( "reads dependencies and devDependencies from package.json" , ( ) => {
309+ const dir = _makeTmpDir ( ) ;
310+ _writeFile (
311+ dir ,
312+ "package.json" ,
313+ JSON . stringify ( {
314+ dependencies : {
315+ "short-lib" : "owner/repo#abc123def456" ,
316+ npm : "^1.0.0" ,
317+ } ,
318+ devDependencies : {
319+ "url-lib" : "https://github.com/Rethunk-AI/some-lib.git#877f8d94448e" ,
320+ } ,
321+ } ) ,
322+ ) ;
323+
324+ const { pins, skipped } = parsePackageJson ( dir ) ;
325+
326+ expect ( skipped ) . toEqual ( [ ] ) ;
327+ expect ( pins ) . toContainEqual ( {
328+ source : "package.json" ,
329+ owner : "owner" ,
330+ repo : "repo" ,
331+ pinnedRef : "abc123def456" ,
332+ } ) ;
333+ expect ( pins ) . toContainEqual ( {
334+ source : "package.json" ,
335+ owner : "Rethunk-AI" ,
336+ repo : "some-lib" ,
337+ pinnedRef : "877f8d94448e" ,
338+ } ) ;
339+ } ) ;
340+
341+ test ( "returns no pins for malformed package.json" , ( ) => {
342+ const dir = _makeTmpDir ( ) ;
343+ _writeFile ( dir , "package.json" , "{not json" ) ;
344+
345+ expect ( parsePackageJson ( dir ) ) . toEqual ( { pins : [ ] , skipped : [ ] } ) ;
346+ } ) ;
347+ } ) ;
348+
259349describe ( "parseVersionsEnv" , ( ) => {
260350 test ( "marks 40-char SHA _REF keys as ambiguous_repo" , ( ) => {
261351 const text = `BASTION_SATCOM_REF=877f8d94448e8cc843e83409dd0a59bb73562e45\n` ;
@@ -287,6 +377,30 @@ describe("parseVersionsEnv", () => {
287377 } ) ;
288378} ) ;
289379
380+ describe ( "parseVersionsEnv source parser" , ( ) => {
381+ test ( "reads SHA-like refs from scripts/versions.env" , ( ) => {
382+ const dir = _makeTmpDir ( ) ;
383+ _writeFile (
384+ dir ,
385+ "scripts/versions.env" ,
386+ `
387+ SATCOM_REF=0123456789abcdef0123456789abcdef01234567
388+ SATCOM_BRANCH=main
389+ MFA_VERSION=v1.2.3
390+ ` ,
391+ ) ;
392+
393+ expect ( parseVersionsEnv ( dir ) . skipped ) . toEqual ( [
394+ {
395+ source : "scripts/versions.env" ,
396+ key : "SATCOM_REF" ,
397+ value : "0123456789abcdef0123456789abcdef01234567" ,
398+ reason : "ambiguous_repo" ,
399+ } ,
400+ ] ) ;
401+ } ) ;
402+ } ) ;
403+
290404// ---------------------------------------------------------------------------
291405// pin_drift tool integration (via captureTool)
292406//
0 commit comments