The parser's own code graph
Runs in any browser
Nothing to install.
The call graph of @geml/geml and its viewer, laid out as GEML documents by geml codemap build: one document per source file, every function a block with an id, and every call an edge kept both ways — #calls in the caller's document, #called-by in the callee's. geml codemap verify runs geml check and the profile's reference checks over the whole folder.
The result
How it is made
A SCIP index of each package goes in; a folder of .geml documents and the pages above come out. It is rebuilt from the parser's source whenever geml's main changes, and every document in it passes geml check:
npx @sourcegraph/scip-typescript index --output parser.scip # in geml-parser/, and again in the viewer
geml codemap build --adapter scip --raw parser.scip --adapter scip --raw viewer.scip --root . --out codemap --container file
geml codemap verify codemap
geml codemap render codemapindex.geml lists every module; each module has a document like geml-parser--attrs.ts.geml below — a code block per function, pointing at its lines in the source, then the edges.
=== meta
profile = "geml-codemap/v1"
repo = geml
commit = de1d065
container = file
entry = geml-viewer--content.js.geml#main
resolution-default = cpg
===
# Code map — geml
=== table {#modules format=csv .no-fold}
module, doc, methods, entries, tests
geml-parser/geml.ts, geml-parser--geml.ts.geml, 115, 26, 0
geml-parser/verbs.ts, geml-parser--verbs.ts.geml, 72, 21, 0
geml-parser/cli.ts, geml-parser--cli.ts.geml, 48, 0, 0
geml-parser/render.ts, geml-parser--render.ts.geml, 48, 8, 0
geml-parser/history.ts, geml-parser--history.ts.geml, 39, 7, 0
geml-parser/table.ts, geml-parser--table.ts.geml, 31, 5, 0
geml-parser/mcp-core.ts, geml-parser--mcp-core.ts.geml, 28, 1, 0
geml-parser/media-verbs.ts, geml-parser--media-verbs.ts.geml, 28, 15, 0
geml-viewer/render.js, geml-viewer--render.js.geml, 28, 5, 0
geml-parser/coord.ts, geml-parser--coord.ts.geml, 26, 8, 0
geml-parser/style-resolve.ts, geml-parser--style-resolve.ts.geml, 26, 2, 0
geml-parser/inline.ts, geml-parser--inline.ts.geml, 23, 4, 0
geml-parser/edn.ts, geml-parser--edn.ts.geml, 20, 2, 0
geml-parser/style-selector.ts, geml-parser--style-selector.ts.geml, 20, 8, 0
geml-viewer/transclude.js, geml-viewer--transclude.js.geml, 19, 1, 0
geml-parser/mcp.ts, geml-parser--mcp.ts.geml, 16, 0, 0
geml-parser/serialize.ts, geml-parser--serialize.ts.geml, 16, 1, 0
geml-parser/to-md.ts, geml-parser--to-md.ts.geml, 16, 1, 0
geml-parser/translate.ts, geml-parser--translate.ts.geml, 13, 2, 0
geml-viewer/chart.js, geml-viewer--chart.js.geml, 13, 1, 0
geml-parser/graph-style.ts, geml-parser--graph-style.ts.geml, 12, 2, 0
geml-parser/host-fs.ts, geml-parser--host-fs.ts.geml, 12, 6, 0
geml-parser/media-check.ts, geml-parser--media-check.ts.geml, 12, 5, 0
geml-parser/media-compose.ts, geml-parser--media-compose.ts.geml, 12, 5, 0
geml-parser/selector.ts, geml-parser--selector.ts.geml, 12, 9, 0
geml-viewer/layout.js, geml-viewer--layout.js.geml, 12, 3, 0
geml-parser/profiles.ts, geml-parser--profiles.ts.geml, 11, 7, 0
geml-viewer/content.js, geml-viewer--content.js.geml, 11, 1, 0
geml-parser/from-md.ts, geml-parser--from-md.ts.geml, 10, 1, 0
geml-viewer/media-player.js, geml-viewer--media-player.js.geml, 10, 0, 0
geml-viewer/inline-src.js, geml-viewer--inline-src.js.geml, 9, 3, 0
geml-parser/block-edit.ts, geml-parser--block-edit.ts.geml, 7, 1, 0
geml-parser/media-timeline.ts, geml-parser--media-timeline.ts.geml, 7, 1, 0
geml-viewer/upgrade.js, geml-viewer--upgrade.js.geml, 7, 3, 0
geml-parser/attrs.ts, geml-parser--attrs.ts.geml, 6, 5, 0
geml-parser/code-graph.ts, geml-parser--code-graph.ts.geml, 6, 1, 0
geml-parser/yaml.ts, geml-parser--yaml.ts.geml, 6, 1, 0
geml-viewer/media.js, geml-viewer--media.js.geml, 6, 0, 0
geml-viewer/style-entry.js, geml-viewer--style-entry.js.geml, 6, 2, 0
geml-viewer/components.js, geml-viewer--components.js.geml, 5, 1, 0
geml-viewer/translate-browser.js, geml-viewer--translate-browser.js.geml, 5, 1, 0
geml-parser/chart.ts, geml-parser--chart.ts.geml, 2, 1, 0
geml-parser/doc-title.ts, geml-parser--doc-title.ts.geml, 2, 2, 0
geml-parser/ijson.ts, geml-parser--ijson.ts.geml, 2, 2, 0
geml-parser/render-html.ts, geml-parser--render-html.ts.geml, 2, 1, 0
geml-viewer/page.js, geml-viewer--page.js.geml, 2, 2, 0
geml-viewer/snapshot.js, geml-viewer--snapshot.js.geml, 2, 1, 0
geml-viewer/translate-map.js, geml-viewer--translate-map.js.geml, 2, 0, 0
geml-parser/codemap-render.ts, geml-parser--codemap-render.ts.geml, 1, 1, 0
geml-parser/diagnostics.ts, geml-parser--diagnostics.ts.geml, 1, 1, 0
geml-parser/media-diagnostics.ts, geml-parser--media-diagnostics.ts.geml, 1, 1, 0
geml-parser/media-player-runtime.ts, geml-parser--media-player-runtime.ts.geml, 1, 1, 0
geml-parser/style-diagnostics.ts, geml-parser--style-diagnostics.ts.geml, 1, 1, 0
geml-viewer/bg.js, geml-viewer--bg.js.geml, 1, 0, 0
geml-viewer/offscreen.js, geml-viewer--offscreen.js.geml, 1, 0, 0
geml-viewer/render-html-stub.js, geml-viewer--render-html-stub.js.geml, 1, 0, 0
===
=== table {#module-edges format=csv}
from, to, calls
geml-parser/verbs.ts, geml-parser/geml.ts, 147
geml-parser/style-resolve.ts, geml-parser/style-diagnostics.ts, 49
geml-parser/media-check.ts, geml-parser/media-diagnostics.ts, 39
geml-parser/style-resolve.ts, geml-parser/style-selector.ts, 22
geml-parser/cli.ts, geml-parser/media-verbs.ts, 21
geml-parser/cli.ts, geml-parser/verbs.ts, 21
geml-parser/media-verbs.ts, geml-parser/media-check.ts, 20
geml-parser/verbs.ts, geml-parser/selector.ts, 17
geml-parser/geml.ts, geml-parser/diagnostics.ts, 16
geml-parser/geml.ts, geml-parser/inline.ts, 13
geml-parser/codemap-render.ts, geml-parser/render.ts, 11
geml-parser/geml.ts, geml-parser/attrs.ts, 11
geml-parser/cli.ts, geml-parser/history.ts, 10
geml-parser/cli.ts, geml-parser/host-fs.ts, 10
geml-parser/render-html.ts, geml-parser/render.ts, 10
geml-parser/cli.ts, geml-parser/geml.ts, 9
geml-parser/geml.ts, geml-parser/profiles.ts, 9
geml-parser/mcp-core.ts, geml-parser/verbs.ts, 9
geml-parser/geml.ts, geml-parser/coord.ts, 7
geml-parser/geml.ts, geml-parser/table.ts, 7
geml-parser/media-verbs.ts, geml-parser/profiles.ts, 7
geml-parser/verbs.ts, geml-parser/attrs.ts, 7
geml-parser/cli.ts, geml-parser/profiles.ts, 6
geml-parser/media-check.ts, geml-parser/media-compose.ts, 6
geml-parser/verbs.ts, geml-parser/coord.ts, 6
geml-parser/verbs.ts, geml-parser/block-edit.ts, 5
geml-viewer/transclude.js, geml-viewer/translate-browser.js, 5
geml-parser/geml.ts, geml-parser/ijson.ts, 4
geml-parser/media-check.ts, geml-parser/profiles.ts, 4
geml-parser/media-verbs.ts, geml-parser/media-compose.ts, 4
geml-parser/media-verbs.ts, geml-parser/media-timeline.ts, 4
geml-parser/verbs.ts, geml-parser/to-md.ts, 4
geml-viewer/page.js, geml-viewer/render.js, 4
geml-viewer/transclude.js, geml-viewer/render.js, 4
geml-parser/cli.ts, geml-parser/style-resolve.ts, 3
geml-parser/coord.ts, geml-parser/table.ts, 3
geml-parser/geml.ts, geml-parser/selector.ts, 3
geml-parser/host-fs.ts, geml-parser/profiles.ts, 3
geml-parser/host-fs.ts, geml-parser/verbs.ts, 3
geml-parser/mcp-core.ts, geml-parser/geml.ts, 3
geml-viewer/components.js, geml-viewer/layout.js, 3
geml-viewer/content.js, geml-viewer/inline-src.js, 3
geml-viewer/content.js, geml-viewer/upgrade.js, 3
geml-viewer/transclude.js, geml-viewer/inline-src.js, 3
geml-parser/block-edit.ts, geml-parser/attrs.ts, 2
geml-parser/cli.ts, geml-parser/media-check.ts, 2
geml-parser/code-graph.ts, geml-parser/geml.ts, 2
geml-parser/code-graph.ts, geml-parser/graph-style.ts, 2
geml-parser/inline.ts, geml-parser/attrs.ts, 2
geml-parser/mcp.ts, geml-parser/history.ts, 2
geml-parser/mcp.ts, geml-parser/host-fs.ts, 2
geml-parser/mcp.ts, geml-parser/verbs.ts, 2
geml-parser/media-check.ts, geml-parser/geml.ts, 2
geml-parser/media-verbs.ts, geml-parser/geml.ts, 2
geml-parser/render.ts, geml-parser/doc-title.ts, 2
geml-parser/render.ts, geml-parser/geml.ts, 2
geml-parser/render.ts, geml-parser/inline.ts, 2
geml-parser/render.ts, geml-parser/translate.ts, 2
geml-parser/selector.ts, geml-parser/attrs.ts, 2
geml-parser/serialize.ts, geml-parser/inline.ts, 2
geml-parser/style-selector.ts, geml-parser/geml.ts, 2
geml-parser/to-md.ts, geml-parser/doc-title.ts, 2
geml-parser/verbs.ts, geml-parser/from-md.ts, 2
geml-parser/verbs.ts, geml-parser/inline.ts, 2
geml-viewer/content.js, geml-viewer/page.js, 2
geml-viewer/content.js, geml-viewer/render.js, 2
geml-viewer/page.js, geml-viewer/style-entry.js, 2
geml-parser/cli.ts, geml-parser/attrs.ts, 1
geml-parser/cli.ts, geml-parser/selector.ts, 1
geml-parser/codemap-render.ts, geml-parser/code-graph.ts, 1
geml-parser/coord.ts, geml-parser/edn.ts, 1
geml-parser/geml.ts, geml-parser/chart.ts, 1
geml-parser/geml.ts, geml-parser/edn.ts, 1
geml-parser/geml.ts, geml-parser/yaml.ts, 1
geml-parser/graph-style.ts, geml-parser/geml.ts, 1
geml-parser/host-fs.ts, geml-parser/geml.ts, 1
geml-parser/mcp.ts, geml-parser/geml.ts, 1
geml-parser/mcp.ts, geml-parser/mcp-core.ts, 1
geml-parser/media-timeline.ts, geml-parser/geml.ts, 1
geml-parser/media-verbs.ts, geml-parser/media-player-runtime.ts, 1
geml-parser/style-resolve.ts, geml-parser/geml.ts, 1
geml-parser/style-selector.ts, geml-parser/style-diagnostics.ts, 1
geml-parser/table.ts, geml-parser/attrs.ts, 1
geml-parser/table.ts, geml-parser/inline.ts, 1
geml-parser/verbs.ts, geml-parser/codemap-render.ts, 1
geml-parser/verbs.ts, geml-parser/render-html.ts, 1
geml-parser/verbs.ts, geml-parser/serialize.ts, 1
geml-parser/verbs.ts, geml-parser/translate.ts, 1
geml-viewer/content.js, geml-viewer/snapshot.js, 1
geml-viewer/content.js, geml-viewer/transclude.js, 1
geml-viewer/page.js, geml-viewer/components.js, 1
geml-viewer/page.js, geml-viewer/layout.js, 1
geml-viewer/render.js, geml-viewer/chart.js, 1
====== meta
profile = "geml-codemap/v1"
module = geml-parser/attrs.ts
src = geml-parser/src/attrs.ts
entry = #oddNames #duplicateNames #coerce #tokenize #parseAttrs
resolution-default = cpg
===
# geml-parser/attrs.ts
=== code {#oddNames src=geml-parser/src/attrs.ts#L30-39 anchor="scip-typescript npm @geml/geml 1.12.0 src/`attrs.ts`/oddNames()."}
===
=== code {#duplicateNames src=geml-parser/src/attrs.ts#L60-70 anchor="scip-typescript npm @geml/geml 1.12.0 src/`attrs.ts`/duplicateNames()."}
===
=== code {#unescapeQuoted .leaf src=geml-parser/src/attrs.ts#L77-85 anchor="scip-typescript npm @geml/geml 1.12.0 src/`attrs.ts`/unescapeQuoted()."}
===
=== code {#coerce src=geml-parser/src/attrs.ts#L87-97 anchor="scip-typescript npm @geml/geml 1.12.0 src/`attrs.ts`/coerce()."}
===
=== code {#tokenize src=geml-parser/src/attrs.ts#L103-123 anchor="scip-typescript npm @geml/geml 1.12.0 src/`attrs.ts`/tokenize()."}
===
=== code {#parseAttrs src=geml-parser/src/attrs.ts#L126-151 anchor="scip-typescript npm @geml/geml 1.12.0 src/`attrs.ts`/parseAttrs()."}
===
=== table {#calls format=csv}
from, to, kind, confidence
#coerce, #unescapeQuoted, call,
#parseAttrs, #coerce, call,
#parseAttrs, #tokenize, call,
===
=== table {#called-by format=csv}
from, to, kind, site
geml-parser--geml.ts.geml#reportOddNames, #oddNames, call, geml-parser/src/geml.ts:395
geml-parser--geml.ts.geml#reportDuplicateNames, #duplicateNames, call, geml-parser/src/geml.ts:382
#coerce, #unescapeQuoted, call, geml-parser/src/attrs.ts:90
#parseAttrs, #coerce, call, geml-parser/src/attrs.ts:143
geml-parser--geml.ts.geml#parseData, #coerce, call, geml-parser/src/geml.ts:1695
geml-parser--table.ts.geml#parseTable, #coerce, call, geml-parser/src/table.ts:408
#parseAttrs, #tokenize, call, geml-parser/src/attrs.ts:134
geml-parser--selector.ts.geml#keyForm, #tokenize, call, geml-parser/src/selector.ts:226
geml-parser--block-edit.ts.geml#rewriteBraces, #parseAttrs, call, geml-parser/src/block-edit.ts:52
geml-parser--block-edit.ts.geml#normalizeBlockId, #parseAttrs, call, geml-parser/src/block-edit.ts:113
geml-parser--cli.ts.geml#runGet, #parseAttrs, call, geml-parser/src/cli.ts:1322
geml-parser--geml.ts.geml#readFencedBlock, #parseAttrs, call, geml-parser/src/geml.ts:1325
geml-parser--geml.ts.geml#scanBlocks, #parseAttrs, call, geml-parser/src/geml.ts:1552
geml-parser--geml.ts.geml#scanBlocks, #parseAttrs, call, geml-parser/src/geml.ts:1567
geml-parser--geml.ts.geml#idOfHeading, #parseAttrs, call, geml-parser/src/geml.ts:3094
geml-parser--geml.ts.geml#fenceClose, #parseAttrs, call, geml-parser/src/geml.ts:3135
geml-parser--geml.ts.geml#collectSpans, #parseAttrs, call, geml-parser/src/geml.ts:3214
geml-parser--geml.ts.geml#collectSpans, #parseAttrs, call, geml-parser/src/geml.ts:3240
geml-parser--geml.ts.geml#closeFenceLine, #parseAttrs, call, geml-parser/src/geml.ts:3608
geml-parser--inline.ts.geml#readAttrs, #parseAttrs, call, geml-parser/src/inline.ts:219
geml-parser--inline.ts.geml#readAttrs, #parseAttrs, call, geml-parser/src/inline.ts:223
geml-parser--selector.ts.geml#keyForm, #parseAttrs, call, geml-parser/src/selector.ts:249
geml-parser--verbs.ts.geml#embedSrcOf, #parseAttrs, call, geml-parser/src/verbs.ts:231
geml-parser--verbs.ts.geml#selectUnits, #parseAttrs, call, geml-parser/src/verbs.ts:454
geml-parser--verbs.ts.geml#get, #parseAttrs, call, geml-parser/src/verbs.ts:613
geml-parser--verbs.ts.geml#resolveSetTarget, #parseAttrs, call, geml-parser/src/verbs.ts:1161
geml-parser--verbs.ts.geml#declaresId, #parseAttrs, call, geml-parser/src/verbs.ts:1249
geml-parser--verbs.ts.geml#set, #parseAttrs, call, geml-parser/src/verbs.ts:1334
geml-parser--verbs.ts.geml#bodyRange, #parseAttrs, call, geml-parser/src/verbs.ts:1837
===
=== table {#unresolved format=csv hidden}
from, to
#oddNames, Array.push
#oddNames, ObjectConstructor.entries
#oddNames, RegExp.test
#duplicateNames, Array.filter
#duplicateNames, ObjectConstructor.keys
#duplicateNames, Set.has
#coerce, RegExp.test
#coerce, String.endsWith
#coerce, String.slice
#coerce, String.startsWith
#coerce, String.trim
#coerce, parseFloat
#coerce, parseInt
#tokenize, Array.push
#tokenize, RegExp.test
#parseAttrs, Array.filter
#parseAttrs, Array.map
#parseAttrs, Array.push
#parseAttrs, Map.get
#parseAttrs, Map.set
#parseAttrs, String.indexOf
#parseAttrs, String.replace
#parseAttrs, String.slice
#parseAttrs, String.startsWith
#parseAttrs, String.trim
===All of them: public/playground/codemap/.