@opensip-cli/graph-go 0.1.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.
Files changed (72) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/branch-coverage-2.test.d.ts +21 -0
  5. package/dist/__tests__/branch-coverage-2.test.d.ts.map +1 -0
  6. package/dist/__tests__/branch-coverage-2.test.js +187 -0
  7. package/dist/__tests__/branch-coverage-2.test.js.map +1 -0
  8. package/dist/__tests__/branch-coverage.test.d.ts +17 -0
  9. package/dist/__tests__/branch-coverage.test.d.ts.map +1 -0
  10. package/dist/__tests__/branch-coverage.test.js +136 -0
  11. package/dist/__tests__/branch-coverage.test.js.map +1 -0
  12. package/dist/__tests__/cache-key.test.d.ts +5 -0
  13. package/dist/__tests__/cache-key.test.d.ts.map +1 -0
  14. package/dist/__tests__/cache-key.test.js +45 -0
  15. package/dist/__tests__/cache-key.test.js.map +1 -0
  16. package/dist/__tests__/depends-on-emission.test.d.ts +13 -0
  17. package/dist/__tests__/depends-on-emission.test.d.ts.map +1 -0
  18. package/dist/__tests__/depends-on-emission.test.js +215 -0
  19. package/dist/__tests__/depends-on-emission.test.js.map +1 -0
  20. package/dist/__tests__/discover.test.d.ts +5 -0
  21. package/dist/__tests__/discover.test.d.ts.map +1 -0
  22. package/dist/__tests__/discover.test.js +59 -0
  23. package/dist/__tests__/discover.test.js.map +1 -0
  24. package/dist/__tests__/parse.test.d.ts +5 -0
  25. package/dist/__tests__/parse.test.d.ts.map +1 -0
  26. package/dist/__tests__/parse.test.js +59 -0
  27. package/dist/__tests__/parse.test.js.map +1 -0
  28. package/dist/__tests__/resolve.test.d.ts +18 -0
  29. package/dist/__tests__/resolve.test.d.ts.map +1 -0
  30. package/dist/__tests__/resolve.test.js +205 -0
  31. package/dist/__tests__/resolve.test.js.map +1 -0
  32. package/dist/__tests__/walk.test.d.ts +10 -0
  33. package/dist/__tests__/walk.test.d.ts.map +1 -0
  34. package/dist/__tests__/walk.test.js +163 -0
  35. package/dist/__tests__/walk.test.js.map +1 -0
  36. package/dist/body-digest.d.ts +20 -0
  37. package/dist/body-digest.d.ts.map +1 -0
  38. package/dist/body-digest.js +139 -0
  39. package/dist/body-digest.js.map +1 -0
  40. package/dist/cache-key.d.ts +17 -0
  41. package/dist/cache-key.d.ts.map +1 -0
  42. package/dist/cache-key.js +18 -0
  43. package/dist/cache-key.js.map +1 -0
  44. package/dist/discover.d.ts +24 -0
  45. package/dist/discover.d.ts.map +1 -0
  46. package/dist/discover.js +33 -0
  47. package/dist/discover.js.map +1 -0
  48. package/dist/index.d.ts +43 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +46 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/parse.d.ts +17 -0
  53. package/dist/parse.d.ts.map +1 -0
  54. package/dist/parse.js +14 -0
  55. package/dist/parse.js.map +1 -0
  56. package/dist/resolve.d.ts +32 -0
  57. package/dist/resolve.d.ts.map +1 -0
  58. package/dist/resolve.js +294 -0
  59. package/dist/resolve.js.map +1 -0
  60. package/dist/rule-hints.d.ts +16 -0
  61. package/dist/rule-hints.d.ts.map +1 -0
  62. package/dist/rule-hints.js +62 -0
  63. package/dist/rule-hints.js.map +1 -0
  64. package/dist/walk-metadata.d.ts +22 -0
  65. package/dist/walk-metadata.d.ts.map +1 -0
  66. package/dist/walk-metadata.js +96 -0
  67. package/dist/walk-metadata.js.map +1 -0
  68. package/dist/walk.d.ts +47 -0
  69. package/dist/walk.d.ts.map +1 -0
  70. package/dist/walk.js +278 -0
  71. package/dist/walk.js.map +1 -0
  72. package/package.json +55 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Branch-coverage tests for graph-go/cache-key.ts.
