@grafema/util 0.3.0-beta
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/LICENSE +190 -0
- package/dist/api/GraphAPI.d.ts +87 -0
- package/dist/api/GraphAPI.d.ts.map +1 -0
- package/dist/api/GraphAPI.js +212 -0
- package/dist/api/GraphAPI.js.map +1 -0
- package/dist/api/GuaranteeAPI.d.ts +147 -0
- package/dist/api/GuaranteeAPI.d.ts.map +1 -0
- package/dist/api/GuaranteeAPI.js +290 -0
- package/dist/api/GuaranteeAPI.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +214 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +441 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +199 -0
- package/dist/core/CoverageAnalyzer.js.map +1 -0
- package/dist/core/FileExplainer.d.ts +101 -0
- package/dist/core/FileExplainer.d.ts.map +1 -0
- package/dist/core/FileExplainer.js +140 -0
- package/dist/core/FileExplainer.js.map +1 -0
- package/dist/core/FileOverview.d.ts +124 -0
- package/dist/core/FileOverview.d.ts.map +1 -0
- package/dist/core/FileOverview.js +279 -0
- package/dist/core/FileOverview.js.map +1 -0
- package/dist/core/GrafemaUri.d.ts +66 -0
- package/dist/core/GrafemaUri.d.ts.map +1 -0
- package/dist/core/GrafemaUri.js +191 -0
- package/dist/core/GrafemaUri.js.map +1 -0
- package/dist/core/GraphBackend.d.ts +158 -0
- package/dist/core/GraphBackend.d.ts.map +1 -0
- package/dist/core/GraphBackend.js +85 -0
- package/dist/core/GraphBackend.js.map +1 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +104 -0
- package/dist/core/GraphFreshnessChecker.js.map +1 -0
- package/dist/core/GuaranteeManager.d.ts +254 -0
- package/dist/core/GuaranteeManager.d.ts.map +1 -0
- package/dist/core/GuaranteeManager.js +447 -0
- package/dist/core/GuaranteeManager.js.map +1 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +46 -0
- package/dist/core/HashUtils.js.map +1 -0
- package/dist/core/IncrementalReanalyzer.d.ts +33 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +67 -0
- package/dist/core/IncrementalReanalyzer.js.map +1 -0
- package/dist/core/ResourceRegistry.d.ts +17 -0
- package/dist/core/ResourceRegistry.d.ts.map +1 -0
- package/dist/core/ResourceRegistry.js +32 -0
- package/dist/core/ResourceRegistry.js.map +1 -0
- package/dist/core/SemanticId.d.ts +159 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +291 -0
- package/dist/core/SemanticId.js.map +1 -0
- package/dist/core/VersionManager.d.ts +166 -0
- package/dist/core/VersionManager.d.ts.map +1 -0
- package/dist/core/VersionManager.js +239 -0
- package/dist/core/VersionManager.js.map +1 -0
- package/dist/core/brandNodeInternal.d.ts +14 -0
- package/dist/core/brandNodeInternal.d.ts.map +1 -0
- package/dist/core/brandNodeInternal.js +4 -0
- package/dist/core/brandNodeInternal.js.map +1 -0
- package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
- package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
- package/dist/core/nodes/GuaranteeNode.js +118 -0
- package/dist/core/nodes/GuaranteeNode.js.map +1 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +130 -0
- package/dist/core/nodes/IssueNode.js.map +1 -0
- package/dist/core/nodes/NodeKind.d.ts +104 -0
- package/dist/core/nodes/NodeKind.d.ts.map +1 -0
- package/dist/core/nodes/NodeKind.js +166 -0
- package/dist/core/nodes/NodeKind.js.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +103 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +133 -0
- package/dist/diagnostics/DiagnosticCollector.js.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +122 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +300 -0
- package/dist/diagnostics/DiagnosticReporter.js.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +44 -0
- package/dist/diagnostics/DiagnosticWriter.js.map +1 -0
- package/dist/diagnostics/categories.d.ts +57 -0
- package/dist/diagnostics/categories.d.ts.map +1 -0
- package/dist/diagnostics/categories.js +71 -0
- package/dist/diagnostics/categories.js.map +1 -0
- package/dist/diagnostics/index.d.ts +17 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +15 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/errors/GrafemaError.d.ts +200 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +209 -0
- package/dist/errors/GrafemaError.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/index.d.ts +8 -0
- package/dist/instructions/index.d.ts.map +1 -0
- package/dist/instructions/index.js +20 -0
- package/dist/instructions/index.js.map +1 -0
- package/dist/instructions/onboarding.md +133 -0
- package/dist/knowledge/KnowledgeBase.d.ts +113 -0
- package/dist/knowledge/KnowledgeBase.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeBase.js +420 -0
- package/dist/knowledge/KnowledgeBase.js.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts +59 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.js +160 -0
- package/dist/knowledge/SemanticAddressResolver.js.map +1 -0
- package/dist/knowledge/git-ingest.d.ts +58 -0
- package/dist/knowledge/git-ingest.d.ts.map +1 -0
- package/dist/knowledge/git-ingest.js +301 -0
- package/dist/knowledge/git-ingest.js.map +1 -0
- package/dist/knowledge/git-queries.d.ts +86 -0
- package/dist/knowledge/git-queries.d.ts.map +1 -0
- package/dist/knowledge/git-queries.js +177 -0
- package/dist/knowledge/git-queries.js.map +1 -0
- package/dist/knowledge/index.d.ts +14 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +10 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/parser.d.ts +39 -0
- package/dist/knowledge/parser.d.ts.map +1 -0
- package/dist/knowledge/parser.js +292 -0
- package/dist/knowledge/parser.js.map +1 -0
- package/dist/knowledge/types.d.ts +133 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +8 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/logging/Logger.d.ts +98 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +274 -0
- package/dist/logging/Logger.js.map +1 -0
- package/dist/notation/archetypes.d.ts +36 -0
- package/dist/notation/archetypes.d.ts.map +1 -0
- package/dist/notation/archetypes.js +173 -0
- package/dist/notation/archetypes.js.map +1 -0
- package/dist/notation/fold.d.ts +25 -0
- package/dist/notation/fold.d.ts.map +1 -0
- package/dist/notation/fold.js +598 -0
- package/dist/notation/fold.js.map +1 -0
- package/dist/notation/index.d.ts +18 -0
- package/dist/notation/index.d.ts.map +1 -0
- package/dist/notation/index.js +16 -0
- package/dist/notation/index.js.map +1 -0
- package/dist/notation/lodExtractor.d.ts +32 -0
- package/dist/notation/lodExtractor.d.ts.map +1 -0
- package/dist/notation/lodExtractor.js +149 -0
- package/dist/notation/lodExtractor.js.map +1 -0
- package/dist/notation/nameShortener.d.ts +22 -0
- package/dist/notation/nameShortener.d.ts.map +1 -0
- package/dist/notation/nameShortener.js +24 -0
- package/dist/notation/nameShortener.js.map +1 -0
- package/dist/notation/perspectives.d.ts +11 -0
- package/dist/notation/perspectives.d.ts.map +1 -0
- package/dist/notation/perspectives.js +16 -0
- package/dist/notation/perspectives.js.map +1 -0
- package/dist/notation/renderer.d.ts +31 -0
- package/dist/notation/renderer.d.ts.map +1 -0
- package/dist/notation/renderer.js +315 -0
- package/dist/notation/renderer.js.map +1 -0
- package/dist/notation/traceRenderer.d.ts +39 -0
- package/dist/notation/traceRenderer.d.ts.map +1 -0
- package/dist/notation/traceRenderer.js +358 -0
- package/dist/notation/traceRenderer.js.map +1 -0
- package/dist/notation/types.d.ts +66 -0
- package/dist/notation/types.d.ts.map +1 -0
- package/dist/notation/types.js +10 -0
- package/dist/notation/types.js.map +1 -0
- package/dist/queries/NodeContext.d.ts +81 -0
- package/dist/queries/NodeContext.d.ts.map +1 -0
- package/dist/queries/NodeContext.js +196 -0
- package/dist/queries/NodeContext.js.map +1 -0
- package/dist/queries/findCallsInFunction.d.ts +62 -0
- package/dist/queries/findCallsInFunction.d.ts.map +1 -0
- package/dist/queries/findCallsInFunction.js +169 -0
- package/dist/queries/findCallsInFunction.js.map +1 -0
- package/dist/queries/findContainingFunction.d.ts +57 -0
- package/dist/queries/findContainingFunction.d.ts.map +1 -0
- package/dist/queries/findContainingFunction.js +91 -0
- package/dist/queries/findContainingFunction.js.map +1 -0
- package/dist/queries/index.d.ts +18 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +14 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/traceDataflow.d.ts +65 -0
- package/dist/queries/traceDataflow.d.ts.map +1 -0
- package/dist/queries/traceDataflow.js +754 -0
- package/dist/queries/traceDataflow.js.map +1 -0
- package/dist/queries/traceValues.d.ts +70 -0
- package/dist/queries/traceValues.d.ts.map +1 -0
- package/dist/queries/traceValues.js +373 -0
- package/dist/queries/traceValues.js.map +1 -0
- package/dist/queries/types.d.ts +166 -0
- package/dist/queries/types.d.ts.map +1 -0
- package/dist/queries/types.js +10 -0
- package/dist/queries/types.js.map +1 -0
- package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
- package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/GraphSchemaExtractor.js +125 -0
- package/dist/schema/GraphSchemaExtractor.js.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.js +113 -0
- package/dist/schema/InterfaceSchemaExtractor.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +356 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.js +748 -0
- package/dist/storage/backends/RFDBServerBackend.js.map +1 -0
- package/dist/storage/backends/typeValidation.d.ts +47 -0
- package/dist/storage/backends/typeValidation.d.ts.map +1 -0
- package/dist/storage/backends/typeValidation.js +141 -0
- package/dist/storage/backends/typeValidation.js.map +1 -0
- package/dist/utils/findRfdbBinary.d.ts +67 -0
- package/dist/utils/findRfdbBinary.d.ts.map +1 -0
- package/dist/utils/findRfdbBinary.js +261 -0
- package/dist/utils/findRfdbBinary.js.map +1 -0
- package/dist/utils/lazyDownload.d.ts +43 -0
- package/dist/utils/lazyDownload.d.ts.map +1 -0
- package/dist/utils/lazyDownload.js +175 -0
- package/dist/utils/lazyDownload.js.map +1 -0
- package/dist/utils/moduleResolution.d.ts +134 -0
- package/dist/utils/moduleResolution.d.ts.map +1 -0
- package/dist/utils/moduleResolution.js +189 -0
- package/dist/utils/moduleResolution.js.map +1 -0
- package/dist/utils/resolveNodeFile.d.ts +13 -0
- package/dist/utils/resolveNodeFile.d.ts.map +1 -0
- package/dist/utils/resolveNodeFile.js +18 -0
- package/dist/utils/resolveNodeFile.js.map +1 -0
- package/dist/utils/startRfdbServer.d.ts +63 -0
- package/dist/utils/startRfdbServer.d.ts.map +1 -0
- package/dist/utils/startRfdbServer.js +142 -0
- package/dist/utils/startRfdbServer.js.map +1 -0
- package/dist/validation/PathValidator.d.ts +80 -0
- package/dist/validation/PathValidator.d.ts.map +1 -0
- package/dist/validation/PathValidator.js +252 -0
- package/dist/validation/PathValidator.js.map +1 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +26 -0
- package/dist/version.js.map +1 -0
- package/package.json +50 -0
- package/src/api/GraphAPI.ts +307 -0
- package/src/api/GuaranteeAPI.ts +402 -0
- package/src/config/ConfigLoader.ts +653 -0
- package/src/config/index.ts +13 -0
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/FileOverview.ts +397 -0
- package/src/core/GrafemaUri.ts +216 -0
- package/src/core/GraphBackend.ts +266 -0
- package/src/core/GraphFreshnessChecker.ts +145 -0
- package/src/core/GuaranteeManager.ts +684 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +106 -0
- package/src/core/ResourceRegistry.ts +39 -0
- package/src/core/SemanticId.ts +423 -0
- package/src/core/VersionManager.ts +405 -0
- package/src/core/brandNodeInternal.ts +16 -0
- package/src/core/nodes/GuaranteeNode.ts +162 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/NodeKind.ts +192 -0
- package/src/diagnostics/DiagnosticCollector.ts +170 -0
- package/src/diagnostics/DiagnosticReporter.ts +395 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/categories.ts +104 -0
- package/src/diagnostics/index.ts +30 -0
- package/src/errors/GrafemaError.ts +297 -0
- package/src/index.ts +261 -0
- package/src/instructions/index.ts +21 -0
- package/src/instructions/onboarding.md +133 -0
- package/src/knowledge/KnowledgeBase.ts +486 -0
- package/src/knowledge/SemanticAddressResolver.ts +191 -0
- package/src/knowledge/git-ingest.ts +402 -0
- package/src/knowledge/git-queries.ts +269 -0
- package/src/knowledge/index.ts +29 -0
- package/src/knowledge/parser.ts +294 -0
- package/src/knowledge/types.ts +146 -0
- package/src/logging/Logger.ts +303 -0
- package/src/notation/archetypes.ts +189 -0
- package/src/notation/fold.ts +696 -0
- package/src/notation/index.ts +27 -0
- package/src/notation/lodExtractor.ts +177 -0
- package/src/notation/nameShortener.ts +24 -0
- package/src/notation/perspectives.ts +18 -0
- package/src/notation/renderer.ts +394 -0
- package/src/notation/traceRenderer.ts +458 -0
- package/src/notation/types.ts +79 -0
- package/src/queries/NodeContext.ts +280 -0
- package/src/queries/findCallsInFunction.ts +249 -0
- package/src/queries/findContainingFunction.ts +124 -0
- package/src/queries/index.ts +44 -0
- package/src/queries/traceDataflow.ts +838 -0
- package/src/queries/traceValues.ts +531 -0
- package/src/queries/types.ts +191 -0
- package/src/schema/GraphSchemaExtractor.ts +177 -0
- package/src/schema/InterfaceSchemaExtractor.ts +173 -0
- package/src/schema/index.ts +5 -0
- package/src/storage/backends/RFDBServerBackend.ts +895 -0
- package/src/storage/backends/typeValidation.ts +154 -0
- package/src/utils/findRfdbBinary.ts +288 -0
- package/src/utils/lazyDownload.ts +206 -0
- package/src/utils/moduleResolution.ts +271 -0
- package/src/utils/resolveNodeFile.ts +18 -0
- package/src/utils/startRfdbServer.ts +197 -0
- package/src/validation/PathValidator.ts +334 -0
- package/src/version.ts +28 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Resource, ResourceId, ResourceRegistry as IResourceRegistry } from '@grafema/types';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory Resource registry for a single pipeline run.
|
|
4
|
+
* Created by Orchestrator at run start, cleared at run end.
|
|
5
|
+
*
|
|
6
|
+
* Thread safety: Not needed — Grafema runs plugins sequentially within
|
|
7
|
+
* each phase. Plugins are toposorted and run one at a time.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ResourceRegistryImpl implements IResourceRegistry {
|
|
10
|
+
private resources;
|
|
11
|
+
getOrCreate<T extends Resource>(id: ResourceId, factory: () => T): T;
|
|
12
|
+
get<T extends Resource>(id: ResourceId): T | undefined;
|
|
13
|
+
has(id: ResourceId): boolean;
|
|
14
|
+
/** Clear all Resources. Called by Orchestrator at the end of a run. */
|
|
15
|
+
clear(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ResourceRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceRegistry.d.ts","sourceRoot":"","sources":["../../src/core/ResourceRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAElG;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,OAAO,CAAC,SAAS,CAAmC;IAEpD,WAAW,CAAC,CAAC,SAAS,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;IAcpE,GAAG,CAAC,CAAC,SAAS,QAAQ,EAAE,EAAE,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS;IAItD,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO;IAI5B,uEAAuE;IACvE,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory Resource registry for a single pipeline run.
|
|
3
|
+
* Created by Orchestrator at run start, cleared at run end.
|
|
4
|
+
*
|
|
5
|
+
* Thread safety: Not needed — Grafema runs plugins sequentially within
|
|
6
|
+
* each phase. Plugins are toposorted and run one at a time.
|
|
7
|
+
*/
|
|
8
|
+
export class ResourceRegistryImpl {
|
|
9
|
+
resources = new Map();
|
|
10
|
+
getOrCreate(id, factory) {
|
|
11
|
+
let resource = this.resources.get(id);
|
|
12
|
+
if (!resource) {
|
|
13
|
+
resource = factory();
|
|
14
|
+
if (resource.id !== id) {
|
|
15
|
+
throw new Error(`Resource factory returned resource with id "${resource.id}" but expected "${id}"`);
|
|
16
|
+
}
|
|
17
|
+
this.resources.set(id, resource);
|
|
18
|
+
}
|
|
19
|
+
return resource;
|
|
20
|
+
}
|
|
21
|
+
get(id) {
|
|
22
|
+
return this.resources.get(id);
|
|
23
|
+
}
|
|
24
|
+
has(id) {
|
|
25
|
+
return this.resources.has(id);
|
|
26
|
+
}
|
|
27
|
+
/** Clear all Resources. Called by Orchestrator at the end of a run. */
|
|
28
|
+
clear() {
|
|
29
|
+
this.resources.clear();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ResourceRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceRegistry.js","sourceRoot":"","sources":["../../src/core/ResourceRegistry.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IACvB,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEpD,WAAW,CAAqB,EAAc,EAAE,OAAgB;QAC9D,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,OAAO,EAAE,CAAC;YACrB,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,+CAA+C,QAAQ,CAAC,EAAE,mBAAmB,EAAE,GAAG,CACnF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,QAAa,CAAC;IACvB,CAAC;IAED,GAAG,CAAqB,EAAc;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAkB,CAAC;IACjD,CAAC;IAED,GAAG,CAAC,EAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,uEAAuE;IACvE,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SemanticId - Stable identifiers for code elements
|
|
3
|
+
*
|
|
4
|
+
* Semantic IDs provide stable identifiers for code elements that don't change
|
|
5
|
+
* when unrelated code is added/removed (no line numbers in IDs).
|
|
6
|
+
*
|
|
7
|
+
* Format: {file}->{scope_path}->{type}->{name}[#discriminator]
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* src/app.js->global->FUNCTION->processData
|
|
11
|
+
* src/app.js->UserService->METHOD->login
|
|
12
|
+
* src/app.js->getUser->if#0->CALL->console.log#0
|
|
13
|
+
*
|
|
14
|
+
* Special formats:
|
|
15
|
+
* Singletons: net:stdio->__stdio__
|
|
16
|
+
* External modules: EXTERNAL_MODULE->lodash
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Location in source file
|
|
20
|
+
*/
|
|
21
|
+
export interface Location {
|
|
22
|
+
line: number;
|
|
23
|
+
column: number;
|
|
24
|
+
endLine?: number;
|
|
25
|
+
endColumn?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Scope context for semantic ID generation
|
|
29
|
+
*/
|
|
30
|
+
export interface ScopeContext {
|
|
31
|
+
/** Source file path */
|
|
32
|
+
file: string;
|
|
33
|
+
/** Array of scope names, e.g. ['MyClass', 'myMethod', 'if#1'] */
|
|
34
|
+
scopePath: string[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Options for semantic ID generation
|
|
38
|
+
*/
|
|
39
|
+
export interface SemanticIdOptions {
|
|
40
|
+
/** Counter for disambiguation (#N) */
|
|
41
|
+
discriminator?: number;
|
|
42
|
+
/** Context string for special cases ([context]) */
|
|
43
|
+
context?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parsed semantic ID components
|
|
47
|
+
*/
|
|
48
|
+
export interface ParsedSemanticId {
|
|
49
|
+
file: string;
|
|
50
|
+
scopePath: string[];
|
|
51
|
+
type: string;
|
|
52
|
+
name: string;
|
|
53
|
+
discriminator?: number;
|
|
54
|
+
context?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Item with name and location for discriminator computation
|
|
58
|
+
*/
|
|
59
|
+
export interface LocatedItem {
|
|
60
|
+
name: string;
|
|
61
|
+
location: Location;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parsed v2 semantic ID components.
|
|
65
|
+
*
|
|
66
|
+
* v2 format: file->TYPE->name[in:namedParent,h:xxxx]#N
|
|
67
|
+
*
|
|
68
|
+
* Key difference from v1: no scope path in ID. Only nearest named ancestor
|
|
69
|
+
* (namedParent) is encoded. Anonymous scopes (if, for, try) are invisible.
|
|
70
|
+
*/
|
|
71
|
+
export interface ParsedSemanticIdV2 {
|
|
72
|
+
file: string;
|
|
73
|
+
type: string;
|
|
74
|
+
name: string;
|
|
75
|
+
namedParent?: string;
|
|
76
|
+
contentHash?: string;
|
|
77
|
+
counter?: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Content hint data for computing content hash.
|
|
81
|
+
* Each node type supplies different hints for disambiguation.
|
|
82
|
+
*/
|
|
83
|
+
export interface ContentHashHints {
|
|
84
|
+
/** Number of arguments (CALL) or parameters (FUNCTION) */
|
|
85
|
+
arity?: number;
|
|
86
|
+
/** First literal argument value (CALL) */
|
|
87
|
+
firstLiteralArg?: string;
|
|
88
|
+
/** First parameter name (FUNCTION) */
|
|
89
|
+
firstParamName?: string;
|
|
90
|
+
/** RHS expression type (VARIABLE/CONSTANT) */
|
|
91
|
+
rhsType?: string;
|
|
92
|
+
/** First significant token of RHS (VARIABLE/CONSTANT) */
|
|
93
|
+
rhsToken?: string;
|
|
94
|
+
/** Object expression chain (PROPERTY_ACCESS) */
|
|
95
|
+
objectChain?: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Compute semantic ID for any node type.
|
|
99
|
+
*
|
|
100
|
+
* @param type - Node type (FUNCTION, CALL, VARIABLE, etc.)
|
|
101
|
+
* @param name - Node name
|
|
102
|
+
* @param context - Scope context from ScopeTracker
|
|
103
|
+
* @param options - Optional discriminator or context
|
|
104
|
+
* @returns Semantic ID string
|
|
105
|
+
*/
|
|
106
|
+
export declare function computeSemanticId(type: string, name: string, context: ScopeContext, options?: SemanticIdOptions): string;
|
|
107
|
+
/**
|
|
108
|
+
* Parse semantic ID back to components.
|
|
109
|
+
*
|
|
110
|
+
* @param id - Semantic ID to parse
|
|
111
|
+
* @returns Parsed components or null if invalid
|
|
112
|
+
*/
|
|
113
|
+
export declare function parseSemanticId(id: string): ParsedSemanticId | null;
|
|
114
|
+
/**
|
|
115
|
+
* Compute discriminator for items with same name in same scope.
|
|
116
|
+
* Uses line/column for stable ordering.
|
|
117
|
+
*
|
|
118
|
+
* @param items - All items in scope
|
|
119
|
+
* @param targetName - Name to find discriminator for
|
|
120
|
+
* @param targetLocation - Location of target item
|
|
121
|
+
* @returns Discriminator (0-based index among same-named items)
|
|
122
|
+
*/
|
|
123
|
+
export declare function computeDiscriminator(items: LocatedItem[], targetName: string, targetLocation: Location): number;
|
|
124
|
+
/**
|
|
125
|
+
* Compute v2 semantic ID.
|
|
126
|
+
*
|
|
127
|
+
* Format: file->TYPE->name (top-level, no collision)
|
|
128
|
+
* Format: file->TYPE->name[in:parent] (nested, no collision)
|
|
129
|
+
* Format: file->TYPE->name[in:parent,h:xxxx] (collision, hash disambiguates)
|
|
130
|
+
* Format: file->TYPE->name[in:parent,h:xxxx]#N (hash collision, counter)
|
|
131
|
+
*
|
|
132
|
+
* @param type - Node type (FUNCTION, CALL, VARIABLE, etc.)
|
|
133
|
+
* @param name - Node name
|
|
134
|
+
* @param file - Source file path
|
|
135
|
+
* @param namedParent - Nearest named ancestor (undefined for top-level)
|
|
136
|
+
* @param contentHash - 4-hex content hash for disambiguation
|
|
137
|
+
* @param counter - Counter for hash collisions
|
|
138
|
+
*/
|
|
139
|
+
export declare function computeSemanticIdV2(type: string, name: string, file: string, namedParent?: string, contentHash?: string, counter?: number): string;
|
|
140
|
+
/**
|
|
141
|
+
* Parse v2 semantic ID back to components.
|
|
142
|
+
*
|
|
143
|
+
* Handles v2 format: file->TYPE->name[in:parent,h:xxxx]#N
|
|
144
|
+
* and special formats: net:stdio->__stdio__, EXTERNAL_MODULE->lodash
|
|
145
|
+
*
|
|
146
|
+
* @returns Parsed components or null if not a valid v2 ID
|
|
147
|
+
*/
|
|
148
|
+
export declare function parseSemanticIdV2(id: string): ParsedSemanticIdV2 | null;
|
|
149
|
+
/**
|
|
150
|
+
* FNV-1a hash function, returns 4-hex-char string.
|
|
151
|
+
*
|
|
152
|
+
* FNV-1a is simple, fast, and has good distribution for short strings.
|
|
153
|
+
* 4 hex chars = 16 bits = 65536 buckets.
|
|
154
|
+
*
|
|
155
|
+
* @param hints - Content data to hash
|
|
156
|
+
* @returns 4-char hex string (e.g., "a1b2")
|
|
157
|
+
*/
|
|
158
|
+
export declare function computeContentHash(hints: ContentHashHints): string;
|
|
159
|
+
//# sourceMappingURL=SemanticId.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SemanticId.d.ts","sourceRoot":"","sources":["../../src/core/SemanticId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAaR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAiDnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAAE,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,QAAQ,GACvB,MAAM,CAwBR;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAaR;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CA4GvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAqBlE"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SemanticId - Stable identifiers for code elements
|
|
3
|
+
*
|
|
4
|
+
* Semantic IDs provide stable identifiers for code elements that don't change
|
|
5
|
+
* when unrelated code is added/removed (no line numbers in IDs).
|
|
6
|
+
*
|
|
7
|
+
* Format: {file}->{scope_path}->{type}->{name}[#discriminator]
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* src/app.js->global->FUNCTION->processData
|
|
11
|
+
* src/app.js->UserService->METHOD->login
|
|
12
|
+
* src/app.js->getUser->if#0->CALL->console.log#0
|
|
13
|
+
*
|
|
14
|
+
* Special formats:
|
|
15
|
+
* Singletons: net:stdio->__stdio__
|
|
16
|
+
* External modules: EXTERNAL_MODULE->lodash
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Compute semantic ID for any node type.
|
|
20
|
+
*
|
|
21
|
+
* @param type - Node type (FUNCTION, CALL, VARIABLE, etc.)
|
|
22
|
+
* @param name - Node name
|
|
23
|
+
* @param context - Scope context from ScopeTracker
|
|
24
|
+
* @param options - Optional discriminator or context
|
|
25
|
+
* @returns Semantic ID string
|
|
26
|
+
*/
|
|
27
|
+
export function computeSemanticId(type, name, context, options) {
|
|
28
|
+
const { file, scopePath } = context;
|
|
29
|
+
const scope = scopePath.length > 0 ? scopePath.join('->') : 'global';
|
|
30
|
+
let id = `${file}->${scope}->${type}->${name}`;
|
|
31
|
+
if (options?.discriminator !== undefined) {
|
|
32
|
+
id += `#${options.discriminator}`;
|
|
33
|
+
}
|
|
34
|
+
else if (options?.context) {
|
|
35
|
+
id += `[${options.context}]`;
|
|
36
|
+
}
|
|
37
|
+
return id;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parse semantic ID back to components.
|
|
41
|
+
*
|
|
42
|
+
* @param id - Semantic ID to parse
|
|
43
|
+
* @returns Parsed components or null if invalid
|
|
44
|
+
*/
|
|
45
|
+
export function parseSemanticId(id) {
|
|
46
|
+
// Handle singletons
|
|
47
|
+
if (id.startsWith('net:stdio') || id.startsWith('net:request')) {
|
|
48
|
+
const [prefix, name] = id.split('->');
|
|
49
|
+
return {
|
|
50
|
+
file: '',
|
|
51
|
+
scopePath: [prefix],
|
|
52
|
+
type: 'SINGLETON',
|
|
53
|
+
name,
|
|
54
|
+
discriminator: undefined
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (id.startsWith('EXTERNAL_MODULE')) {
|
|
58
|
+
const [, name] = id.split('->');
|
|
59
|
+
return {
|
|
60
|
+
file: '',
|
|
61
|
+
scopePath: [],
|
|
62
|
+
type: 'EXTERNAL_MODULE',
|
|
63
|
+
name,
|
|
64
|
+
discriminator: undefined
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const parts = id.split('->');
|
|
68
|
+
if (parts.length < 4)
|
|
69
|
+
return null;
|
|
70
|
+
const file = parts[0];
|
|
71
|
+
const type = parts[parts.length - 2];
|
|
72
|
+
let name = parts[parts.length - 1];
|
|
73
|
+
const scopePath = parts.slice(1, -2);
|
|
74
|
+
// Parse discriminator or context
|
|
75
|
+
let discriminator;
|
|
76
|
+
let context;
|
|
77
|
+
const hashMatch = name.match(/^(.+)#(\d+)$/);
|
|
78
|
+
if (hashMatch) {
|
|
79
|
+
name = hashMatch[1];
|
|
80
|
+
discriminator = parseInt(hashMatch[2], 10);
|
|
81
|
+
}
|
|
82
|
+
const bracketMatch = name.match(/^(.+)\[(.+)\]$/);
|
|
83
|
+
if (bracketMatch) {
|
|
84
|
+
name = bracketMatch[1];
|
|
85
|
+
context = bracketMatch[2];
|
|
86
|
+
}
|
|
87
|
+
return { file, scopePath, type, name, discriminator, context };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Compute discriminator for items with same name in same scope.
|
|
91
|
+
* Uses line/column for stable ordering.
|
|
92
|
+
*
|
|
93
|
+
* @param items - All items in scope
|
|
94
|
+
* @param targetName - Name to find discriminator for
|
|
95
|
+
* @param targetLocation - Location of target item
|
|
96
|
+
* @returns Discriminator (0-based index among same-named items)
|
|
97
|
+
*/
|
|
98
|
+
export function computeDiscriminator(items, targetName, targetLocation) {
|
|
99
|
+
// Filter items with same name
|
|
100
|
+
const sameNameItems = items.filter(item => item.name === targetName);
|
|
101
|
+
if (sameNameItems.length <= 1) {
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
// Sort by line, then by column for stable ordering
|
|
105
|
+
sameNameItems.sort((a, b) => {
|
|
106
|
+
if (a.location.line !== b.location.line) {
|
|
107
|
+
return a.location.line - b.location.line;
|
|
108
|
+
}
|
|
109
|
+
return a.location.column - b.location.column;
|
|
110
|
+
});
|
|
111
|
+
// Find index of target
|
|
112
|
+
const index = sameNameItems.findIndex(item => item.location.line === targetLocation.line &&
|
|
113
|
+
item.location.column === targetLocation.column);
|
|
114
|
+
return index >= 0 ? index : 0;
|
|
115
|
+
}
|
|
116
|
+
// =============================================================================
|
|
117
|
+
// Semantic ID v2 Functions
|
|
118
|
+
// =============================================================================
|
|
119
|
+
/**
|
|
120
|
+
* Compute v2 semantic ID.
|
|
121
|
+
*
|
|
122
|
+
* Format: file->TYPE->name (top-level, no collision)
|
|
123
|
+
* Format: file->TYPE->name[in:parent] (nested, no collision)
|
|
124
|
+
* Format: file->TYPE->name[in:parent,h:xxxx] (collision, hash disambiguates)
|
|
125
|
+
* Format: file->TYPE->name[in:parent,h:xxxx]#N (hash collision, counter)
|
|
126
|
+
*
|
|
127
|
+
* @param type - Node type (FUNCTION, CALL, VARIABLE, etc.)
|
|
128
|
+
* @param name - Node name
|
|
129
|
+
* @param file - Source file path
|
|
130
|
+
* @param namedParent - Nearest named ancestor (undefined for top-level)
|
|
131
|
+
* @param contentHash - 4-hex content hash for disambiguation
|
|
132
|
+
* @param counter - Counter for hash collisions
|
|
133
|
+
*/
|
|
134
|
+
export function computeSemanticIdV2(type, name, file, namedParent, contentHash, counter) {
|
|
135
|
+
const brackets = [];
|
|
136
|
+
if (namedParent)
|
|
137
|
+
brackets.push(`in:${namedParent}`);
|
|
138
|
+
if (contentHash)
|
|
139
|
+
brackets.push(`h:${contentHash}`);
|
|
140
|
+
let id = `${file}->${type}->${name}`;
|
|
141
|
+
if (brackets.length > 0) {
|
|
142
|
+
id += `[${brackets.join(',')}]`;
|
|
143
|
+
}
|
|
144
|
+
if (counter !== undefined && counter > 0) {
|
|
145
|
+
id += `#${counter}`;
|
|
146
|
+
}
|
|
147
|
+
return id;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Parse v2 semantic ID back to components.
|
|
151
|
+
*
|
|
152
|
+
* Handles v2 format: file->TYPE->name[in:parent,h:xxxx]#N
|
|
153
|
+
* and special formats: net:stdio->__stdio__, EXTERNAL_MODULE->lodash
|
|
154
|
+
*
|
|
155
|
+
* @returns Parsed components or null if not a valid v2 ID
|
|
156
|
+
*/
|
|
157
|
+
export function parseSemanticIdV2(id) {
|
|
158
|
+
// Handle grafema:// URI input — convert to compact first
|
|
159
|
+
if (id.startsWith('grafema://')) {
|
|
160
|
+
const scheme = 'grafema://';
|
|
161
|
+
const rest = id.slice(scheme.length);
|
|
162
|
+
const slashUnderscore = rest.indexOf('/_/');
|
|
163
|
+
const hashPos = rest.indexOf('#');
|
|
164
|
+
if (slashUnderscore !== -1 && (hashPos === -1 || slashUnderscore < hashPos)) {
|
|
165
|
+
// Virtual node: decode and re-parse
|
|
166
|
+
const encodedId = rest.slice(slashUnderscore + 3);
|
|
167
|
+
const decoded = encodedId
|
|
168
|
+
.replaceAll('%3E', '>').replaceAll('%3e', '>')
|
|
169
|
+
.replaceAll('%5B', '[').replaceAll('%5b', '[')
|
|
170
|
+
.replaceAll('%5D', ']').replaceAll('%5d', ']')
|
|
171
|
+
.replaceAll('%23', '#');
|
|
172
|
+
return parseSemanticIdV2(decoded);
|
|
173
|
+
}
|
|
174
|
+
if (hashPos !== -1) {
|
|
175
|
+
const pathPart = rest.slice(0, hashPos);
|
|
176
|
+
const fragment = rest.slice(hashPos + 1);
|
|
177
|
+
const decoded = fragment
|
|
178
|
+
.replaceAll('%3E', '>').replaceAll('%3e', '>')
|
|
179
|
+
.replaceAll('%5B', '[').replaceAll('%5b', '[')
|
|
180
|
+
.replaceAll('%5D', ']').replaceAll('%5d', ']')
|
|
181
|
+
.replaceAll('%23', '#');
|
|
182
|
+
if (decoded === 'MODULE') {
|
|
183
|
+
const segments = pathPart.split('/');
|
|
184
|
+
const host = segments[0];
|
|
185
|
+
const skip = (host === 'github.com' || host === 'gitlab.com' || host === 'bitbucket.org') ? 3 : 2;
|
|
186
|
+
const filePath = segments.slice(skip).join('/');
|
|
187
|
+
return { file: filePath, type: 'MODULE', name: filePath };
|
|
188
|
+
}
|
|
189
|
+
// Standard node: extract file and reconstruct compact ID
|
|
190
|
+
const segments = pathPart.split('/');
|
|
191
|
+
const host = segments[0];
|
|
192
|
+
const skip = (host === 'github.com' || host === 'gitlab.com' || host === 'bitbucket.org') ? 3 : 2;
|
|
193
|
+
const filePath = segments.slice(skip).join('/');
|
|
194
|
+
const compactId = `${filePath}->${decoded}`;
|
|
195
|
+
return parseSemanticIdV2(compactId);
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
// Handle singletons
|
|
200
|
+
if (id.startsWith('net:stdio') || id.startsWith('net:request')) {
|
|
201
|
+
const arrowIdx = id.indexOf('->');
|
|
202
|
+
if (arrowIdx === -1)
|
|
203
|
+
return null;
|
|
204
|
+
return { file: '', type: 'SINGLETON', name: id.slice(arrowIdx + 2) };
|
|
205
|
+
}
|
|
206
|
+
if (id.startsWith('EXTERNAL_MODULE')) {
|
|
207
|
+
const arrowIdx = id.indexOf('->');
|
|
208
|
+
if (arrowIdx === -1)
|
|
209
|
+
return null;
|
|
210
|
+
return { file: '', type: 'EXTERNAL_MODULE', name: id.slice(arrowIdx + 2) };
|
|
211
|
+
}
|
|
212
|
+
// v2 format: file->TYPE->name[in:parent,h:xxxx]#N
|
|
213
|
+
// Exactly two '->' delimiters: file->TYPE->rest
|
|
214
|
+
const firstArrow = id.indexOf('->');
|
|
215
|
+
if (firstArrow === -1)
|
|
216
|
+
return null;
|
|
217
|
+
const secondArrow = id.indexOf('->', firstArrow + 2);
|
|
218
|
+
if (secondArrow === -1)
|
|
219
|
+
return null;
|
|
220
|
+
const file = id.slice(0, firstArrow);
|
|
221
|
+
const type = id.slice(firstArrow + 2, secondArrow);
|
|
222
|
+
let rest = id.slice(secondArrow + 2);
|
|
223
|
+
// Check this isn't a v1 ID (v1 has 4+ parts, meaning rest contains '->')
|
|
224
|
+
// v2 names don't contain '->' in practice
|
|
225
|
+
if (rest.includes('->'))
|
|
226
|
+
return null;
|
|
227
|
+
// Parse counter suffix: #N (only at the very end, after brackets)
|
|
228
|
+
let counter;
|
|
229
|
+
const counterMatch = rest.match(/#(\d+)$/);
|
|
230
|
+
if (counterMatch) {
|
|
231
|
+
counter = parseInt(counterMatch[1], 10);
|
|
232
|
+
rest = rest.slice(0, -counterMatch[0].length);
|
|
233
|
+
}
|
|
234
|
+
// Parse bracket content: [in:parent,h:xxxx]
|
|
235
|
+
let namedParent;
|
|
236
|
+
let contentHash;
|
|
237
|
+
let name = rest;
|
|
238
|
+
const bracketStart = rest.indexOf('[');
|
|
239
|
+
const bracketEnd = rest.lastIndexOf(']');
|
|
240
|
+
if (bracketStart !== -1 && bracketEnd === rest.length - 1) {
|
|
241
|
+
name = rest.slice(0, bracketStart);
|
|
242
|
+
const bracketContent = rest.slice(bracketStart + 1, bracketEnd);
|
|
243
|
+
for (const part of bracketContent.split(',')) {
|
|
244
|
+
const colonIdx = part.indexOf(':');
|
|
245
|
+
if (colonIdx === -1)
|
|
246
|
+
continue;
|
|
247
|
+
const key = part.slice(0, colonIdx);
|
|
248
|
+
const value = part.slice(colonIdx + 1);
|
|
249
|
+
if (key === 'in')
|
|
250
|
+
namedParent = value;
|
|
251
|
+
else if (key === 'h')
|
|
252
|
+
contentHash = value;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return { file, type, name, namedParent, contentHash, counter };
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* FNV-1a hash function, returns 4-hex-char string.
|
|
259
|
+
*
|
|
260
|
+
* FNV-1a is simple, fast, and has good distribution for short strings.
|
|
261
|
+
* 4 hex chars = 16 bits = 65536 buckets.
|
|
262
|
+
*
|
|
263
|
+
* @param hints - Content data to hash
|
|
264
|
+
* @returns 4-char hex string (e.g., "a1b2")
|
|
265
|
+
*/
|
|
266
|
+
export function computeContentHash(hints) {
|
|
267
|
+
const parts = [];
|
|
268
|
+
if (hints.arity !== undefined)
|
|
269
|
+
parts.push(`a:${hints.arity}`);
|
|
270
|
+
if (hints.firstLiteralArg !== undefined)
|
|
271
|
+
parts.push(`l:${hints.firstLiteralArg}`);
|
|
272
|
+
if (hints.firstParamName !== undefined)
|
|
273
|
+
parts.push(`p:${hints.firstParamName}`);
|
|
274
|
+
if (hints.rhsType !== undefined)
|
|
275
|
+
parts.push(`r:${hints.rhsType}`);
|
|
276
|
+
if (hints.rhsToken !== undefined)
|
|
277
|
+
parts.push(`t:${hints.rhsToken}`);
|
|
278
|
+
if (hints.objectChain !== undefined)
|
|
279
|
+
parts.push(`o:${hints.objectChain}`);
|
|
280
|
+
const input = parts.join('|');
|
|
281
|
+
// FNV-1a 32-bit
|
|
282
|
+
let hash = 0x811c9dc5; // FNV offset basis
|
|
283
|
+
for (let i = 0; i < input.length; i++) {
|
|
284
|
+
hash ^= input.charCodeAt(i);
|
|
285
|
+
hash = Math.imul(hash, 0x01000193); // FNV prime
|
|
286
|
+
}
|
|
287
|
+
// Truncate to 16 bits, format as 4-hex
|
|
288
|
+
const truncated = (hash >>> 0) & 0xffff;
|
|
289
|
+
return truncated.toString(16).padStart(4, '0');
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=SemanticId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SemanticId.js","sourceRoot":"","sources":["../../src/core/SemanticId.ts"],"names":[],"mappings":"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"}
|