@monoes/monograph 1.6.11 → 1.6.12

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 (68) hide show
  1. package/dist/src/pipeline/phases/orm-helpers.d.ts +11 -0
  2. package/dist/src/pipeline/phases/orm-helpers.d.ts.map +1 -0
  3. package/dist/src/pipeline/phases/orm-helpers.js +72 -0
  4. package/dist/src/pipeline/phases/orm-helpers.js.map +1 -0
  5. package/dist/src/pipeline/phases/orm-mongoose.d.ts +8 -0
  6. package/dist/src/pipeline/phases/orm-mongoose.d.ts.map +1 -0
  7. package/dist/src/pipeline/phases/orm-mongoose.js +51 -0
  8. package/dist/src/pipeline/phases/orm-mongoose.js.map +1 -0
  9. package/dist/src/pipeline/phases/orm-prisma.d.ts +8 -0
  10. package/dist/src/pipeline/phases/orm-prisma.d.ts.map +1 -0
  11. package/dist/src/pipeline/phases/orm-prisma.js +41 -0
  12. package/dist/src/pipeline/phases/orm-prisma.js.map +1 -0
  13. package/dist/src/pipeline/phases/orm-sequelize.d.ts +12 -0
  14. package/dist/src/pipeline/phases/orm-sequelize.d.ts.map +1 -0
  15. package/dist/src/pipeline/phases/orm-sequelize.js +97 -0
  16. package/dist/src/pipeline/phases/orm-sequelize.js.map +1 -0
  17. package/dist/src/pipeline/phases/orm-sqlalchemy.d.ts +8 -0
  18. package/dist/src/pipeline/phases/orm-sqlalchemy.d.ts.map +1 -0
  19. package/dist/src/pipeline/phases/orm-sqlalchemy.js +42 -0
  20. package/dist/src/pipeline/phases/orm-sqlalchemy.js.map +1 -0
  21. package/dist/src/pipeline/phases/orm-typeorm.d.ts +10 -0
  22. package/dist/src/pipeline/phases/orm-typeorm.d.ts.map +1 -0
  23. package/dist/src/pipeline/phases/orm-typeorm.js +52 -0
  24. package/dist/src/pipeline/phases/orm-typeorm.js.map +1 -0
  25. package/dist/src/pipeline/phases/orm.d.ts.map +1 -1
  26. package/dist/src/pipeline/phases/orm.js +6 -336
  27. package/dist/src/pipeline/phases/orm.js.map +1 -1
  28. package/dist/src/pipeline/phases/scope-resolution-edges.d.ts +9 -0
  29. package/dist/src/pipeline/phases/scope-resolution-edges.d.ts.map +1 -0
  30. package/dist/src/pipeline/phases/scope-resolution-edges.js +30 -0
  31. package/dist/src/pipeline/phases/scope-resolution-edges.js.map +1 -0
  32. package/dist/src/pipeline/phases/scope-resolution-function-index.d.ts +31 -0
  33. package/dist/src/pipeline/phases/scope-resolution-function-index.d.ts.map +1 -0
  34. package/dist/src/pipeline/phases/scope-resolution-function-index.js +96 -0
  35. package/dist/src/pipeline/phases/scope-resolution-function-index.js.map +1 -0
  36. package/dist/src/pipeline/phases/scope-resolution-target.d.ts +6 -0
  37. package/dist/src/pipeline/phases/scope-resolution-target.d.ts.map +1 -0
  38. package/dist/src/pipeline/phases/scope-resolution-target.js +69 -0
  39. package/dist/src/pipeline/phases/scope-resolution-target.js.map +1 -0
  40. package/dist/src/pipeline/phases/scope-resolution.d.ts.map +1 -1
  41. package/dist/src/pipeline/phases/scope-resolution.js +3 -189
  42. package/dist/src/pipeline/phases/scope-resolution.js.map +1 -1
  43. package/dist/src/storage/fts-store-hybrid.d.ts +17 -0
  44. package/dist/src/storage/fts-store-hybrid.d.ts.map +1 -0
  45. package/dist/src/storage/fts-store-hybrid.js +119 -0
  46. package/dist/src/storage/fts-store-hybrid.js.map +1 -0
  47. package/dist/src/storage/fts-store-search.d.ts +29 -0
  48. package/dist/src/storage/fts-store-search.d.ts.map +1 -0
  49. package/dist/src/storage/fts-store-search.js +177 -0
  50. package/dist/src/storage/fts-store-search.js.map +1 -0
  51. package/dist/src/storage/fts-store-terms.d.ts +8 -0
  52. package/dist/src/storage/fts-store-terms.d.ts.map +1 -0
  53. package/dist/src/storage/fts-store-terms.js +174 -0
  54. package/dist/src/storage/fts-store-terms.js.map +1 -0
  55. package/dist/src/storage/fts-store.d.ts +12 -46
  56. package/dist/src/storage/fts-store.d.ts.map +1 -1
  57. package/dist/src/storage/fts-store.js +11 -459
  58. package/dist/src/storage/fts-store.js.map +1 -1
  59. package/dist/src/web/api-queries.d.ts +89 -0
  60. package/dist/src/web/api-queries.d.ts.map +1 -0
  61. package/dist/src/web/api-queries.js +245 -0
  62. package/dist/src/web/api-queries.js.map +1 -0
  63. package/dist/src/web/api.d.ts +2 -87
  64. package/dist/src/web/api.d.ts.map +1 -1
  65. package/dist/src/web/api.js +3 -244
  66. package/dist/src/web/api.js.map +1 -1
  67. package/dist/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +1 -1
