@getripple/core 1.0.5 → 1.0.6

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.
@@ -1,6 +1,8 @@
1
1
  import { RippleAdapterDetectionSummary } from "./adapters";
2
2
  import { GraphEngine } from "./graph";
3
3
  export declare const RIPPLE_CI_WORKFLOW_PATH = ".github/workflows/ripple.yml";
4
+ export declare const RIPPLE_GITIGNORE_PATH = ".gitignore";
5
+ export declare const RIPPLE_CACHE_GITIGNORE_ENTRY = ".ripple/.cache/";
4
6
  export type RippleReadinessCheck = {
5
7
  ok: boolean;
6
8
  detail: string;
@@ -16,8 +18,15 @@ export type RippleEnforcementReadiness = {
16
18
  explicitPolicy: RippleReadinessCheck;
17
19
  gaps: string[];
18
20
  };
21
+ export type RippleReadinessDecision = "continue" | "setup-required";
19
22
  export type RippleReadinessSummary = {
20
23
  status: "ready" | "needs_setup";
24
+ decision: RippleReadinessDecision;
25
+ canContinue: boolean;
26
+ mustStop: boolean;
27
+ nextRequiredAction: string;
28
+ why: string[];
29
+ fixNow: string[];
21
30
  workspace: string;
22
31
  sourceFiles: number;
23
32
  symbols: number;
@@ -27,6 +36,7 @@ export type RippleReadinessSummary = {
27
36
  checks: {
28
37
  graph: RippleReadinessCheck;
29
38
  git: RippleReadinessCheck;
39
+ gitIgnore: RippleReadinessCheck;
30
40
  ciWorkflow: RippleReadinessCheck;
31
41
  latestIntent: RippleReadinessCheck;
32
42
  };
package/dist/readiness.js CHANGED
@@ -23,13 +23,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.buildRippleReadinessSummary = exports.RIPPLE_CI_WORKFLOW_PATH = void 0;
26
+ exports.buildRippleReadinessSummary = exports.RIPPLE_CACHE_GITIGNORE_ENTRY = exports.RIPPLE_GITIGNORE_PATH = exports.RIPPLE_CI_WORKFLOW_PATH = void 0;
27
27
  const fs = __importStar(require("fs"));
28
28
  const path = __importStar(require("path"));
29
- const child_process_1 = require("child_process");
30
29
  const adapters_1 = require("./adapters");
31
30
  const change_intent_1 = require("./change-intent");
31
+ const git_1 = require("./git");
32
32
  exports.RIPPLE_CI_WORKFLOW_PATH = ".github/workflows/ripple.yml";
33
+ exports.RIPPLE_GITIGNORE_PATH = ".gitignore";
34
+ exports.RIPPLE_CACHE_GITIGNORE_ENTRY = ".ripple/.cache/";
33
35
  function buildRippleReadinessSummary(workspaceRoot, engine) {
34
36
  const sourceFiles = engine.graph.files.size;
35
37
  const symbols = engine.graph.symbols.size;
@@ -39,7 +41,9 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
39
41
  const latestIntentPath = (0, change_intent_1.defaultChangeIntentPath)(workspaceRoot);
40
42
  const policyPath = path.join(workspaceRoot, ".ripple", "policy.json");
41
43
  const graphOk = sourceFiles > 0;
42
- const gitOk = isGitWorktree(workspaceRoot);
44
+ const gitCheck = gitWorktreeCheck(workspaceRoot);
45
+ const gitOk = gitCheck.ok;
46
+ const gitIgnoreCheck = rippleGitIgnoreCheck(workspaceRoot);
43
47
  const ciWorkflowOk = fs.existsSync(workflowPath);
44
48
  const latestIntentOk = fs.existsSync(latestIntentPath);
45
49
  const explicitPolicyOk = fs.existsSync(policyPath);
@@ -51,11 +55,8 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
51
55
  : "No supported source files were found",
52
56
  fix: graphOk ? undefined : "Run Ripple from a JavaScript, TypeScript, or Python repo root.",
53
57
  },
54
- git: {
55
- ok: gitOk,
56
- detail: gitOk ? "Inside a git worktree" : "Not inside a git worktree",
57
- fix: gitOk ? undefined : "Run Ripple inside a git repository.",
58
- },
58
+ git: gitCheck,
59
+ gitIgnore: gitIgnoreCheck,
59
60
  ciWorkflow: {
60
61
  ok: ciWorkflowOk,
61
62
  detail: ciWorkflowOk
@@ -76,6 +77,8 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
76
77
  const enforcement = buildEnforcementReadiness({
77
78
  graphOk,
78
79
  gitOk,
80
+ gitDetail: gitCheck.detail,
81
+ gitIgnoreOk: gitIgnoreCheck.ok,
79
82
  ciWorkflowOk,
80
83
  latestIntentOk,
81
84
  explicitPolicyOk,
@@ -86,8 +89,16 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
86
89
  if (nextSteps.length === 0) {
87
90
  nextSteps.push("Run ripple ci --base origin/main --intent latest --github-annotations.");
88
91
  }
92
+ const status = Object.values(checks).every((check) => check.ok) ? "ready" : "needs_setup";
93
+ const contract = readinessContract(status, enforcement, nextSteps);
89
94
  return {
90
- status: Object.values(checks).every((check) => check.ok) ? "ready" : "needs_setup",
95
+ status,
96
+ decision: contract.decision,
97
+ canContinue: contract.canContinue,
98
+ mustStop: contract.mustStop,
99
+ nextRequiredAction: contract.nextRequiredAction,
100
+ why: contract.why,
101
+ fixNow: contract.fixNow,
91
102
  workspace: workspaceRoot,
92
103
  sourceFiles,
93
104
  symbols,
@@ -99,6 +110,26 @@ function buildRippleReadinessSummary(workspaceRoot, engine) {
99
110
  };
100
111
  }
101
112
  exports.buildRippleReadinessSummary = buildRippleReadinessSummary;
113
+ function readinessContract(status, enforcement, nextSteps) {
114
+ if (status === "ready") {
115
+ return {
116
+ decision: "continue",
117
+ canContinue: true,
118
+ mustStop: false,
119
+ nextRequiredAction: "Continue with the saved-intent workflow and keep the Ripple CI gate enabled.",
120
+ why: [enforcement.summary],
121
+ fixNow: [],
122
+ };
123
+ }
124
+ return {
125
+ decision: "setup-required",
126
+ canContinue: false,
127
+ mustStop: true,
128
+ nextRequiredAction: "Stop autonomous agent work until Ripple readiness gaps are fixed.",
129
+ why: enforcement.gaps,
130
+ fixNow: nextSteps,
131
+ };
132
+ }
102
133
  function buildEnforcementReadiness(input) {
103
134
  const canGuideAgents = input.graphOk;
104
135
  const canDetectDrift = input.graphOk && input.gitOk && input.latestIntentOk;
@@ -157,7 +188,10 @@ function enforcementGaps(input) {
157
188
  gaps.push("No supported source graph is available.");
158
189
  }
159
190
  if (!input.gitOk) {
160
- gaps.push("Git worktree is required for changed-file and CI drift checks.");
191
+ gaps.push(`${input.gitDetail} Git is required for changed-file and CI drift checks.`);
192
+ }
193
+ if (!input.gitIgnoreOk) {
194
+ gaps.push("Missing .gitignore hygiene for .ripple/.cache/; generated cache files may be committed accidentally.");
161
195
  }
162
196
  if (!input.latestIntentOk) {
163
197
  gaps.push("No latest saved intent exists, so Ripple cannot compare agent work to a plan.");
@@ -177,18 +211,82 @@ function countCallEdges(engine) {
177
211
  });
178
212
  return count;
179
213
  }
180
- function isGitWorktree(workspaceRoot) {
214
+ function gitWorktreeCheck(workspaceRoot) {
181
215
  try {
182
- const output = (0, child_process_1.execFileSync)("git", ["rev-parse", "--is-inside-work-tree"], {
183
- cwd: workspaceRoot,
184
- encoding: "utf8",
185
- stdio: ["ignore", "pipe", "ignore"],
186
- });
187
- return output.trim() === "true";
216
+ const output = (0, git_1.execGit)(workspaceRoot, ["rev-parse", "--is-inside-work-tree"], ["ignore", "pipe", "ignore"]);
217
+ const insideWorktree = output.trim() === "true";
218
+ return {
219
+ ok: insideWorktree,
220
+ detail: insideWorktree
221
+ ? "Inside a git worktree"
222
+ : "Git command ran, but this directory is not inside a git worktree",
223
+ fix: insideWorktree
224
+ ? undefined
225
+ : "Run Ripple from the repository root or initialize git first.",
226
+ };
188
227
  }
189
- catch {
190
- return false;
228
+ catch (err) {
229
+ const detail = err instanceof Error ? err.message : String(err);
230
+ return {
231
+ ok: false,
232
+ detail,
233
+ fix: gitFixFor(detail),
234
+ };
235
+ }
236
+ }
237
+ function gitFixFor(detail) {
238
+ if (/could not be started|EPERM|EACCES/i.test(detail)) {
239
+ return "Run Ripple from a normal terminal, or allow Node.js to execute git in this environment.";
191
240
  }
241
+ if (/not found|ENOENT/i.test(detail)) {
242
+ return "Install Git and make sure git is available on PATH.";
243
+ }
244
+ return "Run Ripple from the repository root or initialize git first.";
245
+ }
246
+ function rippleGitIgnoreCheck(workspaceRoot) {
247
+ const gitignorePath = path.join(workspaceRoot, exports.RIPPLE_GITIGNORE_PATH);
248
+ if (!fs.existsSync(gitignorePath)) {
249
+ return {
250
+ ok: false,
251
+ detail: "Missing .gitignore entry for .ripple/.cache/",
252
+ fix: "Run ripple init or add .ripple/.cache/ to .gitignore.",
253
+ };
254
+ }
255
+ const lines = fs
256
+ .readFileSync(gitignorePath, "utf8")
257
+ .split(/\r?\n/)
258
+ .map((line) => line.trim())
259
+ .filter((line) => line.length > 0 && !line.startsWith("#"));
260
+ const broadRippleIgnore = lines.some(isBroadRippleIgnore);
261
+ if (broadRippleIgnore) {
262
+ return {
263
+ ok: false,
264
+ detail: "Overbroad .ripple/ ignore may hide policy, history, intents, or approvals",
265
+ fix: "Ignore only .ripple/.cache/ so Ripple audit files can be committed intentionally.",
266
+ };
267
+ }
268
+ const cacheIgnored = lines.some(isRippleCacheIgnore);
269
+ return {
270
+ ok: cacheIgnored,
271
+ detail: cacheIgnored
272
+ ? ".ripple/.cache/ is ignored; Ripple audit files remain commit-able"
273
+ : "Missing .gitignore entry for .ripple/.cache/",
274
+ fix: cacheIgnored
275
+ ? undefined
276
+ : "Run ripple init or add .ripple/.cache/ to .gitignore.",
277
+ };
278
+ }
279
+ function isRippleCacheIgnore(line) {
280
+ const normalized = line.replace(/\\/g, "/").replace(/^\/+/, "");
281
+ return (normalized === exports.RIPPLE_CACHE_GITIGNORE_ENTRY ||
282
+ normalized === ".ripple/.cache" ||
283
+ normalized === ".ripple/.cache/**");
284
+ }
285
+ function isBroadRippleIgnore(line) {
286
+ const normalized = line.replace(/\\/g, "/").replace(/^\/+/, "");
287
+ return (normalized === ".ripple" ||
288
+ normalized === ".ripple/" ||
289
+ normalized === ".ripple/**");
192
290
  }
193
291
  function formatWorkspacePath(workspaceRoot, filePath) {
194
292
  const relative = path.relative(workspaceRoot, filePath);
@@ -1 +1 @@
1
- {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
@@ -24,10 +24,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.highestStagedRisk = exports.buildStagedCheckSummary = exports.listGitChangedDiff = exports.listGitChangedFiles = exports.listGitStagedDiff = exports.listGitStagedFiles = exports.isRippleSourceFile = void 0;
27
- const child_process_1 = require("child_process");
28
27
  const fs = __importStar(require("fs"));
29
28
  const path = __importStar(require("path"));
30
29
  const ts_morph_1 = require("ts-morph");
30
+ const git_1 = require("./git");
31
31
  const SOURCE_FILE_RE = /\.(ts|tsx|js|jsx|py)$/i;
32
32
  const DEFAULT_STAGED_CHECK_TASK = "Review staged change before commit";
33
33
  const RISK_RANK = {
@@ -42,11 +42,12 @@ function isRippleSourceFile(filePath) {
42
42
  exports.isRippleSourceFile = isRippleSourceFile;
43
43
  function listGitStagedFiles(workspaceRoot) {
44
44
  try {
45
- const output = (0, child_process_1.execFileSync)("git", ["diff", "--name-only", "--cached", "--diff-filter=ACMR"], {
46
- cwd: workspaceRoot,
47
- encoding: "utf8",
48
- stdio: ["ignore", "pipe", "pipe"],
49
- });
45
+ const output = (0, git_1.execGit)(workspaceRoot, [
46
+ "diff",
47
+ "--name-only",
48
+ "--cached",
49
+ "--diff-filter=ACMR",
50
+ ]);
50
51
  return output
51
52
  .split(/\r?\n/)
52
53
  .map((line) => line.trim())
@@ -60,11 +61,12 @@ function listGitStagedFiles(workspaceRoot) {
60
61
  exports.listGitStagedFiles = listGitStagedFiles;
61
62
  function listGitStagedDiff(workspaceRoot) {
62
63
  try {
63
- return (0, child_process_1.execFileSync)("git", ["diff", "--cached", "--unified=0", "--no-ext-diff"], {
64
- cwd: workspaceRoot,
65
- encoding: "utf8",
66
- stdio: ["ignore", "pipe", "pipe"],
67
- });
64
+ return (0, git_1.execGit)(workspaceRoot, [
65
+ "diff",
66
+ "--cached",
67
+ "--unified=0",
68
+ "--no-ext-diff",
69
+ ]);
68
70
  }
69
71
  catch (err) {
70
72
  const message = err instanceof Error ? err.message : String(err);
@@ -74,11 +76,13 @@ function listGitStagedDiff(workspaceRoot) {
74
76
  exports.listGitStagedDiff = listGitStagedDiff;
75
77
  function listGitChangedFiles(workspaceRoot, baseRef) {
76
78
  try {
77
- const output = (0, child_process_1.execFileSync)("git", ["diff", "--name-only", "--diff-filter=ACMR", baseRef, "--"], {
78
- cwd: workspaceRoot,
79
- encoding: "utf8",
80
- stdio: ["ignore", "pipe", "pipe"],
81
- });
79
+ const output = (0, git_1.execGit)(workspaceRoot, [
80
+ "diff",
81
+ "--name-only",
82
+ "--diff-filter=ACMR",
83
+ baseRef,
84
+ "--",
85
+ ]);
82
86
  return output
83
87
  .split(/\r?\n/)
84
88
  .map((line) => line.trim())
@@ -94,11 +98,11 @@ function listGitChangedFiles(workspaceRoot, baseRef) {
94
98
  exports.listGitChangedFiles = listGitChangedFiles;
95
99
  function listGitUntrackedSourceFiles(workspaceRoot) {
96
100
  try {
97
- const output = (0, child_process_1.execFileSync)("git", ["ls-files", "--others", "--exclude-standard"], {
98
- cwd: workspaceRoot,
99
- encoding: "utf8",
100
- stdio: ["ignore", "pipe", "pipe"],
101
- });
101
+ const output = (0, git_1.execGit)(workspaceRoot, [
102
+ "ls-files",
103
+ "--others",
104
+ "--exclude-standard",
105
+ ]);
102
106
  return output
103
107
  .split(/\r?\n/)
104
108
  .map((line) => line.trim())
@@ -113,11 +117,13 @@ function uniqueString(value, index, values) {
113
117
  }
114
118
  function listGitChangedDiff(workspaceRoot, baseRef) {
115
119
  try {
116
- return (0, child_process_1.execFileSync)("git", ["diff", "--unified=0", "--no-ext-diff", baseRef, "--"], {
117
- cwd: workspaceRoot,
118
- encoding: "utf8",
119
- stdio: ["ignore", "pipe", "pipe"],
120
- });
120
+ return (0, git_1.execGit)(workspaceRoot, [
121
+ "diff",
122
+ "--unified=0",
123
+ "--no-ext-diff",
124
+ baseRef,
125
+ "--",
126
+ ]);
121
127
  }
122
128
  catch (err) {
123
129
  const message = err instanceof Error ? err.message : String(err);
@@ -486,11 +492,7 @@ function readWorkingTreeFileContent(workspaceRoot, projectPath) {
486
492
  }
487
493
  function readStagedFileContent(workspaceRoot, projectPath) {
488
494
  try {
489
- return (0, child_process_1.execFileSync)("git", ["show", `:${projectPath}`], {
490
- cwd: workspaceRoot,
491
- encoding: "utf8",
492
- stdio: ["ignore", "pipe", "pipe"],
493
- });
495
+ return (0, git_1.execGit)(workspaceRoot, ["show", `:${projectPath}`]);
494
496
  }
495
497
  catch {
496
498
  const absolutePath = path.resolve(workspaceRoot, projectPath);
@@ -504,11 +506,7 @@ function readStagedFileContent(workspaceRoot, projectPath) {
504
506
  }
505
507
  function readGitRefFileContent(workspaceRoot, ref, projectPath) {
506
508
  try {
507
- return (0, child_process_1.execFileSync)("git", ["show", `${ref}:${projectPath}`], {
508
- cwd: workspaceRoot,
509
- encoding: "utf8",
510
- stdio: ["ignore", "pipe", "pipe"],
511
- });
509
+ return (0, git_1.execGit)(workspaceRoot, ["show", `${ref}:${projectPath}`]);
512
510
  }
513
511
  catch {
514
512
  return null;
@@ -521,20 +519,7 @@ function parseSymbolRanges(engine, workspaceRoot, projectPath, content) {
521
519
  if (projectPath.toLowerCase().endsWith(".py")) {
522
520
  return parsePythonSymbolRanges(engine, workspaceRoot, projectPath, content);
523
521
  }
524
- const project = new ts_morph_1.Project({
525
- compilerOptions: {
526
- allowJs: true,
527
- jsx: 4,
528
- allowSyntheticDefaultImports: true,
529
- esModuleInterop: true,
530
- moduleResolution: 2,
531
- target: 99,
532
- strict: false,
533
- },
534
- skipAddingFilesFromTsConfig: true,
535
- skipFileDependencyResolution: true,
536
- });
537
- const sourceFile = project.createSourceFile(projectPath, content, { overwrite: true });
522
+ const sourceFile = ts_morph_1.ts.createSourceFile(projectPath, content, ts_morph_1.ts.ScriptTarget.Latest, true, scriptKindForPath(projectPath));
538
523
  const exportedNames = exportedSymbolNames(sourceFile);
539
524
  const graphSymbols = graphSymbolsByName(engine, workspaceRoot, projectPath);
540
525
  const ranges = [];
@@ -543,13 +528,13 @@ function parseSymbolRanges(engine, workspaceRoot, projectPath, content) {
543
528
  if (!name || name.includes("{") || name.includes("[")) {
544
529
  return;
545
530
  }
546
- const key = `${name}:${kind}:${node.getStart()}`;
531
+ const key = `${name}:${kind}:${node.getStart(sourceFile)}`;
547
532
  if (seen.has(key)) {
548
533
  return;
549
534
  }
550
535
  seen.add(key);
551
536
  const graphSymbol = graphSymbols.get(name);
552
- const nodeRange = lineRangeForNode(node);
537
+ const nodeRange = lineRangeForNode(sourceFile, node);
553
538
  ranges.push({
554
539
  symbol: `${projectPath}::${name}`,
555
540
  file: projectPath,
@@ -563,27 +548,33 @@ function parseSymbolRanges(engine, workspaceRoot, projectPath, content) {
563
548
  endLine: nodeRange.end,
564
549
  signatureStartLine: nodeRange.signatureStart,
565
550
  signatureEndLine: nodeRange.signatureEnd,
566
- signatureText: signatureTextForNode(node),
551
+ signatureText: signatureTextForNode(sourceFile, node),
567
552
  });
568
553
  };
569
- sourceFile.getFunctions().forEach((funcDecl) => {
570
- addRange(funcDecl.getName(), "function", funcDecl);
571
- });
572
- sourceFile.getClasses().forEach((classDecl) => {
573
- addRange(classDecl.getName(), "class", classDecl);
574
- classDecl.getMethods().forEach((methodDecl) => {
575
- addRange(methodDecl.getName(), "method", methodDecl);
576
- });
577
- });
578
- sourceFile.getVariableDeclarations().forEach((varDecl) => {
579
- const initializer = varDecl.getInitializer();
580
- const kind = initializer &&
581
- (initializer.getKind() === ts_morph_1.SyntaxKind.ArrowFunction ||
582
- initializer.getKind() === ts_morph_1.SyntaxKind.FunctionExpression)
583
- ? "function"
584
- : "variable";
585
- addRange(varDecl.getName(), kind, varDecl);
586
- });
554
+ const visit = (node) => {
555
+ if (ts_morph_1.ts.isFunctionDeclaration(node)) {
556
+ addRange(node.name?.text, "function", node);
557
+ }
558
+ else if (ts_morph_1.ts.isClassDeclaration(node)) {
559
+ addRange(node.name?.text, "class", node);
560
+ node.members.forEach((member) => {
561
+ if (ts_morph_1.ts.isMethodDeclaration(member)) {
562
+ addRange(propertyNameText(member.name, sourceFile), "method", member);
563
+ }
564
+ });
565
+ return;
566
+ }
567
+ else if (ts_morph_1.ts.isVariableDeclaration(node) && isTopLevelVariableDeclaration(node)) {
568
+ const initializer = node.initializer;
569
+ const kind = initializer &&
570
+ (ts_morph_1.ts.isArrowFunction(initializer) || ts_morph_1.ts.isFunctionExpression(initializer))
571
+ ? "function"
572
+ : "variable";
573
+ addRange(bindingNameText(node.name, sourceFile), kind, node);
574
+ }
575
+ ts_morph_1.ts.forEachChild(node, visit);
576
+ };
577
+ ts_morph_1.ts.forEachChild(sourceFile, visit);
587
578
  return ranges;
588
579
  }
589
580
  function parsePythonSymbolRanges(engine, workspaceRoot, projectPath, content) {
@@ -654,16 +645,86 @@ function symbolsByName(symbols) {
654
645
  });
655
646
  return result;
656
647
  }
648
+ function scriptKindForPath(projectPath) {
649
+ const ext = path.extname(projectPath).toLowerCase();
650
+ if (ext === ".tsx") {
651
+ return ts_morph_1.ts.ScriptKind.TSX;
652
+ }
653
+ if (ext === ".jsx") {
654
+ return ts_morph_1.ts.ScriptKind.JSX;
655
+ }
656
+ if (ext === ".js") {
657
+ return ts_morph_1.ts.ScriptKind.JS;
658
+ }
659
+ if (ext === ".json") {
660
+ return ts_morph_1.ts.ScriptKind.JSON;
661
+ }
662
+ return ts_morph_1.ts.ScriptKind.TS;
663
+ }
657
664
  function exportedSymbolNames(sourceFile) {
658
665
  const exported = new Set();
659
- sourceFile.getExportedDeclarations().forEach((declarations, exportName) => {
660
- declarations.forEach((decl) => {
661
- const declaredName = decl.getName?.();
662
- exported.add(declaredName ?? exportName);
666
+ sourceFile.statements.forEach((statement) => {
667
+ if (ts_morph_1.ts.isFunctionDeclaration(statement)) {
668
+ addExportedName(exported, statement.name?.text, statement);
669
+ return;
670
+ }
671
+ if (ts_morph_1.ts.isClassDeclaration(statement)) {
672
+ addExportedName(exported, statement.name?.text, statement);
673
+ return;
674
+ }
675
+ if (!ts_morph_1.ts.isVariableStatement(statement)) {
676
+ return;
677
+ }
678
+ if (!isExportedNode(statement)) {
679
+ return;
680
+ }
681
+ statement.declarationList.declarations.forEach((declaration) => {
682
+ const name = bindingNameText(declaration.name, sourceFile);
683
+ if (name) {
684
+ exported.add(name);
685
+ }
686
+ });
687
+ });
688
+ sourceFile.statements.forEach((statement) => {
689
+ if (!ts_morph_1.ts.isExportDeclaration(statement)) {
690
+ return;
691
+ }
692
+ const exportClause = statement.exportClause;
693
+ if (!exportClause || !ts_morph_1.ts.isNamedExports(exportClause)) {
694
+ return;
695
+ }
696
+ exportClause.elements.forEach((namedExport) => {
697
+ exported.add(namedExport.propertyName?.text ?? namedExport.name.text);
663
698
  });
664
699
  });
665
700
  return exported;
666
701
  }
702
+ function addExportedName(exported, name, node) {
703
+ if (name && isExportedNode(node)) {
704
+ exported.add(name);
705
+ }
706
+ }
707
+ function isExportedNode(node) {
708
+ return ts_morph_1.ts.canHaveModifiers(node) &&
709
+ (ts_morph_1.ts.getModifiers(node) ?? []).some((modifier) => modifier.kind === ts_morph_1.ts.SyntaxKind.ExportKeyword);
710
+ }
711
+ function bindingNameText(name, sourceFile) {
712
+ if (ts_morph_1.ts.isIdentifier(name)) {
713
+ return name.text;
714
+ }
715
+ return name.getText(sourceFile);
716
+ }
717
+ function propertyNameText(name, sourceFile) {
718
+ if (ts_morph_1.ts.isIdentifier(name) || ts_morph_1.ts.isStringLiteral(name) || ts_morph_1.ts.isNumericLiteral(name)) {
719
+ return name.text;
720
+ }
721
+ return name.getText(sourceFile);
722
+ }
723
+ function isTopLevelVariableDeclaration(node) {
724
+ const declarationList = node.parent;
725
+ const statement = declarationList.parent;
726
+ return ts_morph_1.ts.isVariableStatement(statement) && ts_morph_1.ts.isSourceFile(statement.parent);
727
+ }
667
728
  function graphSymbolsByName(engine, workspaceRoot, projectPath) {
668
729
  const symbols = new Map();
669
730
  engine.graph.symbols.forEach((symbol) => {
@@ -673,13 +734,12 @@ function graphSymbolsByName(engine, workspaceRoot, projectPath) {
673
734
  });
674
735
  return symbols;
675
736
  }
676
- function lineRangeForNode(node) {
677
- const sourceFile = node.getSourceFile();
678
- const start = sourceFile.getLineAndColumnAtPos(node.getStart()).line;
679
- const end = sourceFile.getLineAndColumnAtPos(node.getEnd()).line;
737
+ function lineRangeForNode(sourceFile, node) {
738
+ const start = lineForPosition(sourceFile, node.getStart(sourceFile));
739
+ const end = lineForPosition(sourceFile, node.getEnd());
680
740
  const body = bodyNodeFor(node);
681
741
  const bodyStart = body
682
- ? sourceFile.getLineAndColumnAtPos(body.getStart()).line
742
+ ? lineForPosition(sourceFile, body.getStart(sourceFile))
683
743
  : start;
684
744
  return {
685
745
  start,
@@ -688,38 +748,40 @@ function lineRangeForNode(node) {
688
748
  signatureEnd: Math.max(start, Math.min(bodyStart, end)),
689
749
  };
690
750
  }
751
+ function lineForPosition(sourceFile, position) {
752
+ return sourceFile.getLineAndCharacterOfPosition(position).line + 1;
753
+ }
691
754
  function bodyNodeFor(node) {
692
- if (ts_morph_1.Node.isFunctionDeclaration(node) ||
693
- ts_morph_1.Node.isMethodDeclaration(node) ||
694
- ts_morph_1.Node.isFunctionExpression(node) ||
695
- ts_morph_1.Node.isArrowFunction(node)) {
696
- return node.getBody();
755
+ if (ts_morph_1.ts.isFunctionDeclaration(node) ||
756
+ ts_morph_1.ts.isMethodDeclaration(node) ||
757
+ ts_morph_1.ts.isFunctionExpression(node) ||
758
+ ts_morph_1.ts.isArrowFunction(node)) {
759
+ return node.body;
697
760
  }
698
- if (ts_morph_1.Node.isClassDeclaration(node)) {
761
+ if (ts_morph_1.ts.isClassDeclaration(node)) {
699
762
  return node;
700
763
  }
701
- if (ts_morph_1.Node.isVariableDeclaration(node)) {
702
- const initializer = node.getInitializer();
764
+ if (ts_morph_1.ts.isVariableDeclaration(node)) {
765
+ const initializer = node.initializer;
703
766
  if (initializer &&
704
- (ts_morph_1.Node.isArrowFunction(initializer) || ts_morph_1.Node.isFunctionExpression(initializer))) {
705
- return initializer.getBody();
767
+ (ts_morph_1.ts.isArrowFunction(initializer) || ts_morph_1.ts.isFunctionExpression(initializer))) {
768
+ return initializer.body;
706
769
  }
707
770
  }
708
771
  return undefined;
709
772
  }
710
- function signatureTextForNode(node) {
711
- const sourceFile = node.getSourceFile();
712
- const fullText = sourceFile.getFullText();
773
+ function signatureTextForNode(sourceFile, node) {
774
+ const fullText = sourceFile.text;
713
775
  const body = bodyNodeFor(node);
714
- if (body && !ts_morph_1.Node.isClassDeclaration(node)) {
715
- const start = node.getStart();
716
- const bodyStart = body.getStart();
776
+ if (body && !ts_morph_1.ts.isClassDeclaration(node)) {
777
+ const start = node.getStart(sourceFile);
778
+ const bodyStart = body.getStart(sourceFile);
717
779
  if (bodyStart > start) {
718
780
  return normalizeSignatureText(fullText.slice(start, bodyStart));
719
781
  }
720
782
  }
721
- const text = node.getText();
722
- if (ts_morph_1.Node.isClassDeclaration(node)) {
783
+ const text = node.getText(sourceFile);
784
+ if (ts_morph_1.ts.isClassDeclaration(node)) {
723
785
  const braceIndex = text.indexOf("{");
724
786
  if (braceIndex >= 0) {
725
787
  return normalizeSignatureText(text.slice(0, braceIndex));