3
+ */
4
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
8
+ import { cacheKey } from '../cache-key.js';
9
+ describe('graph-go cacheKey — branches', () => {
10
+ let dir;
11
+ beforeEach(() => {
12
+ dir = mkdtempSync(join(tmpdir(), 'graph-go-cachekey-'));
13
+ });
14
+ afterEach(() => {
15
+ rmSync(dir, { recursive: true, force: true });
16
+ });
17
+ it('returns go-no-config when configPathAbs is undefined', () => {
18
+ expect(cacheKey({ projectDirAbs: dir, resolutionMode: 'exact' })).toBe('go-no-config');
19
+ });
20
+ it('returns go-no-config when configPathAbs is empty string', () => {
21
+ expect(cacheKey({ projectDirAbs: dir, configPathAbs: '', resolutionMode: 'exact' })).toBe('go-no-config');
22
+ });
23
+ it('returns go-missing:<path> when the config file does not exist', () => {
24
+ const fake = join(dir, 'no-such.sum');
25
+ expect(cacheKey({ projectDirAbs: dir, configPathAbs: fake, resolutionMode: 'exact' })).toContain('missing:');
26
+ });
27
+ it('returns a stable go-<hash> when the config file is readable', () => {
28
+ const file = join(dir, 'go.sum');
29
+ writeFileSync(file, 'example.com/x v1.0.0/go.mod h1:abc\n', 'utf8');
30
+ const a = cacheKey({ projectDirAbs: dir, configPathAbs: file, resolutionMode: 'exact' });
31
+ const b = cacheKey({ projectDirAbs: dir, configPathAbs: file, resolutionMode: 'exact' });
32
+ expect(a).toBe(b);
33
+ expect(a.startsWith('go-')).toBe(true);
34
+ expect(a).not.toBe('go-no-config');
35
+ });
36
+ it('changes when the config file content changes', () => {
37
+ const file = join(dir, 'go.sum');
38
+ writeFileSync(file, 'example.com/x v1.0.0/go.mod h1:aaa\n', 'utf8');
39
+ const a = cacheKey({ projectDirAbs: dir, configPathAbs: file, resolutionMode: 'exact' });
40
+ writeFileSync(file, 'example.com/x v1.0.1/go.mod h1:bbb\n', 'utf8');
41
+ const b = cacheKey({ projectDirAbs: dir, configPathAbs: file, resolutionMode: 'exact' });
42
+ expect(a).not.toBe(b);
43
+ });
44
+ });
45
+ //# sourceMappingURL=cache-key.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-key.test.js","sourceRoot":"","sources":["../../src/__tests__/cache-key.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tests for the Go adapter's module-level depends_on edge emission.
3
+ * Phase 4 Task 4.4 of opensip's substrate consolidation (opensip DEC-498).
4
+ *
5
+ * Exercises the full adapter contract surface (discoverFiles →
6
+ * parseProject → walkProject → resolveCallSites) against small fixtures
7
+ * with internal + external + aliased + blank + grouped imports, plus
8
+ * `go.mod`-driven module-path resolution.
9
+ *
10
+ * Mirrors the Python adapter's Task 4.3 test layout.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=depends-on-emission.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depends-on-emission.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/depends-on-emission.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Tests for the Go adapter's module-level depends_on edge emission.
3
+ * Phase 4 Task 4.4 of opensip's substrate consolidation (opensip DEC-498).
4
+ *
5
+ * Exercises the full adapter contract surface (discoverFiles →
6
+ * parseProject → walkProject → resolveCallSites) against small fixtures
7
+ * with internal + external + aliased + blank + grouped imports, plus
8
+ * `go.mod`-driven module-path resolution.
9
+ *
10
+ * Mirrors the Python adapter's Task 4.3 test layout.
11
+ */
12
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
13
+ import { tmpdir } from 'node:os';
14
+ import { join } from 'node:path';
15
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
16
+ import { goGraphAdapter } from '../index.js';
17
+ let fixtureRoot;
18
+ beforeEach(() => {
19
+ fixtureRoot = mkdtempSync(join(tmpdir(), 'graph-go-depends-on-'));
20
+ });
21
+ afterEach(() => {
22
+ rmSync(fixtureRoot, { recursive: true, force: true });
23
+ });
24
+ function writeFile(rel, content) {
25
+ const abs = join(fixtureRoot, rel);
26
+ mkdirSync(join(abs, '..'), { recursive: true });
27
+ writeFileSync(abs, content, 'utf8');
28
+ }
29
+ function findModuleInit(catalog, filePath) {
30
+ for (const occs of Object.values(catalog.functions)) {
31
+ for (const o of occs) {
32
+ if (o.kind === 'module-init' && o.filePath === filePath)
33
+ return o;
34
+ }
35
+ }
36
+ return undefined;
37
+ }
38
+ function runAdapter() {
39
+ const discovery = goGraphAdapter.discoverFiles({ cwd: fixtureRoot });
40
+ const parsed = goGraphAdapter.parseProject({
41
+ projectDirAbs: discovery.projectDirAbs,
42
+ files: discovery.files,
43
+ compilerOptions: discovery.compilerOptions,
44
+ resolutionMode: 'exact',
45
+ });
46
+ const walked = goGraphAdapter.walkProject({
47
+ project: parsed.project,
48
+ projectDirAbs: discovery.projectDirAbs,
49
+ files: discovery.files,
50
+ });
51
+ const initialCatalog = {
52
+ version: '3.0',
53
+ tool: 'graph',
54
+ language: 'go',
55
+ builtAt: new Date().toISOString(),
56
+ cacheKey: 'test',
57
+ functions: walked.occurrences,
58
+ };
59
+ const resolved = goGraphAdapter.resolveCallSites({
60
+ project: parsed.project,
61
+ catalog: initialCatalog,
62
+ callSites: walked.callSites,
63
+ dependencySites: walked.dependencySites,
64
+ projectDirAbs: discovery.projectDirAbs,
65
+ resolutionMode: 'exact',
66
+ });
67
+ return { catalog: initialCatalog, dependenciesByOwner: resolved.dependenciesByOwner };
68
+ }
69
+ const GO_MOD = `module github.com/example/myproj\n\ngo 1.22\n`;
70
+ describe('Go adapter — depends_on emission (Phase 4)', () => {
71
+ it('resolves a single internal import to the target package module-init', () => {
72
+ writeFile('go.mod', GO_MOD);
73
+ writeFile('main.go', `package main\n\nimport "github.com/example/myproj/pkg/foo"\n\nfunc main() {\n\tfoo.Do()\n}\n`);
74
+ writeFile('pkg/foo/foo.go', `package foo\n\nfunc Do() int { return 1 }\n`);
75
+ const { catalog, dependenciesByOwner } = runAdapter();
76
+ const mainInit = findModuleInit(catalog, 'main.go');
77
+ const fooInit = findModuleInit(catalog, 'pkg/foo/foo.go');
78
+ expect(mainInit, 'main module-init').toBeDefined();
79
+ expect(fooInit, 'foo module-init').toBeDefined();
80
+ expect(dependenciesByOwner, 'dependenciesByOwner').toBeDefined();
81
+ const mainDeps = dependenciesByOwner.get(mainInit.bodyHash);
82
+ expect(mainDeps, 'main has dependency edges').toHaveLength(1);
83
+ expect(mainDeps[0].specifier).toBe('github.com/example/myproj/pkg/foo');
84
+ expect(mainDeps[0].to).toEqual([fooInit.bodyHash]);
85
+ expect(mainDeps[0].line).toBe(3);
86
+ });
87
+ it('resolves an internal import targeting a multi-file package to all members', () => {
88
+ writeFile('go.mod', GO_MOD);
89
+ writeFile('main.go', `package main\n\nimport "github.com/example/myproj/pkg/foo"\n\nfunc main() {\n\tfoo.Do()\n}\n`);
90
+ writeFile('pkg/foo/foo.go', `package foo\n\nfunc Do() int { return 1 }\n`);
91
+ writeFile('pkg/foo/helpers.go', `package foo\n\nfunc Helper() int { return 2 }\n`);
92
+ const { catalog, dependenciesByOwner } = runAdapter();
93
+ const mainInit = findModuleInit(catalog, 'main.go');
94
+ const fooInit = findModuleInit(catalog, 'pkg/foo/foo.go');
95
+ const helpersInit = findModuleInit(catalog, 'pkg/foo/helpers.go');
96
+ expect(mainInit).toBeDefined();
97
+ expect(fooInit).toBeDefined();
98
+ expect(helpersInit).toBeDefined();
99
+ const mainDeps = dependenciesByOwner.get(mainInit.bodyHash);
100
+ expect(mainDeps).toHaveLength(1);
101
+ expect(mainDeps[0].specifier).toBe('github.com/example/myproj/pkg/foo');
102
+ const targets = [...mainDeps[0].to].sort();
103
+ const expected = [fooInit.bodyHash, helpersInit.bodyHash].sort();
104
+ expect(targets).toEqual(expected);
105
+ });
106
+ it('emits unresolved edges for stdlib imports', () => {
107
+ writeFile('go.mod', GO_MOD);
108
+ writeFile('main.go', `package main\n\nimport "fmt"\n\nfunc main() {\n\tfmt.Println("hi")\n}\n`);
109
+ const { catalog, dependenciesByOwner } = runAdapter();
110
+ const mainInit = findModuleInit(catalog, 'main.go');
111
+ expect(mainInit).toBeDefined();
112
+ const deps = dependenciesByOwner.get(mainInit.bodyHash);
113
+ expect(deps).toHaveLength(1);
114
+ expect(deps[0].specifier).toBe('fmt');
115
+ expect(deps[0].to).toEqual([]);
116
+ });
117
+ it('emits unresolved edges for third-party external imports', () => {
118
+ writeFile('go.mod', GO_MOD);
119
+ writeFile('main.go', `package main\n\nimport "github.com/external/somelib"\n\nfunc main() {\n\tsomelib.Run()\n}\n`);
120
+ const { catalog, dependenciesByOwner } = runAdapter();
121
+ const mainInit = findModuleInit(catalog, 'main.go');
122
+ expect(mainInit).toBeDefined();
123
+ const deps = dependenciesByOwner.get(mainInit.bodyHash);
124
+ expect(deps).toHaveLength(1);
125
+ expect(deps[0].specifier).toBe('github.com/external/somelib');
126
+ expect(deps[0].to).toEqual([]);
127
+ });
128
+ it('handles grouped imports — emits one dep site per import_spec', () => {
129
+ writeFile('go.mod', GO_MOD);
130
+ writeFile('main.go', [
131
+ 'package main',
132
+ '',
133
+ 'import (',
134
+ '\t"fmt"',
135
+ '\t"github.com/example/myproj/pkg/a"',
136
+ '\talias "github.com/external/lib"',
137
+ ')',
138
+ '',
139
+ 'func main() {',
140
+ '\tfmt.Println(a.Value)',
141
+ '\talias.Use()',
142
+ '}',
143
+ '',
144
+ ].join('\n'));
145
+ writeFile('pkg/a/a.go', `package a\n\nvar Value = 1\n`);
146
+ const { catalog, dependenciesByOwner } = runAdapter();
147
+ const mainInit = findModuleInit(catalog, 'main.go');
148
+ const aInit = findModuleInit(catalog, 'pkg/a/a.go');
149
+ expect(mainInit).toBeDefined();
150
+ expect(aInit).toBeDefined();
151
+ const deps = dependenciesByOwner.get(mainInit.bodyHash);
152
+ expect(deps).toHaveLength(3);
153
+ const specifiers = deps.map((d) => d.specifier).sort();
154
+ expect(specifiers).toEqual([
155
+ 'fmt',
156
+ 'github.com/example/myproj/pkg/a',
157
+ 'github.com/external/lib',
158
+ ]);
159
+ const fmtEdge = deps.find((d) => d.specifier === 'fmt');
160
+ expect(fmtEdge.to).toEqual([]);
161
+ const aEdge = deps.find((d) => d.specifier === 'github.com/example/myproj/pkg/a');
162
+ expect(aEdge.to).toEqual([aInit.bodyHash]);
163
+ const aliasEdge = deps.find((d) => d.specifier === 'github.com/external/lib');
164
+ expect(aliasEdge.to).toEqual([]);
165
+ });
166
+ it('treats aliased imports the same as unaliased (alias does not change target)', () => {
167
+ writeFile('go.mod', GO_MOD);
168
+ writeFile('main.go', `package main\n\nimport f "github.com/example/myproj/pkg/foo"\n\nfunc main() {\n\tf.Do()\n}\n`);
169
+ writeFile('pkg/foo/foo.go', `package foo\n\nfunc Do() int { return 1 }\n`);
170
+ const { catalog, dependenciesByOwner } = runAdapter();
171
+ const mainInit = findModuleInit(catalog, 'main.go');
172
+ const fooInit = findModuleInit(catalog, 'pkg/foo/foo.go');
173
+ const deps = dependenciesByOwner.get(mainInit.bodyHash);
174
+ expect(deps).toHaveLength(1);
175
+ expect(deps[0].specifier).toBe('github.com/example/myproj/pkg/foo');
176
+ expect(deps[0].to).toEqual([fooInit.bodyHash]);
177
+ });
178
+ it('emits dependency edges for blank imports (`_ "path"`) like any other', () => {
179
+ writeFile('go.mod', GO_MOD);
180
+ writeFile('main.go', `package main\n\nimport _ "github.com/example/myproj/pkg/sideeffect"\n\nfunc main() {}\n`);
181
+ writeFile('pkg/sideeffect/init.go', `package sideeffect\n\nfunc init() {}\n`);
182
+ const { catalog, dependenciesByOwner } = runAdapter();
183
+ const mainInit = findModuleInit(catalog, 'main.go');
184
+ const sideInit = findModuleInit(catalog, 'pkg/sideeffect/init.go');
185
+ expect(mainInit).toBeDefined();
186
+ expect(sideInit).toBeDefined();
187
+ const deps = dependenciesByOwner.get(mainInit.bodyHash);
188
+ expect(deps).toHaveLength(1);
189
+ expect(deps[0].specifier).toBe('github.com/example/myproj/pkg/sideeffect');
190
+ expect(deps[0].to).toEqual([sideInit.bodyHash]);
191
+ });
192
+ it('produces no dependency edges for a file with no imports', () => {
193
+ writeFile('go.mod', GO_MOD);
194
+ writeFile('standalone.go', `package main\n\nfunc Standalone() int { return 42 }\n`);
195
+ const { catalog, dependenciesByOwner } = runAdapter();
196
+ const standaloneInit = findModuleInit(catalog, 'standalone.go');
197
+ expect(standaloneInit).toBeDefined();
198
+ const deps = dependenciesByOwner?.get(standaloneInit.bodyHash);
199
+ expect(deps).toBeUndefined();
200
+ });
201
+ it('treats all imports as unresolved when go.mod is missing', () => {
202
+ // No go.mod written — module path is unknown, so every import is
203
+ // treated as external.
204
+ writeFile('main.go', `package main\n\nimport "github.com/example/myproj/pkg/foo"\n\nfunc main() {\n\tfoo.Do()\n}\n`);
205
+ writeFile('pkg/foo/foo.go', `package foo\n\nfunc Do() int { return 1 }\n`);
206
+ const { catalog, dependenciesByOwner } = runAdapter();
207
+ const mainInit = findModuleInit(catalog, 'main.go');
208
+ expect(mainInit).toBeDefined();
209
+ const deps = dependenciesByOwner.get(mainInit.bodyHash);
210
+ expect(deps).toHaveLength(1);
211
+ expect(deps[0].specifier).toBe('github.com/example/myproj/pkg/foo');
212
+ expect(deps[0].to).toEqual([]);
213
+ });
214
+ });
215
+ //# sourceMappingURL=depends-on-emission.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depends-on-emission.test.js","sourceRoot":"","sources":["../../src/__tests__/depends-on-emission.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Branch-coverage tests for graph-go/discover.ts.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=discover.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/discover.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Branch-coverage tests for graph-go/discover.ts.
3
+ */
4
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
8
+ import { discoverFiles } from '../discover.js';
9
+ describe('graph-go discover.ts — branches', () => {
10
+ let dir;
11
+ beforeEach(() => {
12
+ dir = mkdtempSync(join(tmpdir(), 'graph-go-discover-'));
13
+ });
14
+ afterEach(() => {
15
+ rmSync(dir, { recursive: true, force: true });
16
+ });
17
+ it('returns undefined configPathAbs when no go.mod or go.sum exists', () => {
18
+ const out = discoverFiles({ cwd: dir });
19
+ expect(out.configPathAbs).toBeUndefined();
20
+ expect(out.files).toEqual([]);
21
+ });
22
+ it('uses go.sum when present (preferred over go.mod)', () => {
23
+ writeFileSync(join(dir, 'go.sum'), '# checksums\n', 'utf8');
24
+ writeFileSync(join(dir, 'go.mod'), 'module example.com/x\n', 'utf8');
25
+ const out = discoverFiles({ cwd: dir });
26
+ expect(out.configPathAbs).toBeDefined();
27
+ expect(out.configPathAbs).toContain('go.sum');
28
+ });
29
+ it('falls back to go.mod when go.sum absent', () => {
30
+ writeFileSync(join(dir, 'go.mod'), 'module example.com/x\n', 'utf8');
31
+ const out = discoverFiles({ cwd: dir });
32
+ expect(out.configPathAbs).toBeDefined();
33
+ expect(out.configPathAbs).toContain('go.mod');
34
+ });
35
+ it('honors a configPathOverride that exists', () => {
36
+ const override = join(dir, 'custom.mod');
37
+ writeFileSync(override, 'module example.com/x\n', 'utf8');
38
+ const out = discoverFiles({ cwd: dir, configPathOverride: 'custom.mod' });
39
+ expect(out.configPathAbs).toBeDefined();
40
+ expect(out.configPathAbs).toContain('custom.mod');
41
+ });
42
+ it('returns the override path verbatim when the override does not exist', () => {
43
+ const out = discoverFiles({ cwd: dir, configPathOverride: 'nonexistent.mod' });
44
+ expect(out.configPathAbs).toBeDefined();
45
+ expect(out.configPathAbs).toContain('nonexistent.mod');
46
+ });
47
+ it('collects .go files (sorted, dedup) and excludes vendor/', () => {
48
+ writeFileSync(join(dir, 'a.go'), 'package main\n', 'utf8');
49
+ mkdirSync(join(dir, 'pkg'), { recursive: true });
50
+ writeFileSync(join(dir, 'pkg/b.go'), 'package pkg\n', 'utf8');
51
+ mkdirSync(join(dir, 'vendor', 'github.com', 'x'), { recursive: true });
52
+ writeFileSync(join(dir, 'vendor/github.com/x/excluded.go'), 'package x\n', 'utf8');
53
+ const out = discoverFiles({ cwd: dir });
54
+ expect(out.files.length).toBe(2);
55
+ expect(out.files.every((f) => !f.includes('/vendor/'))).toBe(true);
56
+ expect([...out.files]).toEqual([...out.files].sort());
57
+ });
58
+ });
59
+ //# sourceMappingURL=discover.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.test.js","sourceRoot":"","sources":["../../src/__tests__/discover.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Branch-coverage tests for graph-go/parse.ts.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=parse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/parse.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Branch-coverage tests for graph-go/parse.ts.
3
+ */
4
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
8
+ import { parseProject } from '../parse.js';
9
+ describe('graph-go parse.ts — branches', () => {
10
+ let dir;
11
+ beforeEach(() => {
12
+ dir = mkdtempSync(join(tmpdir(), 'graph-go-parse-'));
13
+ });
14
+ afterEach(() => {
15
+ rmSync(dir, { recursive: true, force: true });
16
+ });
17
+ it('returns no parseErrors for a syntactically valid file', () => {
18
+ const file = join(dir, 'main.go');
19
+ writeFileSync(file, 'package main\nfunc main() { x := 1; _ = x }\n', 'utf8');
20
+ const out = parseProject({ projectDirAbs: dir, files: [file], resolutionMode: 'exact' });
21
+ expect(out.parseErrors).toEqual([]);
22
+ expect(out.project.files.size).toBe(1);
23
+ });
24
+ it('records a parseError when tree-sitter reports rootNode.hasError', () => {
25
+ const file = join(dir, 'broken.go');
26
+ // Unterminated function body — tree-sitter marks hasError but
27
+ // still produces a partial tree.
28
+ writeFileSync(file, 'package main\nfunc broken() { x := \n', 'utf8');
29
+ const out = parseProject({ projectDirAbs: dir, files: [file], resolutionMode: 'exact' });
30
+ expect(out.parseErrors.length).toBeGreaterThan(0);
31
+ expect(out.parseErrors[0]?.message).toContain('tree-sitter');
32
+ expect(out.project.files.size).toBe(1);
33
+ });
34
+ it('processes multiple files independently', () => {
35
+ const a = join(dir, 'a.go');
36
+ const b = join(dir, 'b.go');
37
+ writeFileSync(a, 'package main\nfunc ok() { }\n', 'utf8');
38
+ writeFileSync(b, 'package main\nfunc broken() { x := \n', 'utf8');
39
+ const out = parseProject({ projectDirAbs: dir, files: [a, b], resolutionMode: 'exact' });
40
+ expect(out.project.files.size).toBe(2);
41
+ expect(out.parseErrors.length).toBeGreaterThan(0);
42
+ });
43
+ it('parses Go source with line comments, block comments, and string literals', () => {
44
+ const file = join(dir, 'comments.go');
45
+ writeFileSync(file, `package main\n` +
46
+ `// line comment\n` +
47
+ `/* block comment */\n` +
48
+ `func withComments() string {\n` +
49
+ ` // more comments\n` +
50
+ ' s := "a string with /* fake comment */ inside"\n' +
51
+ ' r := `raw string spanning\nmultiple lines`\n' +
52
+ ` _ = r\n` +
53
+ ` return s\n` +
54
+ `}\n`, 'utf8');
55
+ const out = parseProject({ projectDirAbs: dir, files: [file], resolutionMode: 'exact' });
56
+ expect(out.parseErrors).toEqual([]);
57
+ });
58
+ });
59
+ //# sourceMappingURL=parse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.js","sourceRoot":"","sources":["../../src/__tests__/parse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Branch-coverage tests for graph-go/resolve.ts.
3
+ *
4
+ * Drives the full Go adapter (discover + parse + walk + resolve)
5
+ * over fixtures exercising:
6
+ * - `call_expression` with identifier callee (`foo()`)
7
+ * - selector_expression callees (`obj.Method()`, `pkg.Func()`,
8
+ * `Type{}.method()`)
9
+ * - Confidence ladder: 0 → unknown/low; 1 → static/medium;
10
+ * N → method-dispatch/low
11
+ * - Unrecognized callee shapes (index expression, type assertion
12
+ * call) → unresolved
13
+ * - `defer` and `go` statements → discarded=true
14
+ * - Closure creation edges → static/high
15
+ * - I-4: catalog is not mutated
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=resolve.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resolve.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}