@@ -1,37 +1,14 @@
1
- import { readFileSync, statSync } from 'node:fs';
2
1
  import { basename, extname } from 'node:path';
3
2
  import { insertEdges } from '../../storage/edge-store.js';
4
3
  import { insertNodes } from '../../storage/node-store.js';
5
- import { makeId, toNormLabel } from '../../types.js';
4
+ import { langFromExt, safeReadSource } from './orm-helpers.js';
5
+ import { detectMongooseEntities } from './orm-mongoose.js';
6
+ import { detectPrismaEntities } from './orm-prisma.js';
7
+ import { detectSequelizeEntities } from './orm-sequelize.js';
8
+ import { detectSQLAlchemyEntities } from './orm-sqlalchemy.js';
9
+ import { detectTypeOrmEntities } from './orm-typeorm.js';
6
10
  // ── Supported code extensions ─────────────────────────────────────────────────
7
11
  const TS_JS_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
8
- // ── Regex patterns ────────────────────────────────────────────────────────────
9
- /** TypeORM: @Entity() decorator before a class */
10
- const TYPEORM_ENTITY_RE = /@Entity\s*\([^)]*\)\s*(?:export\s+)?(?:abstract\s+)?class\s+(\w+)/g;
11
- /** TypeORM/MikroORM column decorator (matches the decorator line only) */
12
- const TYPEORM_COLUMN_DECORATOR_RE = /@(?:Primary(?:Generated)?Column|Column|CreateDateColumn|UpdateDateColumn|DeleteDateColumn|Property|PrimaryKey|ManyToOne|OneToMany|ManyToMany|OneToOne)\s*\([^)]*\)/g;
13
- /** Property declaration after a TypeORM column decorator */
14
- const TYPEORM_PROP_RE = /(\w+)\s*[!?]?\s*:\s*(\w+)/;
15
- /** Prisma model block: model Name { ... } */
16
- const PRISMA_MODEL_RE = /^model\s+(\w+)\s*\{([^}]+)\}/gm;
17
- /** Prisma field line inside a model block */
18
- const PRISMA_FIELD_RE = /^\s+(\w+)\s+(\w+)/gm;
19
- /** Mongoose: const XxxSchema = new Schema({ */
20
- const MONGOOSE_SCHEMA_RE = /(?:const|let|var)\s+(\w*[Ss]chema)\s*=\s*new\s+(?:\w+\.)?Schema\s*\(\s*\{/g;
21
- /** Mongoose field inside a Schema object: fieldName: { type: SomeType } or fieldName: SomeType */
22
- const MONGOOSE_FIELD_RE = /(\w+)\s*:\s*(?:\{[^}]*type\s*:\s*(\w+)|(\w+))/g;
23
- /** Sequelize: class Foo extends Model (or extends Model.Model) */
24
- const SEQUELIZE_CLASS_RE = /class\s+(\w+)\s+extends\s+(?:\w+\.)?Model\b/g;
25
- /** Sequelize Model.init({ field: ... }, { sequelize }) — capture the first arg block */
26
- const SEQUELIZE_INIT_RE = /(\w+)\.init\s*\(\s*\{/g;
27
- /** Sequelize sequelize.define('ModelName', { ... }) */
28
- const SEQUELIZE_DEFINE_RE = /\.define\s*\(\s*['"](\w+)['"]\s*,\s*\{/g;
29
- /** Sequelize field inside init/define block: fieldName: DataTypes.X or fieldName: { type: DataTypes.X } */
30
- const SEQUELIZE_FIELD_RE = /(\w+)\s*:\s*(?:\{[^}]*type\s*:\s*(?:DataTypes\.)?(\w+)|(?:DataTypes\.)?(\w+))/g;
31
- /** SQLAlchemy: class Foo(Base) or class Foo(db.Model) etc. */
32
- const SQLALCHEMY_CLASS_RE = /class\s+(\w+)\s*\([^)]*Base[^)]*\)/g;
33
- /** SQLAlchemy column: fieldName = Column( */
34
- const SQLALCHEMY_COLUMN_RE = /(\w+)\s*(?::\s*[\w[\]]+)?\s*=\s*Column\s*\(/g;
35
12
  // ── Phase ─────────────────────────────────────────────────────────────────────
36
13
  export const ormPhase = {
37
14
  name: 'orm',
@@ -78,311 +55,4 @@ export const ormPhase = {
78
55
  return { entities };
79
56
  },
80
57
  };
81
- // ── Detectors ─────────────────────────────────────────────────────────────────
82
- function detectTypeOrmEntities(source, filePath, language, entities, entityNodes, fieldNodes, edges) {
83
- const entityRe = new RegExp(TYPEORM_ENTITY_RE.source, 'g');
84
- const lines = source.split('\n');
85
- let m;
86
- while ((m = entityRe.exec(source)) !== null) {
87
- const entityName = m[1];
88
- const entityNodeId = makeId('entity', entityName + filePath);
89
- const entityNode = {
90
- id: entityNodeId,
91
- label: 'Entity',
92
- name: entityName,
93
- normLabel: toNormLabel(entityName),
94
- filePath,
95
- startLine: 0,
96
- endLine: 0,
97
- isExported: true,
98
- language,
99
- };
100
- entityNodes.push(entityNode);
101
- const fields = [];
102
- const colDecRe = new RegExp(TYPEORM_COLUMN_DECORATOR_RE.source, 'g');
103
- for (let i = 0; i < lines.length; i++) {
104
- const line = lines[i];
105
- if (colDecRe.test(line)) {
106
- colDecRe.lastIndex = 0; // reset after test
107
- // Look at the next non-empty line for the property declaration
108
- for (let j = i + 1; j < Math.min(i + 4, lines.length); j++) {
109
- const propLine = lines[j].trim();
110
- if (!propLine || propLine.startsWith('@') || propLine.startsWith('//'))
111
- continue;
112
- const pm = TYPEORM_PROP_RE.exec(propLine);
113
- if (pm) {
114
- addField(entityName, pm[1], pm[2], filePath, language, entityNodeId, fields, fieldNodes, edges);
115
- }
116
- break;
117
- }
118
- }
119
- colDecRe.lastIndex = 0; // always reset
120
- }
121
- entities.push({ name: entityName, filePath, fields, entityNodeId });
122
- }
123
- }
124
- function detectPrismaEntities(source, filePath, language, entities, entityNodes, fieldNodes, edges) {
125
- const modelRe = new RegExp(PRISMA_MODEL_RE.source, 'gm');
126
- let m;
127
- while ((m = modelRe.exec(source)) !== null) {
128
- const entityName = m[1];
129
- const body = m[2];
130
- const entityNodeId = makeId('entity', entityName + filePath);
131
- const entityNode = {
132
- id: entityNodeId,
133
- label: 'Entity',
134
- name: entityName,
135
- normLabel: toNormLabel(entityName),
136
- filePath,
137
- startLine: 0,
138
- endLine: 0,
139
- isExported: true,
140
- language,
141
- };
142
- entityNodes.push(entityNode);
143
- const fields = [];
144
- const fieldRe = new RegExp(PRISMA_FIELD_RE.source, 'gm');
145
- let fm;
146
- while ((fm = fieldRe.exec(body)) !== null) {
147
- const fieldName = fm[1];
148
- const fieldType = fm[2];
149
- // Skip Prisma keywords
150
- if (['model', 'enum', 'type', 'datasource', 'generator'].includes(fieldName))
151
- continue;
152
- addField(entityName, fieldName, fieldType, filePath, language, entityNodeId, fields, fieldNodes, edges);
153
- }
154
- entities.push({ name: entityName, filePath, fields, entityNodeId });
155
- }
156
- }
157
- function detectMongooseEntities(source, filePath, language, entities, entityNodes, fieldNodes, edges) {
158
- const schemaRe = new RegExp(MONGOOSE_SCHEMA_RE.source, 'g');
159
- let m;
160
- while ((m = schemaRe.exec(source)) !== null) {
161
- const schemaVarName = m[1];
162
- // Remove 'Schema' suffix to get entity name
163
- const entityName = schemaVarName.replace(/[Ss]chema$/, '') || schemaVarName;
164
- const entityNodeId = makeId('entity', entityName + filePath);
165
- const entityNode = {
166
- id: entityNodeId,
167
- label: 'Entity',
168
- name: entityName,
169
- normLabel: toNormLabel(entityName),
170
- filePath,
171
- startLine: 0,
172
- endLine: 0,
173
- isExported: true,
174
- language,
175
- };
176
- entityNodes.push(entityNode);
177
- // Extract a block after the Schema({ starting point
178
- const blockStart = m.index + m[0].length;
179
- const block = extractBraceBlock(source, blockStart - 1, 4000);
180
- const fields = [];
181
- if (block) {
182
- const fieldRe = new RegExp(MONGOOSE_FIELD_RE.source, 'g');
183
- let fm;
184
- const seen = new Set();
185
- while ((fm = fieldRe.exec(block)) !== null) {
186
- const fieldName = fm[1];
187
- const fieldType = fm[2] ?? fm[3] ?? 'Mixed';
188
- if (seen.has(fieldName))
189
- continue;
190
- // Skip obvious non-field keys
191
- if (['type', 'required', 'default', 'ref', 'index', 'unique', 'enum'].includes(fieldName))
192
- continue;
193
- seen.add(fieldName);
194
- addField(entityName, fieldName, fieldType, filePath, language, entityNodeId, fields, fieldNodes, edges);
195
- }
196
- }
197
- entities.push({ name: entityName, filePath, fields, entityNodeId });
198
- }
199
- }
200
- function detectSequelizeEntities(source, filePath, language, entities, entityNodes, fieldNodes, edges) {
201
- // Track entity names we've already registered to avoid duplicates.
202
- const registeredNames = new Set();
203
- function registerEntity(entityName) {
204
- const entityNodeId = makeId('entity', entityName + filePath);
205
- if (registeredNames.has(entityName))
206
- return entityNodeId;
207
- registeredNames.add(entityName);
208
- const entityNode = {
209
- id: entityNodeId,
210
- label: 'Entity',
211
- name: entityName,
212
- normLabel: toNormLabel(entityName),
213
- filePath,
214
- startLine: 0,
215
- endLine: 0,
216
- isExported: true,
217
- language,
218
- };
219
- entityNodes.push(entityNode);
220
- return entityNodeId;
221
- }
222
- // Collect class names that extend Model so we can match them in .init() calls.
223
- const modelClasses = new Set();
224
- const classRe = new RegExp(SEQUELIZE_CLASS_RE.source, 'g');
225
- let cm;
226
- while ((cm = classRe.exec(source)) !== null) {
227
- modelClasses.add(cm[1]);
228
- }
229
- // Handle: ClassName.init({ ... }, { sequelize })
230
- const initRe = new RegExp(SEQUELIZE_INIT_RE.source, 'g');
231
- let im;
232
- while ((im = initRe.exec(source)) !== null) {
233
- const candidateName = im[1];
234
- // Only treat as Sequelize if it's a known Model subclass OR if DataTypes appears in the block.
235
- const blockStart = im.index + im[0].length - 1; // position of the opening '{'
236
- const block = extractBraceBlock(source, blockStart, 4000);
237
- if (!block)
238
- continue;
239
- if (!modelClasses.has(candidateName) && !block.includes('DataTypes'))
240
- continue;
241
- const entityNodeId = registerEntity(candidateName);
242
- const fields = [];
243
- const fieldRe = new RegExp(SEQUELIZE_FIELD_RE.source, 'g');
244
- let fm;
245
- const seen = new Set();
246
- while ((fm = fieldRe.exec(block)) !== null) {
247
- const fieldName = fm[1];
248
- const fieldType = fm[2] ?? fm[3] ?? 'DataType';
249
- if (seen.has(fieldName))
250
- continue;
251
- if (['type', 'allowNull', 'defaultValue', 'primaryKey', 'unique', 'references'].includes(fieldName))
252
- continue;
253
- seen.add(fieldName);
254
- addField(candidateName, fieldName, fieldType, filePath, language, entityNodeId, fields, fieldNodes, edges);
255
- }
256
- entities.push({ name: candidateName, filePath, fields, entityNodeId });
257
- }
258
- // Handle: sequelize.define('ModelName', { ... })
259
- const defineRe = new RegExp(SEQUELIZE_DEFINE_RE.source, 'g');
260
- let dm;
261
- while ((dm = defineRe.exec(source)) !== null) {
262
- const entityName = dm[1];
263
- const blockStart = dm.index + dm[0].length - 1;
264
- const block = extractBraceBlock(source, blockStart, 4000);
265
- const entityNodeId = registerEntity(entityName);
266
- const fields = [];
267
- if (block) {
268
- const fieldRe = new RegExp(SEQUELIZE_FIELD_RE.source, 'g');
269
- let fm;
270
- const seen = new Set();
271
- while ((fm = fieldRe.exec(block)) !== null) {
272
- const fieldName = fm[1];
273
- const fieldType = fm[2] ?? fm[3] ?? 'DataType';
274
- if (seen.has(fieldName))
275
- continue;
276
- if (['type', 'allowNull', 'defaultValue', 'primaryKey', 'unique', 'references'].includes(fieldName))
277
- continue;
278
- seen.add(fieldName);
279
- addField(entityName, fieldName, fieldType, filePath, language, entityNodeId, fields, fieldNodes, edges);
280
- }
281
- }
282
- entities.push({ name: entityName, filePath, fields, entityNodeId });
283
- }
284
- }
285
- function detectSQLAlchemyEntities(source, filePath, language, entities, entityNodes, fieldNodes, edges) {
286
- const classRe = new RegExp(SQLALCHEMY_CLASS_RE.source, 'g');
287
- let m;
288
- while ((m = classRe.exec(source)) !== null) {
289
- const entityName = m[1];
290
- const entityNodeId = makeId('entity', entityName + filePath);
291
- const entityNode = {
292
- id: entityNodeId,
293
- label: 'Entity',
294
- name: entityName,
295
- normLabel: toNormLabel(entityName),
296
- filePath,
297
- startLine: 0,
298
- endLine: 0,
299
- isExported: true,
300
- language,
301
- };
302
- entityNodes.push(entityNode);
303
- const fields = [];
304
- // Scope column scan to this class's body — slice from the match end to the next
305
- // unindented `class ` keyword or end-of-string to avoid assigning columns from
306
- // other classes to this entity.
307
- const classBodyStart = m.index + m[0].length;
308
- const nextClassIdx = source.indexOf('\nclass ', classBodyStart);
309
- const classBody = nextClassIdx >= 0 ? source.slice(classBodyStart, nextClassIdx) : source.slice(classBodyStart);
310
- const columnRe = new RegExp(SQLALCHEMY_COLUMN_RE.source, 'g');
311
- let cm;
312
- while ((cm = columnRe.exec(classBody)) !== null) {
313
- const fieldName = cm[1];
314
- addField(entityName, fieldName, 'Column', filePath, language, entityNodeId, fields, fieldNodes, edges);
315
- }
316
- entities.push({ name: entityName, filePath, fields, entityNodeId });
317
- }
318
- }
319
- // ── Helpers ───────────────────────────────────────────────────────────────────
320
- function addField(entityName, fieldName, fieldType, filePath, language, entityNodeId, fields, fieldNodes, edges) {
321
- const fieldNodeId = makeId('field', entityName + fieldName + filePath);
322
- const fieldNode = {
323
- id: fieldNodeId,
324
- label: 'Field',
325
- name: fieldName,
326
- normLabel: toNormLabel(fieldName),
327
- filePath,
328
- startLine: 0,
329
- endLine: 0,
330
- isExported: false,
331
- language,
332
- properties: { declaredType: fieldType },
333
- };
334
- fieldNodes.push(fieldNode);
335
- const edgeId = makeId(entityNodeId, fieldNodeId, 'has_field');
336
- edges.push({
337
- id: edgeId,
338
- sourceId: entityNodeId,
339
- targetId: fieldNodeId,
340
- relation: 'HAS_FIELD',
341
- confidence: 'EXTRACTED',
342
- confidenceScore: 0.9,
343
- });
344
- fields.push({ name: fieldName, type: fieldType, fieldNodeId });
345
- }
346
- /**
347
- * Extracts a balanced brace block from source starting at the position of the
348
- * opening `{`. Returns the content between the braces (not including the braces).
349
- */
350
- function extractBraceBlock(source, openPos, maxLen) {
351
- // Find the opening brace at or after openPos
352
- const start = source.indexOf('{', openPos);
353
- if (start === -1)
354
- return undefined;
355
- let depth = 0;
356
- let i = start;
357
- const end = Math.min(start + maxLen, source.length);
358
- for (; i < end; i++) {
359
- if (source[i] === '{')
360
- depth++;
361
- else if (source[i] === '}') {
362
- depth--;
363
- if (depth === 0)
364
- return source.slice(start + 1, i);
365
- }
366
- }
367
- // Return partial block if not closed within maxLen
368
- return source.slice(start + 1, i);
369
- }
370
- function safeReadSource(absPath, maxBytes) {
371
- try {
372
- const stat = statSync(absPath);
373
- if (stat.size > maxBytes)
374
- return undefined;
375
- return readFileSync(absPath, 'utf-8');
376
- }
377
- catch {
378
- return undefined;
379
- }
380
- }
381
- function langFromExt(ext) {
382
- if (ext === '.ts' || ext === '.tsx')
383
- return 'typescript';
384
- if (ext === '.js' || ext === '.jsx' || ext === '.mjs' || ext === '.cjs')
385
- return 'javascript';
386
- return 'unknown';
387
- }
388
58
  //# sourceMappingURL=orm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"orm.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/orm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orm.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/orm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface PreparedEdgeStmts {
2
+ selectExisting: import('better-sqlite3').Statement;
3
+ updateScore: import('better-sqlite3').Statement;
4
+ insertNew: import('better-sqlite3').Statement;
5
+ }
6
+ export declare function prepareEdgeStmts(db: import('better-sqlite3').Database): PreparedEdgeStmts;
7
+ export declare const RESOLVED_CONFIDENCE_SCORE = 0.75;
8
+ export declare function emitEdge(stmts: PreparedEdgeStmts, sourceId: string, targetId: string): 'inserted' | 'upgraded' | 'skipped';
9
+ //# sourceMappingURL=scope-resolution-edges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-resolution-edges.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/scope-resolution-edges.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,OAAO,gBAAgB,EAAE,SAAS,CAAC;IACnD,WAAW,EAAE,OAAO,gBAAgB,EAAE,SAAS,CAAC;IAChD,SAAS,EAAE,OAAO,gBAAgB,EAAE,SAAS,CAAC;CAC/C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,gBAAgB,EAAE,QAAQ,GAAG,iBAAiB,CAYzF;AAED,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,wBAAgB,QAAQ,CACtB,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,UAAU,GAAG,UAAU,GAAG,SAAS,CAsBrC"}
@@ -0,0 +1,30 @@
1
+ import { makeId } from '../../types.js';
2
+ export function prepareEdgeStmts(db) {
3
+ return {
4
+ selectExisting: db.prepare(`SELECT id, confidence_score FROM edges WHERE source_id = ? AND target_id = ? AND relation = 'CALLS'`),
5
+ updateScore: db.prepare(`UPDATE edges SET confidence_score = ?, confidence = 'EXTRACTED' WHERE id = ?`),
6
+ insertNew: db.prepare(`INSERT OR IGNORE INTO edges (id, source_id, target_id, relation, confidence, confidence_score) VALUES (?, ?, ?, 'CALLS', 'EXTRACTED', ?)`),
7
+ };
8
+ }
9
+ export const RESOLVED_CONFIDENCE_SCORE = 0.75;
10
+ export function emitEdge(stmts, sourceId, targetId) {
11
+ if (sourceId === targetId)
12
+ return 'skipped';
13
+ const existing = stmts.selectExisting.get(sourceId, targetId);
14
+ if (existing) {
15
+ const newScore = Math.max(existing.confidence_score, RESOLVED_CONFIDENCE_SCORE);
16
+ if (newScore > existing.confidence_score) {
17
+ stmts.updateScore.run(newScore, existing.id);
18
+ }
19
+ return 'upgraded';
20
+ }
21
+ const edgeId = makeId(sourceId, targetId, 'calls_resolved');
22
+ try {
23
+ stmts.insertNew.run(edgeId, sourceId, targetId, RESOLVED_CONFIDENCE_SCORE);
24
+ return 'inserted';
25
+ }
26
+ catch {
27
+ return 'skipped';
28
+ }
29
+ }
30
+ //# sourceMappingURL=scope-resolution-edges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-resolution-edges.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/scope-resolution-edges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAYxC,MAAM,UAAU,gBAAgB,CAAC,EAAqC;IACpE,OAAO;QACL,cAAc,EAAE,EAAE,CAAC,OAAO,CACxB,qGAAqG,CACtG;QACD,WAAW,EAAE,EAAE,CAAC,OAAO,CACrB,8EAA8E,CAC/E;QACD,SAAS,EAAE,EAAE,CAAC,OAAO,CACnB,0IAA0I,CAC3I;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,MAAM,UAAU,QAAQ,CACtB,KAAwB,EACxB,QAAgB,EAChB,QAAgB;IAEhB,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE5C,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAE/C,CAAC;IAEd,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAC;QAChF,IAAI,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACzC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { PipelineContext } from '../types.js';
2
+ export declare function buildFunctionIndex(ctx: PipelineContext): {
3
+ byFilePath: Map<string, Map<string, string[]>>;
4
+ nameCounts: Map<string, number>;
5
+ };
6
+ /** A callable node with a known line range, used to attribute a call to its caller. */
7
+ export interface EnclosingSymbol {
8
+ id: string;
9
+ startLine: number;
10
+ endLine: number;
11
+ }
12
+ /**
13
+ * Line ranges of every callable, grouped by file, innermost-first.
14
+ *
15
+ * Call edges are attributed to the enclosing function rather than the file.
16
+ * Attributing them to the file makes a function appear "used" by its own file
17
+ * purely because it is declared there, which silently disabled dead-export
18
+ * detection: `detectDeadCodeNodes` rejects any candidate with an inbound CALLS
19
+ * edge, and that self-edge always existed.
20
+ */
21
+ export declare function buildEnclosingIndex(ctx: PipelineContext): Map<string, EnclosingSymbol[]>;
22
+ /** Line-start offsets, for turning a match offset into a 1-based line number. */
23
+ export declare function buildLineOffsets(source: string): number[];
24
+ export declare function lineAtOffset(lineOffsets: number[], offset: number): number;
25
+ /**
26
+ * The innermost callable containing `offset`, or null when the call sits at
27
+ * module top level — which is genuinely file-scoped, so the file node stays
28
+ * the correct source for those.
29
+ */
30
+ export declare function findEnclosingSymbolId(enclosing: EnclosingSymbol[] | undefined, lineOffsets: number[], offset: number | undefined): string | null;
31
+ //# sourceMappingURL=scope-resolution-function-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-resolution-function-index.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/scope-resolution-function-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG;IACxD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CA4BA;AAED,uFAAuF;AACvF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CA6BxF;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAMzD;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAS1E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,eAAe,EAAE,GAAG,SAAS,EACxC,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,GAAG,IAAI,CAOf"}
@@ -0,0 +1,96 @@
1
+ // Split out of scope-resolution.ts (file-size sweep). Pure move: no behaviour change.
2
+ // ── Function index ───────────────────────────────────────────────────────────
3
+ export function buildFunctionIndex(ctx) {
4
+ const byFilePath = new Map();
5
+ const nameCounts = new Map();
6
+ if (!ctx.db)
7
+ return { byFilePath, nameCounts };
8
+ const rows = ctx.db
9
+ .prepare(`SELECT id, name, file_path FROM nodes WHERE label IN ('Function', 'Method', 'Constructor', 'Class') AND file_path IS NOT NULL`)
10
+ .all();
11
+ for (const row of rows) {
12
+ let fileMap = byFilePath.get(row.file_path);
13
+ if (!fileMap) {
14
+ fileMap = new Map();
15
+ byFilePath.set(row.file_path, fileMap);
16
+ }
17
+ let ids = fileMap.get(row.name);
18
+ if (!ids) {
19
+ ids = [];
20
+ fileMap.set(row.name, ids);
21
+ }
22
+ ids.push(row.id);
23
+ nameCounts.set(row.name, (nameCounts.get(row.name) ?? 0) + 1);
24
+ }
25
+ return { byFilePath, nameCounts };
26
+ }
27
+ /**
28
+ * Line ranges of every callable, grouped by file, innermost-first.
29
+ *
30
+ * Call edges are attributed to the enclosing function rather than the file.
31
+ * Attributing them to the file makes a function appear "used" by its own file
32
+ * purely because it is declared there, which silently disabled dead-export
33
+ * detection: `detectDeadCodeNodes` rejects any candidate with an inbound CALLS
34
+ * edge, and that self-edge always existed.
35
+ */
36
+ export function buildEnclosingIndex(ctx) {
37
+ const byFile = new Map();
38
+ if (!ctx.db)
39
+ return byFile;
40
+ const rows = ctx.db
41
+ .prepare(`SELECT id, file_path, start_line, end_line FROM nodes
42
+ WHERE label IN ('Function', 'Method', 'Constructor')
43
+ AND file_path IS NOT NULL AND start_line IS NOT NULL AND end_line IS NOT NULL`)
44
+ .all();
45
+ for (const row of rows) {
46
+ let list = byFile.get(row.file_path);
47
+ if (!list) {
48
+ list = [];
49
+ byFile.set(row.file_path, list);
50
+ }
51
+ list.push({ id: row.id, startLine: row.start_line, endLine: row.end_line });
52
+ }
53
+ // Narrowest range first, so the first containing match is the innermost
54
+ // scope — a call inside a closure belongs to the closure, not the function
55
+ // that happens to wrap it.
56
+ for (const list of byFile.values()) {
57
+ list.sort((a, b) => a.endLine - a.startLine - (b.endLine - b.startLine));
58
+ }
59
+ return byFile;
60
+ }
61
+ /** Line-start offsets, for turning a match offset into a 1-based line number. */
62
+ export function buildLineOffsets(source) {
63
+ const offsets = [0];
64
+ for (let i = 0; i < source.length; i++) {
65
+ if (source.charCodeAt(i) === 10)
66
+ offsets.push(i + 1);
67
+ }
68
+ return offsets;
69
+ }
70
+ export function lineAtOffset(lineOffsets, offset) {
71
+ let lo = 0, hi = lineOffsets.length - 1;
72
+ while (lo < hi) {
73
+ const mid = (lo + hi + 1) >> 1;
74
+ if (lineOffsets[mid] <= offset)
75
+ lo = mid;
76
+ else
77
+ hi = mid - 1;
78
+ }
79
+ return lo + 1;
80
+ }
81
+ /**
82
+ * The innermost callable containing `offset`, or null when the call sits at
83
+ * module top level — which is genuinely file-scoped, so the file node stays
84
+ * the correct source for those.
85
+ */
86
+ export function findEnclosingSymbolId(enclosing, lineOffsets, offset) {
87
+ if (!enclosing || enclosing.length === 0 || offset === undefined)
88
+ return null;
89
+ const line = lineAtOffset(lineOffsets, offset);
90
+ for (const sym of enclosing) {
91
+ if (line >= sym.startLine && line <= sym.endLine)
92
+ return sym.id;
93
+ }
94
+ return null;
95
+ }
96
+ //# sourceMappingURL=scope-resolution-function-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-resolution-function-index.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/scope-resolution-function-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CallSite } from './call-site-extractors.js';
2
+ export declare function pickBestId(ids: string[], site: CallSite): string | null;
3
+ export declare function resolveTarget(site: CallSite, callerFilePath: string, importMap: Map<string, string>, fnIndex: Map<string, Map<string, string[]>>, ctorMap: Map<string, string> | undefined, importedFiles: string[]): {
4
+ targetId: string;
5
+ } | null;
6
+ //# sourceMappingURL=scope-resolution-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-resolution-target.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/scope-resolution-target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAM1D,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAUvE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,EACd,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAC3C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,aAAa,EAAE,MAAM,EAAE,GACtB;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgD7B"}