@reqlan/analytical 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/analysis/analyser-registry.d.ts +21 -0
- package/out/analysis/analyser-registry.js +33 -0
- package/out/analysis/analyser-registry.js.map +1 -0
- package/out/analysis/completion-tracking-analyser.d.ts +3 -0
- package/out/analysis/completion-tracking-analyser.js +37 -0
- package/out/analysis/completion-tracking-analyser.js.map +1 -0
- package/out/analysis/deprecation-impact-analyser.d.ts +3 -0
- package/out/analysis/deprecation-impact-analyser.js +21 -0
- package/out/analysis/deprecation-impact-analyser.js.map +1 -0
- package/out/analysis/file-related-analyser.d.ts +5 -0
- package/out/analysis/file-related-analyser.js +41 -0
- package/out/analysis/file-related-analyser.js.map +1 -0
- package/out/analysis/git-dates-analyser.d.ts +9 -0
- package/out/analysis/git-dates-analyser.js +39 -0
- package/out/analysis/git-dates-analyser.js.map +1 -0
- package/out/analysis/list-ideas-analyser.d.ts +3 -0
- package/out/analysis/list-ideas-analyser.js +7 -0
- package/out/analysis/list-ideas-analyser.js.map +1 -0
- package/out/analysis/local-graph-analyser.d.ts +6 -0
- package/out/analysis/local-graph-analyser.js +42 -0
- package/out/analysis/local-graph-analyser.js.map +1 -0
- package/out/analysis/semantic-search-analyser.d.ts +8 -0
- package/out/analysis/semantic-search-analyser.js +51 -0
- package/out/analysis/semantic-search-analyser.js.map +1 -0
- package/out/analysis-api.d.ts +31 -0
- package/out/analysis-api.js +136 -0
- package/out/analysis-api.js.map +1 -0
- package/out/core/analytical-store.d.ts +78 -0
- package/out/core/analytical-store.js +141 -0
- package/out/core/analytical-store.js.map +1 -0
- package/out/core/context-model.d.ts +187 -0
- package/out/core/context-model.js +36 -0
- package/out/core/context-model.js.map +1 -0
- package/out/core/context-signals.d.ts +149 -0
- package/out/core/context-signals.js +397 -0
- package/out/core/context-signals.js.map +1 -0
- package/out/core/file-path-match.d.ts +7 -0
- package/out/core/file-path-match.js +39 -0
- package/out/core/file-path-match.js.map +1 -0
- package/out/core/file-reference-resolve.d.ts +8 -0
- package/out/core/file-reference-resolve.js +28 -0
- package/out/core/file-reference-resolve.js.map +1 -0
- package/out/core/idea-references.d.ts +13 -0
- package/out/core/idea-references.js +25 -0
- package/out/core/idea-references.js.map +1 -0
- package/out/core/index-error.d.ts +23 -0
- package/out/core/index-error.js +33 -0
- package/out/core/index-error.js.map +1 -0
- package/out/core/types.d.ts +172 -0
- package/out/core/types.js +48 -0
- package/out/core/types.js.map +1 -0
- package/out/core/workspace-paths.d.ts +4 -0
- package/out/core/workspace-paths.js +92 -0
- package/out/core/workspace-paths.js.map +1 -0
- package/out/create-runtime.d.ts +21 -0
- package/out/create-runtime.js +39 -0
- package/out/create-runtime.js.map +1 -0
- package/out/export/build-export-snapshot.d.ts +3 -0
- package/out/export/build-export-snapshot.js +573 -0
- package/out/export/build-export-snapshot.js.map +1 -0
- package/out/export/html-export-assets.d.ts +3 -0
- package/out/export/html-export-assets.js +1066 -0
- package/out/export/html-export-assets.js.map +1 -0
- package/out/export/html-export-template.d.ts +17 -0
- package/out/export/html-export-template.js +930 -0
- package/out/export/html-export-template.js.map +1 -0
- package/out/export/html-export-utils.d.ts +45 -0
- package/out/export/html-export-utils.js +262 -0
- package/out/export/html-export-utils.js.map +1 -0
- package/out/export/types.d.ts +187 -0
- package/out/export/types.js +2 -0
- package/out/export/types.js.map +1 -0
- package/out/export/write-html-export.d.ts +2 -0
- package/out/export/write-html-export.js +143 -0
- package/out/export/write-html-export.js.map +1 -0
- package/out/headless-index-service.d.ts +23 -0
- package/out/headless-index-service.js +171 -0
- package/out/headless-index-service.js.map +1 -0
- package/out/index-store/idea-extractor.d.ts +6 -0
- package/out/index-store/idea-extractor.js +271 -0
- package/out/index-store/idea-extractor.js.map +1 -0
- package/out/index-store/schema.d.ts +10 -0
- package/out/index-store/schema.js +54 -0
- package/out/index-store/schema.js.map +1 -0
- package/out/index-store/sqlite-store.d.ts +66 -0
- package/out/index-store/sqlite-store.js +964 -0
- package/out/index-store/sqlite-store.js.map +1 -0
- package/out/index-store/webview-graph-queries.d.ts +62 -0
- package/out/index-store/webview-graph-queries.js +256 -0
- package/out/index-store/webview-graph-queries.js.map +1 -0
- package/out/index-store/webview-table-queries.d.ts +57 -0
- package/out/index-store/webview-table-queries.js +199 -0
- package/out/index-store/webview-table-queries.js.map +1 -0
- package/out/index.d.ts +40 -0
- package/out/index.js +27 -0
- package/out/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { APP_JS, SHARED_STYLES, buildSearchIndexScript } from './html-export-assets.js';
|
|
4
|
+
import { renderClusterDetailPage, renderClustersIndexPage, renderCodeFileDetailPage, renderCodeFilesIndexPage, renderFileDetailPage, renderFilesIndexPage, renderGraphPage, renderHomePage, renderIdeaDetailPage, renderIdeasIndexPage, renderAttributesIndexPage, renderPrintClusterPage, renderPrintCodeFilePage, renderPrintFilePage, renderPrintHomePage, renderPrintIdeaPage } from './html-export-template.js';
|
|
5
|
+
import { stringifyJson } from './html-export-utils.js';
|
|
6
|
+
export async function writeHtmlExport(snapshot, request) {
|
|
7
|
+
const outputDir = join(request.outputDir, request.exportName);
|
|
8
|
+
const assetsDir = join(outputDir, 'assets');
|
|
9
|
+
const dataDir = join(outputDir, 'data');
|
|
10
|
+
await mkdir(assetsDir, { recursive: true });
|
|
11
|
+
await mkdir(dataDir, { recursive: true });
|
|
12
|
+
const printFileName = ensureHtmlFileName(request.printEntryFileName);
|
|
13
|
+
const indexFilePath = join(outputDir, snapshot.manifest.home.path);
|
|
14
|
+
const ideasIndexFilePath = join(outputDir, snapshot.manifest.ideasIndex.path);
|
|
15
|
+
const filesIndexFilePath = join(outputDir, snapshot.manifest.filesIndex.path);
|
|
16
|
+
const codeFilesIndexFilePath = join(outputDir, snapshot.manifest.codeFilesIndex.path);
|
|
17
|
+
const clustersIndexFilePath = join(outputDir, snapshot.manifest.clustersIndex.path);
|
|
18
|
+
const attributesIndexFilePath = join(outputDir, snapshot.manifest.attributesIndex.path);
|
|
19
|
+
const printFilePath = join(outputDir, printFileName);
|
|
20
|
+
const requirementsFilePath = request.includeRequirementsPage
|
|
21
|
+
? join(outputDir, 'requirements.html')
|
|
22
|
+
: undefined;
|
|
23
|
+
const graphFilePath = request.includeGraphPage
|
|
24
|
+
? join(outputDir, 'graph.html')
|
|
25
|
+
: undefined;
|
|
26
|
+
const dataFilePath = join(dataDir, 'export.json');
|
|
27
|
+
const manifestFilePath = join(outputDir, snapshot.manifest.dataManifest.path);
|
|
28
|
+
await Promise.all([
|
|
29
|
+
mkdir(join(outputDir, 'ideas'), { recursive: true }),
|
|
30
|
+
mkdir(join(outputDir, 'files'), { recursive: true }),
|
|
31
|
+
mkdir(join(outputDir, 'code-files'), { recursive: true }),
|
|
32
|
+
mkdir(join(outputDir, 'clusters'), { recursive: true }),
|
|
33
|
+
mkdir(join(outputDir, 'print/ideas'), { recursive: true }),
|
|
34
|
+
mkdir(join(outputDir, 'print/files'), { recursive: true }),
|
|
35
|
+
mkdir(join(outputDir, 'print/code-files'), { recursive: true }),
|
|
36
|
+
mkdir(join(outputDir, 'print/clusters'), { recursive: true })
|
|
37
|
+
]);
|
|
38
|
+
const writes = [
|
|
39
|
+
writeFile(join(assetsDir, 'styles.css'), SHARED_STYLES, 'utf8'),
|
|
40
|
+
writeFile(join(assetsDir, 'app.js'), APP_JS, 'utf8'),
|
|
41
|
+
writeFile(join(assetsDir, 'search-index.js'), buildSearchIndexScript(snapshot.searchDocuments), 'utf8'),
|
|
42
|
+
writeFile(dataFilePath, stringifyJson(snapshot), 'utf8'),
|
|
43
|
+
writeFile(join(dataDir, 'graph.json'), stringifyJson(snapshot.graphs.workspace), 'utf8'),
|
|
44
|
+
writeFile(join(dataDir, 'search.json'), stringifyJson(snapshot.searchDocuments), 'utf8'),
|
|
45
|
+
writeFile(manifestFilePath, stringifyJson({
|
|
46
|
+
...snapshot.manifest,
|
|
47
|
+
pageOptions: snapshot.pageOptions,
|
|
48
|
+
runtimeMode: snapshot.runtimeMode,
|
|
49
|
+
clusterStrategy: snapshot.clusterStrategy
|
|
50
|
+
}), 'utf8')
|
|
51
|
+
];
|
|
52
|
+
const isPrintMode = snapshot.runtimeMode === 'print';
|
|
53
|
+
writes.push(writeFile(indexFilePath, isPrintMode ? renderPrintHomePage(snapshot) : renderHomePage(snapshot), 'utf8'));
|
|
54
|
+
if (snapshot.pageOptions.includePrintPages) {
|
|
55
|
+
writes.push(writeFile(printFilePath, renderPrintHomePage(snapshot), 'utf8'));
|
|
56
|
+
}
|
|
57
|
+
if (!isPrintMode && requirementsFilePath) {
|
|
58
|
+
writes.push(writeFile(requirementsFilePath, renderIdeasIndexPage(snapshot), 'utf8'));
|
|
59
|
+
}
|
|
60
|
+
if (!isPrintMode && graphFilePath && snapshot.pageOptions.includeGraphPage) {
|
|
61
|
+
writes.push(writeFile(graphFilePath, renderGraphPage(snapshot), 'utf8'));
|
|
62
|
+
}
|
|
63
|
+
if (!isPrintMode) {
|
|
64
|
+
writes.push(writeFile(ideasIndexFilePath, renderIdeasIndexPage(snapshot), 'utf8'));
|
|
65
|
+
if (snapshot.pageOptions.includeFilePages) {
|
|
66
|
+
writes.push(writeFile(filesIndexFilePath, renderFilesIndexPage(snapshot), 'utf8'));
|
|
67
|
+
}
|
|
68
|
+
if (snapshot.pageOptions.includeCodeFilePages) {
|
|
69
|
+
writes.push(writeFile(codeFilesIndexFilePath, renderCodeFilesIndexPage(snapshot), 'utf8'));
|
|
70
|
+
}
|
|
71
|
+
if (snapshot.pageOptions.includeClusterPages) {
|
|
72
|
+
writes.push(writeFile(clustersIndexFilePath, renderClustersIndexPage(snapshot), 'utf8'));
|
|
73
|
+
}
|
|
74
|
+
writes.push(writeFile(attributesIndexFilePath, renderAttributesIndexPage(snapshot), 'utf8'));
|
|
75
|
+
}
|
|
76
|
+
if (!isPrintMode && snapshot.pageOptions.includeIdeaPages) {
|
|
77
|
+
for (const idea of snapshot.ideas) {
|
|
78
|
+
writes.push(writeFile(join(outputDir, idea.page.path), renderIdeaDetailPage(snapshot, idea), 'utf8'));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (snapshot.pageOptions.includePrintPages) {
|
|
82
|
+
for (const idea of snapshot.ideas) {
|
|
83
|
+
if (idea.page.printablePath) {
|
|
84
|
+
writes.push(writeFile(join(outputDir, idea.page.printablePath), renderPrintIdeaPage(snapshot, idea), 'utf8'));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (!isPrintMode && snapshot.pageOptions.includeFilePages) {
|
|
89
|
+
for (const file of snapshot.files) {
|
|
90
|
+
writes.push(writeFile(join(outputDir, file.page.path), renderFileDetailPage(snapshot, file), 'utf8'));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (snapshot.pageOptions.includePrintPages) {
|
|
94
|
+
for (const file of snapshot.files) {
|
|
95
|
+
writes.push(writeFile(join(outputDir, file.printPage.path), renderPrintFilePage(snapshot, file), 'utf8'));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (!isPrintMode && snapshot.pageOptions.includeCodeFilePages) {
|
|
99
|
+
for (const file of snapshot.codeFiles) {
|
|
100
|
+
writes.push(writeFile(join(outputDir, file.page.path), renderCodeFileDetailPage(snapshot, file), 'utf8'));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (snapshot.pageOptions.includePrintPages && snapshot.pageOptions.includeCodeFilePages) {
|
|
104
|
+
for (const file of snapshot.codeFiles) {
|
|
105
|
+
writes.push(writeFile(join(outputDir, file.printPage.path), renderPrintCodeFilePage(snapshot, file), 'utf8'));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!isPrintMode && snapshot.pageOptions.includeClusterPages) {
|
|
109
|
+
for (const cluster of snapshot.clusters) {
|
|
110
|
+
writes.push(writeFile(join(outputDir, cluster.page.path), renderClusterDetailPage(snapshot, cluster), 'utf8'));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (snapshot.pageOptions.includePrintPages && snapshot.pageOptions.includeClusterPages) {
|
|
114
|
+
for (const cluster of snapshot.clusters) {
|
|
115
|
+
if (cluster.page.printablePath) {
|
|
116
|
+
writes.push(writeFile(join(outputDir, cluster.page.printablePath), renderPrintClusterPage(snapshot, cluster), 'utf8'));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
await Promise.all(writes);
|
|
121
|
+
return {
|
|
122
|
+
outputDir,
|
|
123
|
+
indexFilePath,
|
|
124
|
+
printFilePath,
|
|
125
|
+
requirementsFilePath,
|
|
126
|
+
graphFilePath,
|
|
127
|
+
dataFilePath,
|
|
128
|
+
ideasIndexFilePath,
|
|
129
|
+
filesIndexFilePath,
|
|
130
|
+
codeFilesIndexFilePath: snapshot.pageOptions.includeCodeFilePages ? codeFilesIndexFilePath : undefined,
|
|
131
|
+
clustersIndexFilePath,
|
|
132
|
+
attributesIndexFilePath,
|
|
133
|
+
manifestFilePath
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function ensureHtmlFileName(value) {
|
|
137
|
+
const trimmed = value.trim();
|
|
138
|
+
if (trimmed.toLowerCase().endsWith('.html')) {
|
|
139
|
+
return trimmed;
|
|
140
|
+
}
|
|
141
|
+
return `${trimmed}.html`;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=write-html-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-html-export.js","sourceRoot":"","sources":["../../src/export/write-html-export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,QAAwB,EACxB,OAAsB;IAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACtF,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpF,MAAM,uBAAuB,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACxF,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACrD,MAAM,oBAAoB,GAAG,OAAO,CAAC,uBAAuB;QACxD,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC;QACtC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB;QAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;QAC/B,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAE9E,MAAM,OAAO,CAAC,GAAG,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KAChE,CAAC,CAAC;IAEH,MAAM,MAAM,GAAuB;QAC/B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC;QAC/D,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC;QACpD,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,sBAAsB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QACvG,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QACxD,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QACxF,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QACxF,SAAS,CAAC,gBAAgB,EAAE,aAAa,CAAC;YACtC,GAAG,QAAQ,CAAC,QAAQ;YACpB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;SAC5C,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,KAAK,OAAO,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,SAAS,CACjB,aAAa,EACb,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,EACtE,MAAM,CACT,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,oBAAoB,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,aAAa,IAAI,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACnF,IAAI,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,EAAE,yBAAyB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1G,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAClH,CAAC;QACL,CAAC;IACL,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1G,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9G,CAAC;IACL,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,CAAC;QAC5D,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9G,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,CAAC,iBAAiB,IAAI,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,CAAC;QACtF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAClH,CAAC;IACL,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;QAC3D,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACnH,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,CAAC,iBAAiB,IAAI,QAAQ,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACrF,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3H,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE1B,OAAO;QACH,SAAS;QACT,aAAa;QACb,aAAa;QACb,oBAAoB;QACpB,aAAa;QACb,YAAY;QACZ,kBAAkB;QAClB,kBAAkB;QAClB,sBAAsB,EAAE,QAAQ,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS;QACtG,qBAAqB;QACrB,uBAAuB;QACvB,gBAAgB;KACnB,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,OAAO,OAAO,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AnalyticalStore } from './core/analytical-store.js';
|
|
2
|
+
import { SqliteIndexStore } from './index-store/sqlite-store.js';
|
|
3
|
+
export declare class HeadlessIndexService {
|
|
4
|
+
private readonly analytical;
|
|
5
|
+
private readonly storagePath;
|
|
6
|
+
private readonly workspaceRoot;
|
|
7
|
+
private sqlite?;
|
|
8
|
+
private readonly services;
|
|
9
|
+
constructor(analytical: AnalyticalStore, storagePath: string, workspaceRoot: string);
|
|
10
|
+
get isReady(): boolean;
|
|
11
|
+
get indexStore(): SqliteIndexStore;
|
|
12
|
+
activate(): Promise<void>;
|
|
13
|
+
deactivate(): Promise<void>;
|
|
14
|
+
syncWorkspace(): Promise<void>;
|
|
15
|
+
indexFilePath(filePath: string): Promise<void>;
|
|
16
|
+
relativePath(fileUri: string): string;
|
|
17
|
+
resolveFileUri(pathInput: string): string;
|
|
18
|
+
listRqFiles(pathPrefix?: string): string[];
|
|
19
|
+
private rqFilePaths;
|
|
20
|
+
private collectRqFiles;
|
|
21
|
+
private walkDirectory;
|
|
22
|
+
private parseDocument;
|
|
23
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { URI } from 'langium';
|
|
2
|
+
import { NodeFileSystem } from 'langium/node';
|
|
3
|
+
import { createReqlanServices } from '@reqlan/language';
|
|
4
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
5
|
+
import { join, relative } from 'node:path';
|
|
6
|
+
import { normalizeIndexedDocument, resolveWorkspaceFileUri } from './core/workspace-paths.js';
|
|
7
|
+
import { extractIndexedDocument } from './index-store/idea-extractor.js';
|
|
8
|
+
import { SqliteIndexStore } from './index-store/sqlite-store.js';
|
|
9
|
+
export class HeadlessIndexService {
|
|
10
|
+
constructor(analytical, storagePath, workspaceRoot) {
|
|
11
|
+
this.analytical = analytical;
|
|
12
|
+
this.storagePath = storagePath;
|
|
13
|
+
this.workspaceRoot = workspaceRoot;
|
|
14
|
+
this.services = createReqlanServices({ ...NodeFileSystem });
|
|
15
|
+
this.rqFilePaths = [];
|
|
16
|
+
}
|
|
17
|
+
get isReady() {
|
|
18
|
+
return this.analytical.getState().indexState === 'ready';
|
|
19
|
+
}
|
|
20
|
+
get indexStore() {
|
|
21
|
+
if (!this.sqlite) {
|
|
22
|
+
throw new Error('Index store is not open');
|
|
23
|
+
}
|
|
24
|
+
return this.sqlite;
|
|
25
|
+
}
|
|
26
|
+
async activate() {
|
|
27
|
+
const { dispatchIndex, recordIndexError } = this.analytical.getState();
|
|
28
|
+
dispatchIndex('activate');
|
|
29
|
+
try {
|
|
30
|
+
const dbPath = join(this.storagePath, 'ideas-index.sqlite');
|
|
31
|
+
this.sqlite = await SqliteIndexStore.open(dbPath);
|
|
32
|
+
dispatchIndex('opened');
|
|
33
|
+
await this.syncWorkspace();
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
dispatchIndex('fail');
|
|
37
|
+
recordIndexError('Failed to open idea index', error);
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async deactivate() {
|
|
42
|
+
const { canDispatchIndex, dispatchIndex } = this.analytical.getState();
|
|
43
|
+
if (canDispatchIndex('deactivate')) {
|
|
44
|
+
dispatchIndex('deactivate');
|
|
45
|
+
}
|
|
46
|
+
await this.sqlite?.close();
|
|
47
|
+
this.sqlite = undefined;
|
|
48
|
+
}
|
|
49
|
+
async syncWorkspace() {
|
|
50
|
+
if (!this.sqlite) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const { dispatchIndex, setIndexReady, recordIndexError } = this.analytical.getState();
|
|
54
|
+
if (!dispatchIndex('sync')) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const files = await this.collectRqFiles();
|
|
59
|
+
for (const filePath of files) {
|
|
60
|
+
try {
|
|
61
|
+
await this.indexFilePath(filePath);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
recordIndexError(`Failed to index ${relative(this.workspaceRoot, filePath)}`, error, {
|
|
65
|
+
fileUri: relative(this.workspaceRoot, filePath).replace(/\\/g, '/'),
|
|
66
|
+
phase: 'sync'
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (!dispatchIndex('synced')) {
|
|
71
|
+
recordIndexError('Index sync finished but state transition to ready failed', undefined);
|
|
72
|
+
}
|
|
73
|
+
const counts = await this.sqlite.counts();
|
|
74
|
+
setIndexReady({ ideaCount: counts.ideas, edgeCount: counts.edges });
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
dispatchIndex('fail');
|
|
78
|
+
recordIndexError('Workspace sync failed', error);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async indexFilePath(filePath) {
|
|
83
|
+
if (!this.sqlite) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const document = await this.parseDocument(filePath);
|
|
87
|
+
if (!document) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const extractedRaw = extractIndexedDocument(document);
|
|
91
|
+
if (!extractedRaw) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const extracted = normalizeIndexedDocument(extractedRaw, this.workspaceRoot);
|
|
95
|
+
const fileUri = extracted.fileUri;
|
|
96
|
+
const existingHash = await this.sqlite.getDocumentHash(fileUri);
|
|
97
|
+
if (existingHash === extracted.contentHash) {
|
|
98
|
+
const storedEdges = await this.sqlite.countEdgesFromFile(fileUri);
|
|
99
|
+
if (storedEdges >= extracted.edges.length) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
for (const idea of extracted.ideas) {
|
|
104
|
+
idea.contentHash = extracted.contentHash;
|
|
105
|
+
}
|
|
106
|
+
await this.sqlite.upsertDocument(fileUri, extracted.contentHash, extracted.ideas, extracted.edges);
|
|
107
|
+
this.analytical.getState().recordDocumentUpdate(fileUri, extracted.ideas.length);
|
|
108
|
+
}
|
|
109
|
+
relativePath(fileUri) {
|
|
110
|
+
if (!fileUri.startsWith('file://') && !fileUri.startsWith('/')) {
|
|
111
|
+
return fileUri;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const filePath = URI.parse(fileUri).fsPath;
|
|
115
|
+
return relative(this.workspaceRoot, filePath).replace(/\\/g, '/');
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return fileUri;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
resolveFileUri(pathInput) {
|
|
122
|
+
return resolveWorkspaceFileUri(pathInput, this.workspaceRoot);
|
|
123
|
+
}
|
|
124
|
+
listRqFiles(pathPrefix = '') {
|
|
125
|
+
return [...this.rqFilePaths]
|
|
126
|
+
.map(filePath => relative(this.workspaceRoot, filePath))
|
|
127
|
+
.filter(relativePath => !pathPrefix || relativePath.includes(pathPrefix))
|
|
128
|
+
.sort((left, right) => left.localeCompare(right));
|
|
129
|
+
}
|
|
130
|
+
async collectRqFiles() {
|
|
131
|
+
const results = [];
|
|
132
|
+
await this.walkDirectory(this.workspaceRoot, results);
|
|
133
|
+
this.rqFilePaths = results;
|
|
134
|
+
return results;
|
|
135
|
+
}
|
|
136
|
+
async walkDirectory(directory, results) {
|
|
137
|
+
let entries;
|
|
138
|
+
try {
|
|
139
|
+
entries = await readdir(directory, { withFileTypes: true });
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
for (const entry of entries) {
|
|
145
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules') {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const fullPath = join(directory, entry.name);
|
|
149
|
+
if (entry.isDirectory()) {
|
|
150
|
+
await this.walkDirectory(fullPath, results);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (entry.isFile() && entry.name.endsWith('.rq')) {
|
|
154
|
+
results.push(fullPath);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async parseDocument(filePath) {
|
|
159
|
+
try {
|
|
160
|
+
const text = await readFile(filePath, 'utf8');
|
|
161
|
+
const langiumUri = URI.file(filePath);
|
|
162
|
+
const document = this.services.shared.workspace.LangiumDocumentFactory.fromString(text, langiumUri);
|
|
163
|
+
await this.services.shared.workspace.DocumentBuilder.build([document], { validation: false });
|
|
164
|
+
return document;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=headless-index-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headless-index-service.js","sourceRoot":"","sources":["../src/headless-index-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts ideas, attributes, and graph edges from parsed reqlan documents.
|
|
3
|
+
*/
|
|
4
|
+
import { type LangiumDocument } from 'langium';
|
|
5
|
+
import { type IndexedDocument } from '../core/types.js';
|
|
6
|
+
export declare function extractIndexedDocument(document: LangiumDocument): IndexedDocument | undefined;
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts ideas, attributes, and graph edges from parsed reqlan documents.
|
|
3
|
+
*/
|
|
4
|
+
import { AstUtils } from 'langium';
|
|
5
|
+
import { findEmbeddedFileReferencesInText, findNamespaceImportByAlias, isAttribute, isBracketReference, isIdea, isIdeaSet, isLocalReference, isMarkdownLink, isModel, isNamespaceImportOnlyReference, isOneLinerIdea, isQualifiedReference, isScalarValue, isWikiLink, namespaceImportBindingName, parseMarkdownLink, summarizeIdeaDeclaration, unquoteReqlanString } from '@reqlan/language';
|
|
6
|
+
import { edgeId, ideaId } from '../core/types.js';
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
export function extractIndexedDocument(document) {
|
|
9
|
+
const model = document.parseResult.value;
|
|
10
|
+
if (!isModel(model)) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
const fileUri = document.uri.toString();
|
|
14
|
+
const text = document.textDocument.getText();
|
|
15
|
+
const contentHash = hashText(text);
|
|
16
|
+
const ideas = [];
|
|
17
|
+
const edges = [];
|
|
18
|
+
for (const element of model.elements) {
|
|
19
|
+
if (isIdea(element)) {
|
|
20
|
+
ideas.push(toIdeaRecord(element, 'block', fileUri, document));
|
|
21
|
+
collectIdeaEdges(element, fileUri, edges);
|
|
22
|
+
}
|
|
23
|
+
else if (isOneLinerIdea(element)) {
|
|
24
|
+
ideas.push(toIdeaRecord(element, 'oneliner', fileUri, document));
|
|
25
|
+
collectIdeaEdges(element, fileUri, edges);
|
|
26
|
+
}
|
|
27
|
+
else if (isIdeaSet(element)) {
|
|
28
|
+
ideas.push(toIdeasetRecord(element, fileUri, document));
|
|
29
|
+
for (const member of element.members) {
|
|
30
|
+
const memberRef = member.ref;
|
|
31
|
+
if (!memberRef) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const sourceId = ideaId(fileUri, element.name);
|
|
35
|
+
const targetId = ideaId(fileUri, memberRef.name);
|
|
36
|
+
edges.push({
|
|
37
|
+
id: edgeId(sourceId, 'ideaset_member', targetId),
|
|
38
|
+
sourceId,
|
|
39
|
+
targetId,
|
|
40
|
+
kind: 'ideaset_member'
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const edge of collectReferenceEdges(model, fileUri)) {
|
|
46
|
+
edges.push(edge);
|
|
47
|
+
}
|
|
48
|
+
for (const edge of collectFileReferenceEdges(text, fileUri, ideas)) {
|
|
49
|
+
edges.push(edge);
|
|
50
|
+
}
|
|
51
|
+
return { fileUri, contentHash, ideas, edges };
|
|
52
|
+
}
|
|
53
|
+
function toIdeaRecord(idea, kind, fileUri, document) {
|
|
54
|
+
const range = idea.$cstNode?.range;
|
|
55
|
+
const attributes = collectAttributes(idea);
|
|
56
|
+
return {
|
|
57
|
+
id: ideaId(fileUri, idea.name),
|
|
58
|
+
name: idea.name,
|
|
59
|
+
kind,
|
|
60
|
+
fileUri,
|
|
61
|
+
lineStart: range?.start.line ?? 0,
|
|
62
|
+
lineEnd: range?.end.line ?? 0,
|
|
63
|
+
summary: summarizeIdeaDeclaration(idea),
|
|
64
|
+
attributesJson: JSON.stringify(attributes),
|
|
65
|
+
contentHash: ''
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function toIdeasetRecord(ideaset, fileUri, _document) {
|
|
69
|
+
const range = ideaset.$cstNode?.range;
|
|
70
|
+
return {
|
|
71
|
+
id: ideaId(fileUri, ideaset.name),
|
|
72
|
+
name: ideaset.name,
|
|
73
|
+
kind: 'ideaset',
|
|
74
|
+
fileUri,
|
|
75
|
+
lineStart: range?.start.line ?? 0,
|
|
76
|
+
lineEnd: range?.end.line ?? 0,
|
|
77
|
+
summary: `Ideaset (${ideaset.name})`,
|
|
78
|
+
attributesJson: '{}',
|
|
79
|
+
contentHash: ''
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function collectAttributes(idea) {
|
|
83
|
+
const attributes = {};
|
|
84
|
+
if (!isIdea(idea)) {
|
|
85
|
+
return attributes;
|
|
86
|
+
}
|
|
87
|
+
for (const element of idea.elements) {
|
|
88
|
+
if (!isAttribute(element)) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
attributes[element.name] = attributeValue(element);
|
|
92
|
+
if (element.negated) {
|
|
93
|
+
attributes[element.name] = false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return attributes;
|
|
97
|
+
}
|
|
98
|
+
function attributeValue(attribute) {
|
|
99
|
+
if (!attribute.value) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
if (isScalarValue(attribute.value)) {
|
|
103
|
+
return attribute.value.parts
|
|
104
|
+
.map(part => typeof part === 'string' ? part : '')
|
|
105
|
+
.join('')
|
|
106
|
+
.trim();
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
function collectIdeaEdges(idea, fileUri, edges) {
|
|
111
|
+
const sourceId = ideaId(fileUri, idea.name);
|
|
112
|
+
for (const node of AstUtils.streamAst(idea)) {
|
|
113
|
+
if (isWikiLink(node) || isBracketReference(node)) {
|
|
114
|
+
const edge = referenceToEdge(sourceId, node.target, fileUri, node);
|
|
115
|
+
if (edge) {
|
|
116
|
+
edges.push(edge);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (isMarkdownLink(node)) {
|
|
120
|
+
const target = parseMarkdownLink(node.raw)?.target;
|
|
121
|
+
if (target) {
|
|
122
|
+
edges.push({
|
|
123
|
+
id: edgeId(sourceId, 'file_reference', target),
|
|
124
|
+
sourceId,
|
|
125
|
+
targetFile: target,
|
|
126
|
+
kind: 'file_reference',
|
|
127
|
+
label: target,
|
|
128
|
+
...edgeMetaFromNode(node),
|
|
129
|
+
isResolved: true
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function collectReferenceEdges(model, fileUri) {
|
|
136
|
+
const edges = [];
|
|
137
|
+
for (const node of AstUtils.streamAst(model)) {
|
|
138
|
+
if (!isWikiLink(node) && !isBracketReference(node)) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const owningIdea = AstUtils.getContainerOfType(node, (candidate) => isIdea(candidate) || isOneLinerIdea(candidate));
|
|
142
|
+
if (!owningIdea) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const edge = referenceToEdge(ideaId(fileUri, owningIdea.name), node.target, fileUri, node);
|
|
146
|
+
if (edge) {
|
|
147
|
+
edges.push(edge);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return edges;
|
|
151
|
+
}
|
|
152
|
+
function edgeMetaFromNode(node) {
|
|
153
|
+
const line = node.$cstNode?.range?.start.line;
|
|
154
|
+
const raw = node.$cstNode?.text ?? '';
|
|
155
|
+
const snippet = raw.replace(/\s+/g, ' ').trim().slice(0, 120);
|
|
156
|
+
return {
|
|
157
|
+
sourceLine: line !== undefined ? line + 1 : undefined,
|
|
158
|
+
snippet: snippet || undefined
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function unresolvedIdeaName(target) {
|
|
162
|
+
if (!('idea' in target) || !target.idea || typeof target.idea !== 'object') {
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
const idea = target.idea;
|
|
166
|
+
if (idea.ref) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
return idea.$refText ?? idea.name;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Bare `[alias]` refs to namespace imports target the imported file (same as the editor),
|
|
173
|
+
* not an idea — emit a file_reference edge using the shared namespace-import classifier.
|
|
174
|
+
*/
|
|
175
|
+
function namespaceAliasFileEdge(sourceId, target, meta) {
|
|
176
|
+
if (!isLocalReference(target) && !isQualifiedReference(target)) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
if (!isNamespaceImportOnlyReference(target)) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
const document = AstUtils.getDocument(target);
|
|
183
|
+
const model = document.parseResult.value;
|
|
184
|
+
if (!isModel(model)) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
const bindingName = isQualifiedReference(target)
|
|
188
|
+
? target.qualifier?.$refText
|
|
189
|
+
: namespaceImportBindingName(target);
|
|
190
|
+
if (!bindingName) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
const importDecl = isQualifiedReference(target)
|
|
194
|
+
? target.qualifier?.ref
|
|
195
|
+
: findNamespaceImportByAlias(model.imports, bindingName);
|
|
196
|
+
if (!importDecl?.path) {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
const targetFile = unquoteReqlanString(importDecl.path);
|
|
200
|
+
return {
|
|
201
|
+
id: edgeId(sourceId, 'file_reference', targetFile),
|
|
202
|
+
sourceId,
|
|
203
|
+
targetFile,
|
|
204
|
+
kind: 'file_reference',
|
|
205
|
+
label: bindingName,
|
|
206
|
+
...meta,
|
|
207
|
+
isResolved: true
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function referenceToEdge(sourceId, target, fileUri, sourceNode) {
|
|
211
|
+
const meta = sourceNode ? edgeMetaFromNode(sourceNode) : {};
|
|
212
|
+
const ideaRef = 'idea' in target ? target.idea : undefined;
|
|
213
|
+
if (ideaRef && typeof ideaRef === 'object' && 'ref' in ideaRef && ideaRef.ref) {
|
|
214
|
+
const targetFileUri = AstUtils.getDocument(ideaRef.ref).uri.toString();
|
|
215
|
+
const targetId = ideaId(targetFileUri, ideaRef.ref.name);
|
|
216
|
+
return {
|
|
217
|
+
id: edgeId(sourceId, 'references', targetId),
|
|
218
|
+
sourceId,
|
|
219
|
+
targetId,
|
|
220
|
+
kind: 'references',
|
|
221
|
+
label: ideaRef.ref.name,
|
|
222
|
+
...meta,
|
|
223
|
+
isResolved: true
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const namespaceFile = namespaceAliasFileEdge(sourceId, target, meta);
|
|
227
|
+
if (namespaceFile) {
|
|
228
|
+
return namespaceFile;
|
|
229
|
+
}
|
|
230
|
+
const unresolved = unresolvedIdeaName(target);
|
|
231
|
+
if (unresolved) {
|
|
232
|
+
return {
|
|
233
|
+
id: edgeId(sourceId, 'references', `unresolved:${unresolved}`),
|
|
234
|
+
sourceId,
|
|
235
|
+
kind: 'references',
|
|
236
|
+
label: unresolved,
|
|
237
|
+
...meta,
|
|
238
|
+
isResolved: false
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
if ('file' in target && typeof target.file === 'string') {
|
|
242
|
+
return {
|
|
243
|
+
id: edgeId(sourceId, 'file_reference', target.file),
|
|
244
|
+
sourceId,
|
|
245
|
+
targetFile: target.file,
|
|
246
|
+
kind: 'file_reference',
|
|
247
|
+
label: target.file,
|
|
248
|
+
...meta,
|
|
249
|
+
isResolved: true
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
function collectFileReferenceEdges(text, fileUri, ideas) {
|
|
255
|
+
const edges = [];
|
|
256
|
+
const sourceId = ideas[0]?.id ?? `${fileUri}#__file__`;
|
|
257
|
+
for (const ref of findEmbeddedFileReferencesInText(text)) {
|
|
258
|
+
edges.push({
|
|
259
|
+
id: edgeId(sourceId, 'file_reference', ref.file),
|
|
260
|
+
sourceId,
|
|
261
|
+
targetFile: ref.file,
|
|
262
|
+
kind: 'file_reference',
|
|
263
|
+
label: ref.file
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return edges;
|
|
267
|
+
}
|
|
268
|
+
function hashText(text) {
|
|
269
|
+
return createHash('sha256').update(text).digest('hex').slice(0, 16);
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=idea-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idea-extractor.js","sourceRoot":"","sources":["../../src/index-store/idea-extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAwB,MAAM,SAAS,CAAC;AACzD,OAAO,EACH,gCAAgC,EAChC,0BAA0B,EAC1B,WAAW,EACX,kBAAkB,EAClB,MAAM,EACN,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,OAAO,EACP,8BAA8B,EAC9B,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EAKtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,MAAM,EACN,MAAM,EAMT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,sBAAsB,CAAC,QAAyB;IAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;IACzC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC9D,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YACxD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC7B,IAAI,CAAC,SAAS,EAAE,CAAC;oBACb,SAAS;gBACb,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBACjD,KAAK,CAAC,IAAI,CAAC;oBACP,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC;oBAChD,QAAQ;oBACR,QAAQ;oBACR,IAAI,EAAE,gBAAgB;iBACzB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CACjB,IAAqB,EACrB,IAAc,EACd,OAAe,EACf,QAAyB;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;IACnC,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO;QACH,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI;QACJ,OAAO;QACP,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;QAC7B,OAAO,EAAE,wBAAwB,CAAC,IAAI,CAAC;QACvC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC1C,WAAW,EAAE,EAAE;KAClB,CAAC;AACN,CAAC;AAED,SAAS,eAAe,CACpB,OAAoG,EACpG,OAAe,EACf,SAA0B;IAE1B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;IACtC,OAAO;QACH,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,SAAS;QACf,OAAO;QACP,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;QAC7B,OAAO,EAAE,YAAY,OAAO,CAAC,IAAI,GAAG;QACpC,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,EAAE;KAClB,CAAC;AACN,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAqB;IAC5C,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QACD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAS,cAAc,CAAC,SAAoB;IACxC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK;aACvB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;aACjD,IAAI,CAAC,EAAE,CAAC;aACR,IAAI,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAqB,EAAE,OAAe,EAAE,KAAmB;IACjF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACnE,IAAI,IAAI,EAAE,CAAC;gBACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;QACD,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;YACnD,IAAI,MAAM,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACP,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,CAAC;oBAC9C,QAAQ;oBACR,UAAU,EAAE,MAAM;oBAClB,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,MAAM;oBACb,GAAG,gBAAgB,CAAC,IAAI,CAAC;oBACzB,UAAU,EAAE,IAAI;iBACnB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAY,EAAE,OAAe;IACxD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,SAAS;QACb,CAAC;QACD,MAAM,UAAU,GAAG,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,SAAS,EAAgC,EAAE,CAC7F,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,CACjD,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,SAAS;QACb,CAAC;QACD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3F,IAAI,IAAI,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAEzB;IACG,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,OAAO;QACH,UAAU,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QACrD,OAAO,EAAE,OAAO,IAAI,SAAS;KAChC,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAuB;IAC/C,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAA2D,CAAC;IAChF,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAC3B,QAAgB,EAChB,MAAuB,EACvB,IAAgD;IAEhD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;IACzC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC;QAC5C,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ;QAC5B,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC;QAC3C,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG;QACvB,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO;QACH,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,CAAC;QAClD,QAAQ;QACR,UAAU;QACV,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,WAAW;QAClB,GAAG,IAAI;QACP,UAAU,EAAE,IAAI;KACnB,CAAC;AACN,CAAC;AAED,SAAS,eAAe,CACpB,QAAgB,EAChB,MAAuB,EACvB,OAAe,EACf,UAAkF;IAElF,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAC5E,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACvE,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO;YACH,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;YAC5C,QAAQ;YACR,QAAQ;YACR,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;YACvB,GAAG,IAAI;YACP,UAAU,EAAE,IAAI;SACnB,CAAC;IACN,CAAC;IACD,MAAM,aAAa,GAAG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACrE,IAAI,aAAa,EAAE,CAAC;QAChB,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,UAAU,EAAE,CAAC;QACb,OAAO;YACH,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,UAAU,EAAE,CAAC;YAC9D,QAAQ;YACR,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,UAAU;YACjB,GAAG,IAAI;YACP,UAAU,EAAE,KAAK;SACpB,CAAC;IACN,CAAC;IACD,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO;YACH,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC;YACnD,QAAQ;YACR,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,MAAM,CAAC,IAAI;YAClB,GAAG,IAAI;YACP,UAAU,EAAE,IAAI;SACnB,CAAC;IACN,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY,EAAE,OAAe,EAAE,KAAmB;IACjF,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,WAAW,CAAC;IACvD,KAAK,MAAM,GAAG,IAAI,gCAAgC,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,CAAC,IAAI,CAAC;YAChD,QAAQ;YACR,UAAU,EAAE,GAAG,CAAC,IAAI;YACpB,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,GAAG,CAAC,IAAI;SAClB,CAAC,CAAC;IACP,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC1B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC"}
|