@grafema/util 0.3.16 → 0.3.18
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.
- package/dist/core/FileOverview.d.ts +12 -0
- package/dist/core/FileOverview.d.ts.map +1 -1
- package/dist/core/FileOverview.js +98 -2
- package/dist/core/FileOverview.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/manifest/generator.d.ts +67 -0
- package/dist/manifest/generator.d.ts.map +1 -0
- package/dist/manifest/generator.js +390 -0
- package/dist/manifest/generator.js.map +1 -0
- package/dist/manifest/index.d.ts +5 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +3 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/resolver.d.ts +111 -0
- package/dist/manifest/resolver.d.ts.map +1 -0
- package/dist/manifest/resolver.js +210 -0
- package/dist/manifest/resolver.js.map +1 -0
- package/dist/manifest/types.d.ts +66 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +12 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/notation/archetypes.d.ts.map +1 -1
- package/dist/notation/archetypes.js +1 -0
- package/dist/notation/archetypes.js.map +1 -1
- package/package.json +3 -3
- package/src/core/FileOverview.ts +104 -2
- package/src/index.ts +14 -0
- package/src/manifest/generator.ts +479 -0
- package/src/manifest/index.ts +16 -0
- package/src/manifest/resolver.ts +248 -0
- package/src/manifest/types.ts +101 -0
- package/src/notation/archetypes.ts +1 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ManifestGenerator — generates manifest.yaml from a Grafema graph.
|
|
3
|
+
*
|
|
4
|
+
* Reads MODULE, EXPORT, EXTERNAL_MODULE, FUNCTION, CLASS nodes from the graph
|
|
5
|
+
* and assembles a Manifest object describing the package's export surface.
|
|
6
|
+
*
|
|
7
|
+
* Effects are looked up from the effects-db (builtins + packages) and
|
|
8
|
+
* propagated transitively via the call graph.
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, existsSync, readdirSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
13
|
+
import { GRAFEMA_VERSION } from '../version.js';
|
|
14
|
+
const SCHEMA_VERSION = 1;
|
|
15
|
+
const VALID_EFFECTS = new Set([
|
|
16
|
+
'PURE', 'MUTATION', 'IO', 'THROW', 'ASYNC', 'NONDETERMINISTIC', 'UNKNOWN',
|
|
17
|
+
]);
|
|
18
|
+
export class ManifestGenerator {
|
|
19
|
+
backend;
|
|
20
|
+
options;
|
|
21
|
+
effectsDb;
|
|
22
|
+
effectsCache = new Map();
|
|
23
|
+
constructor(backend, options) {
|
|
24
|
+
this.backend = backend;
|
|
25
|
+
this.options = options;
|
|
26
|
+
this.effectsDb = { runtimes: {}, packages: {} };
|
|
27
|
+
}
|
|
28
|
+
async generate() {
|
|
29
|
+
this.loadEffectsDB();
|
|
30
|
+
const exports = await this.collectExports();
|
|
31
|
+
await this.enrichEffects(exports);
|
|
32
|
+
const imports = await this.collectImports();
|
|
33
|
+
const totalInternal = await this.countInternalSymbols();
|
|
34
|
+
const manifest = {
|
|
35
|
+
schema_version: SCHEMA_VERSION,
|
|
36
|
+
analyzer_version: GRAFEMA_VERSION,
|
|
37
|
+
authored: false,
|
|
38
|
+
confidence: this.computeConfidence(exports),
|
|
39
|
+
generated: new Date().toISOString(),
|
|
40
|
+
package: {
|
|
41
|
+
purl: this.options.purl,
|
|
42
|
+
source_type: this.options.sourceType ?? 'source',
|
|
43
|
+
},
|
|
44
|
+
exports,
|
|
45
|
+
imports,
|
|
46
|
+
capabilities: {
|
|
47
|
+
total_exports: exports.length,
|
|
48
|
+
total_internal_symbols: totalInternal,
|
|
49
|
+
has_graph: existsSync(join(this.options.grafemaDir, 'graph.rfdb')),
|
|
50
|
+
},
|
|
51
|
+
access: {
|
|
52
|
+
local: './graph.rfdb',
|
|
53
|
+
},
|
|
54
|
+
language: 'typescript',
|
|
55
|
+
language_specific: {
|
|
56
|
+
module_system: 'esm',
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
return manifest;
|
|
60
|
+
}
|
|
61
|
+
/** Serialize manifest to YAML string */
|
|
62
|
+
static toYaml(manifest) {
|
|
63
|
+
return stringifyYaml(manifest, {
|
|
64
|
+
lineWidth: 120,
|
|
65
|
+
defaultKeyType: 'PLAIN',
|
|
66
|
+
defaultStringType: 'PLAIN',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// ── Effects DB loading ─────────────────────────────────────
|
|
70
|
+
loadEffectsDB() {
|
|
71
|
+
const dbPath = this.options.effectsDbPath;
|
|
72
|
+
if (!dbPath)
|
|
73
|
+
return;
|
|
74
|
+
// Load runtime builtins
|
|
75
|
+
const nodeYaml = join(dbPath, 'runtimes', 'node.yaml');
|
|
76
|
+
if (existsSync(nodeYaml)) {
|
|
77
|
+
const raw = parseYaml(readFileSync(nodeYaml, 'utf-8'));
|
|
78
|
+
this.effectsDb.runtimes = raw;
|
|
79
|
+
}
|
|
80
|
+
// Load package effects
|
|
81
|
+
const pkgDir = join(dbPath, 'packages');
|
|
82
|
+
if (existsSync(pkgDir)) {
|
|
83
|
+
for (const file of readdirSync(pkgDir)) {
|
|
84
|
+
if (!file.endsWith('.yaml'))
|
|
85
|
+
continue;
|
|
86
|
+
const raw = parseYaml(readFileSync(join(pkgDir, file), 'utf-8'));
|
|
87
|
+
if (raw && typeof raw === 'object') {
|
|
88
|
+
for (const [pkg, fns] of Object.entries(raw)) {
|
|
89
|
+
this.effectsDb.packages[pkg] = fns;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Look up effects for a builtin or external function */
|
|
96
|
+
lookupEffects(module, fn) {
|
|
97
|
+
// Check runtime builtins (node:fs → readFileSync)
|
|
98
|
+
const nodeModule = `node:${module}`;
|
|
99
|
+
if (this.effectsDb.runtimes[nodeModule]?.[fn]) {
|
|
100
|
+
return this.effectsDb.runtimes[nodeModule][fn];
|
|
101
|
+
}
|
|
102
|
+
// Also check without node: prefix
|
|
103
|
+
if (this.effectsDb.runtimes[module]?.[fn]) {
|
|
104
|
+
return this.effectsDb.runtimes[module][fn];
|
|
105
|
+
}
|
|
106
|
+
// Check package effects
|
|
107
|
+
if (this.effectsDb.packages[module]?.[fn]) {
|
|
108
|
+
return this.effectsDb.packages[module][fn];
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
// ── Export collection ──────────────────────────────────────
|
|
113
|
+
/** Definition node types we look up for exported symbols */
|
|
114
|
+
static DEF_TYPES = ['FUNCTION', 'CLASS', 'CONSTANT', 'INTERFACE'];
|
|
115
|
+
async collectExports() {
|
|
116
|
+
const seen = new Set();
|
|
117
|
+
const exports = [];
|
|
118
|
+
const entryFile = this.options.entryFile;
|
|
119
|
+
if (entryFile) {
|
|
120
|
+
// Graph-based approach:
|
|
121
|
+
// EXPORT(named) --EXPORTS--> EXPORT_BINDING(name, source) --> definition in source file
|
|
122
|
+
await this.collectExportsViaBindings(entryFile, exports, seen, new Set());
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Fallback: all exported definitions from the package
|
|
126
|
+
const prefix = this.options.packagePrefix ?? '';
|
|
127
|
+
for (const type of ManifestGenerator.DEF_TYPES) {
|
|
128
|
+
for await (const node of this.backend.queryNodes({ type: type })) {
|
|
129
|
+
if (prefix && !node.file?.startsWith(prefix))
|
|
130
|
+
continue;
|
|
131
|
+
if (!node.exported)
|
|
132
|
+
continue;
|
|
133
|
+
if (!node.name || node.name.startsWith('<'))
|
|
134
|
+
continue;
|
|
135
|
+
if (seen.has(node.name))
|
|
136
|
+
continue;
|
|
137
|
+
seen.add(node.name);
|
|
138
|
+
await this.addExportFromDefinition(node, exports);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.sort((a, b) => a.name.localeCompare(b.name));
|
|
143
|
+
return exports;
|
|
144
|
+
}
|
|
145
|
+
/** Collect exports by traversing EXPORT → EXPORT_BINDING graph edges from entry file */
|
|
146
|
+
async collectExportsViaBindings(file, exports, seen, visitedFiles) {
|
|
147
|
+
if (visitedFiles.has(file))
|
|
148
|
+
return;
|
|
149
|
+
visitedFiles.add(file);
|
|
150
|
+
for await (const exportNode of this.backend.queryNodes({ type: 'EXPORT', file })) {
|
|
151
|
+
// Star re-exports: follow RE_EXPORTS edge to source module
|
|
152
|
+
if (exportNode.name?.startsWith('*:') || exportNode.name === '*') {
|
|
153
|
+
const reExportEdges = await this.backend.getOutgoingEdges(exportNode.id, ['RE_EXPORTS']);
|
|
154
|
+
for (const edge of reExportEdges) {
|
|
155
|
+
const targetModule = await this.backend.getNode(edge.dst);
|
|
156
|
+
if (targetModule?.file) {
|
|
157
|
+
await this.collectExportsViaBindings(targetModule.file, exports, seen, visitedFiles);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
// Named exports: follow EXPORTS edges to EXPORT_BINDING nodes
|
|
163
|
+
const bindingEdges = await this.backend.getOutgoingEdges(exportNode.id, ['EXPORTS']);
|
|
164
|
+
for (const edge of bindingEdges) {
|
|
165
|
+
const binding = await this.backend.getNode(edge.dst);
|
|
166
|
+
if (!binding?.name || seen.has(binding.name))
|
|
167
|
+
continue;
|
|
168
|
+
seen.add(binding.name);
|
|
169
|
+
// Resolve the definition node from the source file
|
|
170
|
+
const source = binding.source;
|
|
171
|
+
const defNode = source
|
|
172
|
+
? await this.findDefinition(binding.name, source, file)
|
|
173
|
+
: await this.findDefinitionInFile(binding.name, file);
|
|
174
|
+
if (defNode) {
|
|
175
|
+
await this.addExportFromDefinition(defNode, exports);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Type-only export or unresolvable — add as TYPE/VARIABLE
|
|
179
|
+
exports.push({
|
|
180
|
+
name: binding.name,
|
|
181
|
+
kind: 'TYPE',
|
|
182
|
+
semanticId: binding.id,
|
|
183
|
+
effects: ['PURE'],
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** Find a definition node by name, resolving source path relative to the importing file.
|
|
190
|
+
* Follows barrel re-export chains: if the source file is a barrel (index.ts),
|
|
191
|
+
* looks for EXPORT_BINDING nodes there and follows their source recursively. */
|
|
192
|
+
async findDefinition(name, source, fromFile, depth = 0) {
|
|
193
|
+
if (depth > 5)
|
|
194
|
+
return null;
|
|
195
|
+
const resolved = this.resolveSourcePath(source, fromFile);
|
|
196
|
+
// Direct definition in resolved file
|
|
197
|
+
const def = await this.findDefinitionInFile(name, resolved);
|
|
198
|
+
if (def)
|
|
199
|
+
return def;
|
|
200
|
+
// Follow barrel re-export chain via EXPORT_BINDING
|
|
201
|
+
for await (const binding of this.backend.queryNodes({
|
|
202
|
+
type: 'EXPORT_BINDING', name, file: resolved,
|
|
203
|
+
})) {
|
|
204
|
+
const nextSource = binding.source;
|
|
205
|
+
if (nextSource) {
|
|
206
|
+
return this.findDefinition(name, nextSource, resolved, depth + 1);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
/** Resolve a relative source path to a graph-relative file path */
|
|
212
|
+
resolveSourcePath(source, fromFile) {
|
|
213
|
+
const dir = fromFile.substring(0, fromFile.lastIndexOf('/'));
|
|
214
|
+
let resolved = source.startsWith('.') ? `${dir}/${source}` : source;
|
|
215
|
+
resolved = resolved.replace(/\/\.\//g, '/');
|
|
216
|
+
if (resolved.endsWith('.js')) {
|
|
217
|
+
resolved = resolved.replace(/\.js$/, '.ts');
|
|
218
|
+
}
|
|
219
|
+
return resolved;
|
|
220
|
+
}
|
|
221
|
+
/** Find a FUNCTION/CLASS/CONSTANT/INTERFACE node by name in a specific file */
|
|
222
|
+
async findDefinitionInFile(name, file) {
|
|
223
|
+
for (const type of ManifestGenerator.DEF_TYPES) {
|
|
224
|
+
for await (const node of this.backend.queryNodes({ type: type, name, file })) {
|
|
225
|
+
return node;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
/** Build a ManifestExport entry from a definition node */
|
|
231
|
+
async addExportFromDefinition(node, exports) {
|
|
232
|
+
const kind = this.nodeTypeToExportKind(node.type);
|
|
233
|
+
const entry = {
|
|
234
|
+
name: node.name ?? '<unknown>',
|
|
235
|
+
kind,
|
|
236
|
+
semanticId: node.id,
|
|
237
|
+
effects: ['PURE'],
|
|
238
|
+
};
|
|
239
|
+
if (kind === 'FUNCTION' || kind === 'CLASS') {
|
|
240
|
+
const params = node.params;
|
|
241
|
+
if (params && params.length > 0) {
|
|
242
|
+
entry.params = params.map(p => ({ name: p, flow: 'IN' }));
|
|
243
|
+
}
|
|
244
|
+
entry.returns = { flow: 'OUT' };
|
|
245
|
+
}
|
|
246
|
+
exports.push(entry);
|
|
247
|
+
}
|
|
248
|
+
/** Map node type → ExportKind */
|
|
249
|
+
nodeTypeToExportKind(type) {
|
|
250
|
+
switch (type) {
|
|
251
|
+
case 'FUNCTION': return 'FUNCTION';
|
|
252
|
+
case 'CLASS': return 'CLASS';
|
|
253
|
+
case 'CONSTANT': return 'CONSTANT';
|
|
254
|
+
case 'INTERFACE': return 'INTERFACE';
|
|
255
|
+
default: return 'VARIABLE';
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// ── Effect computation ─────────────────────────────────────
|
|
259
|
+
/** Enrich all exports with computed effects (transitive call graph analysis) */
|
|
260
|
+
async enrichEffects(exports) {
|
|
261
|
+
for (const entry of exports) {
|
|
262
|
+
if (entry.kind !== 'FUNCTION' && entry.kind !== 'CLASS')
|
|
263
|
+
continue;
|
|
264
|
+
const effects = new Set();
|
|
265
|
+
const visited = new Set();
|
|
266
|
+
await this.collectEffectsTransitively(entry.semanticId, effects, visited);
|
|
267
|
+
const computed = [...effects].filter(e => e !== 'PURE');
|
|
268
|
+
if (computed.length > 0) {
|
|
269
|
+
entry.effects = computed;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async collectEffectsTransitively(nodeId, effects, visited, depth = 0) {
|
|
274
|
+
if (visited.has(nodeId) || depth > 20)
|
|
275
|
+
return;
|
|
276
|
+
visited.add(nodeId);
|
|
277
|
+
// Get outgoing CALLS edges
|
|
278
|
+
const callEdges = await this.backend.getOutgoingEdges(nodeId, ['CALLS']);
|
|
279
|
+
for (const edge of callEdges) {
|
|
280
|
+
const targetNode = await this.backend.getNode(edge.dst);
|
|
281
|
+
if (!targetNode)
|
|
282
|
+
continue;
|
|
283
|
+
// Check if target is an external call → look up in effects-db
|
|
284
|
+
if (targetNode.type === 'EXTERNAL_MODULE' || targetNode.type === 'GLOBAL_DEFINITION') {
|
|
285
|
+
const [module, fn] = this.parseCallTarget(targetNode);
|
|
286
|
+
if (module && fn) {
|
|
287
|
+
const knownEffects = this.lookupEffects(module, fn);
|
|
288
|
+
if (knownEffects) {
|
|
289
|
+
for (const e of knownEffects) {
|
|
290
|
+
if (VALID_EFFECTS.has(e) && e !== 'PURE')
|
|
291
|
+
effects.add(e);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
effects.add('UNKNOWN');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
// Recurse into internal calls
|
|
301
|
+
await this.collectEffectsTransitively(edge.dst, effects, visited, depth + 1);
|
|
302
|
+
}
|
|
303
|
+
// Check node's own properties for async/throw
|
|
304
|
+
const node = await this.backend.getNode(nodeId);
|
|
305
|
+
if (node) {
|
|
306
|
+
const meta = node;
|
|
307
|
+
if (meta.async === true)
|
|
308
|
+
effects.add('ASYNC');
|
|
309
|
+
const cf = meta.controlFlow;
|
|
310
|
+
if (cf?.hasThrow)
|
|
311
|
+
effects.add('THROW');
|
|
312
|
+
if (cf?.canReject)
|
|
313
|
+
effects.add('THROW');
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
parseCallTarget(node) {
|
|
317
|
+
// Parse semantic ID like "EXTERNAL_MODULE:fs" or call name like "fs.readFileSync"
|
|
318
|
+
const name = node.name ?? '';
|
|
319
|
+
if (name.includes('.')) {
|
|
320
|
+
const parts = name.split('.');
|
|
321
|
+
return [parts[0], parts.slice(1).join('.')];
|
|
322
|
+
}
|
|
323
|
+
return [name, null];
|
|
324
|
+
}
|
|
325
|
+
// ── Import collection ──────────────────────────────────────
|
|
326
|
+
async collectImports() {
|
|
327
|
+
const importMap = new Map();
|
|
328
|
+
const prefix = this.options.packagePrefix ?? '';
|
|
329
|
+
for await (const node of this.backend.queryNodes({ type: 'IMPORT' })) {
|
|
330
|
+
if (prefix && !node.file?.startsWith(prefix))
|
|
331
|
+
continue;
|
|
332
|
+
const source = node.source;
|
|
333
|
+
if (!source)
|
|
334
|
+
continue;
|
|
335
|
+
// Skip relative imports (internal modules)
|
|
336
|
+
if (source.startsWith('.') || source.startsWith('/'))
|
|
337
|
+
continue;
|
|
338
|
+
const purl = this.sourceToPurl(source);
|
|
339
|
+
if (!importMap.has(purl)) {
|
|
340
|
+
importMap.set(purl, new Set());
|
|
341
|
+
}
|
|
342
|
+
const importName = node.name ?? '*';
|
|
343
|
+
importMap.get(purl).add(importName);
|
|
344
|
+
}
|
|
345
|
+
return [...importMap.entries()]
|
|
346
|
+
.map(([purl, symbols]) => ({
|
|
347
|
+
purl,
|
|
348
|
+
symbols: [...symbols].sort(),
|
|
349
|
+
}))
|
|
350
|
+
.sort((a, b) => a.purl.localeCompare(b.purl));
|
|
351
|
+
}
|
|
352
|
+
sourceToPurl(source) {
|
|
353
|
+
// Node builtins: node:fs, node:path, etc.
|
|
354
|
+
if (source.startsWith('node:')) {
|
|
355
|
+
const mod = source.replace('node:', '');
|
|
356
|
+
return `pkg:npm/node@*#${mod}`;
|
|
357
|
+
}
|
|
358
|
+
// Scoped packages: @scope/name or @scope/name/path → pkg:npm/@scope/name
|
|
359
|
+
if (source.startsWith('@')) {
|
|
360
|
+
const parts = source.split('/');
|
|
361
|
+
const pkg = `${parts[0]}/${parts[1]}`;
|
|
362
|
+
return `pkg:npm/${pkg}`;
|
|
363
|
+
}
|
|
364
|
+
// Regular packages: name or name/path → pkg:npm/name
|
|
365
|
+
const pkg = source.split('/')[0];
|
|
366
|
+
return `pkg:npm/${pkg}`;
|
|
367
|
+
}
|
|
368
|
+
// ── Helpers ────────────────────────────────────────────────
|
|
369
|
+
async countInternalSymbols() {
|
|
370
|
+
const prefix = this.options.packagePrefix ?? '';
|
|
371
|
+
let count = 0;
|
|
372
|
+
for (const type of ['FUNCTION', 'CLASS', 'VARIABLE', 'CONSTANT', 'INTERFACE']) {
|
|
373
|
+
for await (const node of this.backend.queryNodes({ type: type })) {
|
|
374
|
+
if (prefix && !node.file?.startsWith(prefix))
|
|
375
|
+
continue;
|
|
376
|
+
count++;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return count;
|
|
380
|
+
}
|
|
381
|
+
computeConfidence(exports) {
|
|
382
|
+
if (exports.length === 0)
|
|
383
|
+
return 0;
|
|
384
|
+
const unknownCount = exports.filter(e => e.effects.includes('UNKNOWN')).length;
|
|
385
|
+
// confidence = 1.0 - (unknown_ratio * 0.5)
|
|
386
|
+
const unknownRatio = unknownCount / exports.length;
|
|
387
|
+
return Math.round((1.0 - unknownRatio * 0.5) * 100) / 100;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/manifest/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ManifestGenerator } from './generator.js';
|
|
2
|
+
export { ManifestResolver } from './resolver.js';
|
|
3
|
+
export type { ResolveResult, ManifestSummary } from './resolver.js';
|
|
4
|
+
export type { Manifest, ManifestExport, ManifestImport, ManifestParam, ManifestCapabilities, ManifestPackage, ManifestAccess, ManifestLanguageSpecific, EffectType, FlowType, ExportKind, } from './types.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ManifestResolver — resolves cross-package imports via manifest.yaml files.
|
|
3
|
+
*
|
|
4
|
+
* Given an import like `import { GraphBackend } from '@grafema/util'`,
|
|
5
|
+
* the resolver loads @grafema/util's manifest.yaml and returns the
|
|
6
|
+
* ManifestExport entry for GraphBackend (kind, effects, semanticId).
|
|
7
|
+
*
|
|
8
|
+
* This is the read-side complement to ManifestGenerator (write-side).
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const resolver = new ManifestResolver();
|
|
12
|
+
* resolver.loadFromWorkspace('/project', ['packages/util', 'packages/types']);
|
|
13
|
+
* resolver.loadFromNodeModules('/project/node_modules');
|
|
14
|
+
*
|
|
15
|
+
* const result = resolver.resolve('@grafema/util', 'GraphBackend');
|
|
16
|
+
* // → { name: 'GraphBackend', kind: 'CLASS', effects: ['PURE'], semanticId: '...' }
|
|
17
|
+
*/
|
|
18
|
+
import type { Manifest, ManifestExport } from './types.js';
|
|
19
|
+
export interface ResolveResult {
|
|
20
|
+
/** The matched export entry */
|
|
21
|
+
export: ManifestExport;
|
|
22
|
+
/** Package purl this export belongs to */
|
|
23
|
+
packagePurl: string;
|
|
24
|
+
/** Confidence of the source manifest */
|
|
25
|
+
confidence: number;
|
|
26
|
+
/** Whether the manifest has a full graph available */
|
|
27
|
+
hasGraph: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare class ManifestResolver {
|
|
30
|
+
/** package name → loaded Manifest */
|
|
31
|
+
private manifests;
|
|
32
|
+
/** package name → Map<export name → ManifestExport> (index for O(1) lookup) */
|
|
33
|
+
private exportIndex;
|
|
34
|
+
/** Number of loaded manifests */
|
|
35
|
+
get size(): number;
|
|
36
|
+
/** All loaded package names */
|
|
37
|
+
get packages(): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Load a single manifest from a YAML file path.
|
|
40
|
+
* The package name is extracted from the manifest's purl field.
|
|
41
|
+
*/
|
|
42
|
+
loadFromFile(filePath: string): Manifest | null;
|
|
43
|
+
/**
|
|
44
|
+
* Load manifests from workspace packages.
|
|
45
|
+
* Scans each directory for manifest.yaml.
|
|
46
|
+
*
|
|
47
|
+
* @param rootDir Project root directory
|
|
48
|
+
* @param packageDirs Relative paths to package directories (e.g., ['packages/util', 'packages/types'])
|
|
49
|
+
*/
|
|
50
|
+
loadFromWorkspace(rootDir: string, packageDirs: string[]): number;
|
|
51
|
+
/**
|
|
52
|
+
* Auto-discover and load manifests from node_modules.
|
|
53
|
+
* Scans node_modules for packages containing manifest.yaml.
|
|
54
|
+
* Optionally scoped to specific package names.
|
|
55
|
+
*
|
|
56
|
+
* @param nodeModulesDir Path to node_modules directory
|
|
57
|
+
* @param packageNames Optional list of package names to load (e.g., ['@grafema/util']). If omitted, scans all.
|
|
58
|
+
*/
|
|
59
|
+
loadFromNodeModules(nodeModulesDir: string, packageNames?: string[]): number;
|
|
60
|
+
/**
|
|
61
|
+
* Register a manifest directly (e.g., from in-memory generation).
|
|
62
|
+
*/
|
|
63
|
+
register(packageName: string, manifest: Manifest): void;
|
|
64
|
+
/**
|
|
65
|
+
* Resolve an import: given package name and symbol, return the export info.
|
|
66
|
+
*
|
|
67
|
+
* @param source Import source (e.g., '@grafema/util', 'graphql-yoga')
|
|
68
|
+
* @param symbolName Exported symbol name (e.g., 'GraphBackend')
|
|
69
|
+
* @returns ResolveResult or null if not found
|
|
70
|
+
*/
|
|
71
|
+
resolve(source: string, symbolName: string): ResolveResult | null;
|
|
72
|
+
/**
|
|
73
|
+
* Resolve all symbols from a specific import source.
|
|
74
|
+
* Returns a map of symbol name → ManifestExport for all known exports.
|
|
75
|
+
*
|
|
76
|
+
* Useful for: `import * as utils from '@grafema/util'`
|
|
77
|
+
*/
|
|
78
|
+
resolveAll(source: string): Map<string, ManifestExport> | null;
|
|
79
|
+
/**
|
|
80
|
+
* Get the full manifest for a package.
|
|
81
|
+
*/
|
|
82
|
+
getManifest(packageName: string): Manifest | null;
|
|
83
|
+
/**
|
|
84
|
+
* Check if a package has a loaded manifest.
|
|
85
|
+
*/
|
|
86
|
+
has(packageName: string): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Get the effects for an imported symbol.
|
|
89
|
+
* Shorthand for resolve() when you only need effects.
|
|
90
|
+
*/
|
|
91
|
+
getEffects(source: string, symbolName: string): string[] | null;
|
|
92
|
+
/**
|
|
93
|
+
* Build a dependency graph from loaded manifests.
|
|
94
|
+
* Returns: Map<packageName → Set<dependencyPackageName>>
|
|
95
|
+
*/
|
|
96
|
+
buildDependencyGraph(): Map<string, Set<string>>;
|
|
97
|
+
/**
|
|
98
|
+
* Get summary stats for all loaded manifests.
|
|
99
|
+
*/
|
|
100
|
+
getSummary(): ManifestSummary[];
|
|
101
|
+
}
|
|
102
|
+
export interface ManifestSummary {
|
|
103
|
+
packageName: string;
|
|
104
|
+
purl: string;
|
|
105
|
+
totalExports: number;
|
|
106
|
+
totalImports: number;
|
|
107
|
+
confidence: number;
|
|
108
|
+
hasGraph: boolean;
|
|
109
|
+
exportsByKind: Record<string, number>;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/manifest/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,qCAAqC;IACrC,OAAO,CAAC,SAAS,CAA+B;IAChD,+EAA+E;IAC/E,OAAO,CAAC,WAAW,CAAkD;IAErE,iCAAiC;IACjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+BAA+B;IAC/B,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAgB/C;;;;;;OAMG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM;IASjE;;;;;;;OAOG;IACH,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;IAa5E;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAWvD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAgBjE;;;;;OAKG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI;IAI9D;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAIjD;;OAEG;IACH,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIjC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAI/D;;;OAGG;IACH,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAiBhD;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;CAehC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC"}
|