From e120215970b07639f4d94bbae8e8ad2ae802e98a Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 26 Aug 2026 17:57:11 -0400 Subject: [PATCH 1/8] docs(design): spec the native v2 model rewrite (#96) --- docs/design/specs/native-v2-model.md | 174 +++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 docs/design/specs/native-v2-model.md diff --git a/docs/design/specs/native-v2-model.md b/docs/design/specs/native-v2-model.md new file mode 100644 index 0000000..2f89238 --- /dev/null +++ b/docs/design/specs/native-v2-model.md @@ -0,0 +1,174 @@ +# Native v2 model — retire the v1 compute model and the emit-time transform + +- **Status:** accepted, not yet implemented +- **Scope:** `codeanalyzer-typescript` only — no wire change, no SDK change, no sibling change +- **Schema version:** 2.1.0, unchanged. This is an internal rewrite; `analysis.json` and the + Neo4j projection stay semantically identical at every level. +- **Analyzer version:** 1.0.0 → 1.1.0 (one MINOR at completion) +- **Parity precedent:** codeanalyzer-python, whose staged v2 chain made its schema models the + native compute model (`codeanalyzer/schema/py_schema.py`) with small per-run passes + (`assign_ids.py`, `l1_body.py`, `l2_callees.py`, `call_graph_ids.py`) and strip-at-emit for + internal fields (python d0084cb). + +## Problem + +The analyzer carries **two model families for one output**. Stages build the v1 +`TSApplication` (`src/schema/schema.ts`, 445 lines, plus `graphs.ts`), and every emit reshapes +the whole tree into `V2Application` through a ~720-line transform (`src/schema/v2/emit.ts` 436 + +`src/schema/v2/dataflow.ts` 282). The transform re-buckets containers (`classes`/`interfaces`/ +`enums`/`type_aliases`/`namespaces` → `types{}`; `methods`/`inner_callables` → `callables{}`; +`attributes`/`properties`/`members`/`variables` → `fields{}`), assigns `can://` ids +(`idFromSig`, emit.ts:97), converts `call_sites[]` to `body{}` call nodes (`toBody`, +emit.ts:139), filters attributes through a 30-key `DROP` set plus recursive null-pruning +(`carry`/`pruneNulls`, emit.ts:38–95), resolves heritage, homes external/synthesized endpoints, +and rewrites edge keys. + +The cost is structural: **every schema feature lands twice** — once in the v1 model and builders, +once in the transform — and the `DROP`/`carry` indirection means the wire shape of any node is +defined nowhere; it is the residue of a filter. The migration playbook that produced this +architecture calls the wrap-don't-rewrite emitter "the compat shim the migration leans on *while +both schemas coexist*". Coexistence ended when the v1 wire was removed (`toV2` is unconditional +in `src/utils/serialize.ts`); python has since retired its shim. This spec retires ours. + +## Decisions + +| Decision | Choice | +| --- | --- | +| Architecture | **One model family + small per-run passes** (python parity), not inline-everything | +| Wire gate | **Deep-equal goldens** captured from pre-rewrite `main`, both fixtures, `-a 1..4` + `graph.cypher`; key order free, arrays order-sensitive | +| Tracking | **One issue, one PR**; stages are commits, each green on the goldens | +| Release | **1.1.0 at completion**; stages merge nothing individually; no SDK lockstep | +| Terminal naming | `V2*` → `TS*` at teardown; `src/schema/v2/model.ts` folds into `src/schema/schema.ts` | +| Goldens lifetime | Transition-scoped — harness and goldens deleted at teardown | +| L3/L4 tree-attach | Moves to `src/dataflow/attach.ts` (python parity: its dataflow emits onto the tree, python 5600542) | + +**Why ids are a pass, not build-time.** Durable ids embed the app name +(`can://typescript//…`), and `--app-name` is per-invocation (`src/options/options.ts:15`), +while the symbol table round-trips through the analysis cache across runs +(`src/utils/cache.ts`). A tree with baked ids would go stale the moment the app name changes; +a tree without ids is cacheable forever. Python hit the same constraint — `assign_ids.py` stamps +ids fresh every run and returns the `signature → id` map the later passes join on. + +**The join key stays the signature.** `signatureOf` (`src/schema/signatures.ts`) remains the one +canonicalizer; builders, call-graph providers, the cache, and the dataflow compute all keep +speaking signature strings. `can://` ids exist only downstream of the assign-ids pass, exactly +as in python. + +## Target architecture + +### The model (`src/schema/schema.ts`, terminal state) + +The v2 shapes currently in `src/schema/v2/model.ts` become the model the stages build: + +- **Containers** (`TSModule`, `TSType`, `TSCallable`, `TSField` — today `V2Module` etc.) are + v2-bucketed (`types{}`/`functions{}`/`fields{}`/`callables{}`/`body{}`), carry `id` (stamped + per-run), `kind`, `span` only — the flat `start_line`/`end_line`/`start_column`/`end_column` + quartet disappears from container types (it is `DROP`ped from the wire today). +- **Leaf models** (`TSImport`, `TSExport`, `TSComment`, `TSCallableParameter`, `TSDecorator`, + `TSTypeParameter`, enum members, …) keep their current wire shapes, flat ints included — but + nullable fields become **optional**: the wire's "present or absent, never null" convention + (today enforced by `pruneNulls`) becomes the model's own convention, and builders omit instead + of writing `null`. The one sanctioned `null` stays: a `call` body node's `callee` at L1. +- **Internal fields** ride the model but never the wire, python-style (strip at emit, not a + field-by-field copy): `call_sites[]` and `callee_signature` (cache round-trip + the l1/l2 + passes; see python's l2_callees.py docstring for why the linker's resolutions are never + persisted), `module_name` (signature prefix), `path`/`file_path`, and the cache trio + `content_hash`/`last_modified`/`file_size`. + +### The spine (`src/core.ts`, terminal order) + +``` +materialize → buildSymbolTable (v2 buckets, no ids) + → assignIds(app, appName) # stamps can:// ids; returns sigToId + collisions + → populateL1Body # call_sites[] → body{} call nodes, callee: null + → resolveHeritage # extends_ids / implements_ids (TS-specific pass) + → [L2] provider.build per program # unchanged, signature-keyed + → [L2] homeEndpoints # externals + synthesized (2.1.0 compat index) → sigToId + → [L2] backfillCallees + reidentifyCallGraph # callee null→id; edge sig→id, source/target→src/dst + → [L3/4] buildProgramGraphs → attach # attach writes body/cfg/cdg/ddg/summary/param_* onto the tree + → envelope # schema_version / language / max_level / k_limit / analyzer + → saveCache (tree without ids, with internal fields) +``` + +`analyze()` returns the enveloped application. `src/utils/serialize.ts` shrinks to: JSON path = +strip internal fields + write; Neo4j path = `project(application)` directly — the projection +(`src/build/neo4j`) already consumes the v2 tree and does not change. + +### Module layout (terminal) + +| Path | Responsibility | +| --- | --- | +| `src/schema/schema.ts` | **The** model (v2 shapes, `TS*` names) + envelope types | +| `src/schema/ids.ts` | `can://` construction + `idFromSig`/`memberKey` (moved from emit.ts) | +| `src/schema/assignIds.ts` | id stamping pass → `sigToId`, collision gate | +| `src/schema/l1Body.ts` | `call_sites[]` → `body{}` call nodes | +| `src/schema/l2Callees.ts` | callee `null→id` + call-graph re-identification, dangling gate | +| `src/schema/homing.ts` | externals + synthesized-callable compat index (from emit.ts:298–360) | +| `src/schema/heritage.ts` | `extends_ids`/`implements_ids` resolution | +| `src/schema/signatures.ts` | unchanged | +| `src/schema/graphs.ts` | unchanged — the dataflow **compute IR**, no longer serialized on the app | +| `src/dataflow/attach.ts` | `applyDataflow` re-homed: program-graph IR → tree | +| *(deleted)* | `src/schema/v2/emit.ts`, `src/schema/v2/dataflow.ts`, `src/schema/v2/model.ts`, v1 container types, `DROP`/`carry`/`pruneNulls` | + +(Exact pass-file granularity may collapse siblings into one file at implementation time; the +pass *boundaries* above are the contract.) + +## Wire-stability gate + +Before any model change, capture goldens from `main`: `analysis.json` at `-a 1|2|3|4` and +`graph.cypher`, for `test/fixtures/sample-app` and `test/fixtures/dataflow-app`, committed under +`test/goldens/`. A transition test then asserts on every commit of the branch: + +- `analysis.json`: **deep-equal** after parsing — object key order free (JSON objects are + unordered; the SDK parses, never diffs bytes), arrays order-sensitive. If an array's order + proves nondeterministic, the comparator sorts that one list and says so in a comment. +- `graph.cypher`: compared as **sorted line sets** (row emission order follows object iteration + order, which the re-bucketing legitimately changes; the graph is the set of rows). +- `analyzer.version` is excluded from comparison. + +The existing standing gates — schema conformance, `L1 ⊆ L2 ⊆ L3 ⊆ L4` monotonicity +(`test/schema-v2.test.ts`), Neo4j conformance — run unchanged throughout and remain after the +goldens are deleted at teardown. + +## Stages (commits within the one PR; each green on goldens + full suite) + +1. **Stage 0 — harness.** Goldens captured from the branch base + the deep-equal test. +2. **Stage 1 — L1 native.** Containers in `schema.ts` become v2-bucketed and span-only; + `builders.ts`/`symbolTable.ts` fill them; leaf nullables go optional; `assignIds`, `l1Body`, + `heritage` passes; every symbol-table reader (semantic_analysis, dataflow/extract, cache) + moves to the new buckets; `emit.ts` loses its tree walk and shrinks to L2 homing + dataflow + + envelope. The largest stage — it retires `carry`/`DROP` for containers. +3. **Stage 2 — L2 native.** Homing/backfill/re-identification become core-spine passes; + `emit.ts` loses its L2 block. Collision and dangling gates surface from the passes (today + `ToV2Result.collisions`/`dangling`; tests re-point). +4. **Stage 3 — L3/L4 native.** `src/schema/v2/dataflow.ts` → `src/dataflow/attach.ts`; + `program_graphs` leaves the application model (stays the internal return of + `buildProgramGraphs`); envelope moves to core; `emit.ts` is deleted. +5. **Stage 4 — teardown.** Delete v1 types and `src/schema/v2/`; rename `V2*` → `TS*`; delete + goldens + harness; update `CLAUDE.md`/`README`/`.claude/SCHEMA_DECISIONS.md`; CHANGELOG under + *Changed* (internal, no wire impact); bump 1.1.0. + +## What does not change + +- The wire: `analysis.json` all levels, `graph.cypher`, `schema.neo4j.json`, schema_version 2.1.0. +- `signatureOf` and signature strings as the internal join currency. +- Call-graph providers' interface (signature-keyed edges + externals + synthesized), the union + merge, and Jelly. +- The dataflow compute (`src/dataflow/*` stages 1–7, `graphs.ts` IR, worker pool). +- The Neo4j projection (`src/build/neo4j`) — it already consumes the v2 tree. +- The SDK: no model change, no version lockstep, no release ordering constraint. + +## Caveats and risks + +- **Cache compatibility:** old caches store v1 shapes; the existing `analyzer_version` + invalidation (`cache.ts`, loadCache) drops them wholesale on first post-rewrite run. No + migration code — by design. +- **Stage 1 blast radius:** semantic_analysis (950 lines) and dataflow (2,527 lines) read + symbol-table containers; how much of each actually touches the re-bucketed fields is + discovered in Stage 1, not before. The goldens bound the risk: any misread shows up as a + fixture diff, not a silent drift. +- **L3 worker boundary:** `src/dataflow/worker.ts` builds its own Project per file; if workers + consume serialized v1 module shapes across the process boundary, that surface migrates in + Stage 1 with the other readers. +- **Deep-equal is weaker than byte-equal** on object key order by construction; that is the + accepted trade (no consumer is order-sensitive), recorded here so nobody "fixes" it later. From 2ee84dc816fb8a5c2ba1888924969704c94186ed Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 26 Aug 2026 18:04:40 -0400 Subject: [PATCH 2/8] test(goldens): pin the pre-rewrite wire for the native-model transition (#96) Deep-equal analysis.json goldens at -a 1..4 plus sorted-line cypher goldens for sample-app, dataflow-app, and anon-app, captured with the default union provider. Transition-scoped: deleted at Stage 4 teardown. --- test/goldens/anon-app-a1.json | 1 + test/goldens/anon-app-a2.json | 1 + test/goldens/anon-app-a3.json | 1 + test/goldens/anon-app-a4.json | 1 + test/goldens/anon-app.cypher | 269 +++++ test/goldens/dataflow-app-a1.json | 1 + test/goldens/dataflow-app-a2.json | 1 + test/goldens/dataflow-app-a3.json | 1 + test/goldens/dataflow-app-a4.json | 1 + test/goldens/dataflow-app.cypher | 1303 +++++++++++++++++++++++ test/goldens/sample-app-a1.json | 1 + test/goldens/sample-app-a2.json | 1 + test/goldens/sample-app-a3.json | 1 + test/goldens/sample-app-a4.json | 1 + test/goldens/sample-app.cypher | 1532 +++++++++++++++++++++++++++ test/native-rewrite-goldens.test.ts | 101 ++ 16 files changed, 3217 insertions(+) create mode 100644 test/goldens/anon-app-a1.json create mode 100644 test/goldens/anon-app-a2.json create mode 100644 test/goldens/anon-app-a3.json create mode 100644 test/goldens/anon-app-a4.json create mode 100644 test/goldens/anon-app.cypher create mode 100644 test/goldens/dataflow-app-a1.json create mode 100644 test/goldens/dataflow-app-a2.json create mode 100644 test/goldens/dataflow-app-a3.json create mode 100644 test/goldens/dataflow-app-a4.json create mode 100644 test/goldens/dataflow-app.cypher create mode 100644 test/goldens/sample-app-a1.json create mode 100644 test/goldens/sample-app-a2.json create mode 100644 test/goldens/sample-app-a3.json create mode 100644 test/goldens/sample-app-a4.json create mode 100644 test/goldens/sample-app.cypher create mode 100644 test/native-rewrite-goldens.test.ts diff --git a/test/goldens/anon-app-a1.json b/test/goldens/anon-app-a1.json new file mode 100644 index 0000000..74173e6 --- /dev/null +++ b/test/goldens/anon-app-a1.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/anon-app","kind":"application","symbol_table":{"src/routes.ts":{"source":"export function login() {\n return (req: any, res: any) => {\n const email = req.body.email;\n query(`SELECT * FROM Users WHERE email = '${email}'`);\n };\n}\n\nexport function query(sql: string) {\n return sql;\n}\n\nconst app: any = {};\napp.get(\"/health\", (req: any, res: any) => {\n res.send(req.query.probe);\n});\n\nconst named = () => 1;\n\nexport function outer() {\n return () => () => named();\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/anon-app/src/routes.ts","kind":"module","span":{"start":[1,1],"end":[22,1],"bytes":[0,398]},"types":{},"functions":{"login":{"name":"login","signature":"src/routes.login","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"(req: any, res: any) => void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.login.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":11,"end_column":19},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":21,"end_column":29}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login/","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]},"body":{"4:5":{"method_name":"query","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,5],"end":[4,58],"bytes":[99,152]},"callee":null}}}}},"query":{"name":"query","signature":"src/routes.query","comments":[],"decorators":[],"parameters":[{"name":"sql","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":23,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/query","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]},"body":{}},"outer":{"name":"outer","signature":"src/routes.outer","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => () => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer/","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer..","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer//","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]},"body":{}}}}}},"named":{"name":"named","signature":"src/routes.named","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/named","span":{"start":[17,7],"end":[17,22],"bytes":[322,337]},"body":{}},"":{"name":"(anonymous)","signature":"src/routes.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":21,"end_column":29},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":31,"end_column":39}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]},"body":{"14:3":{"method_name":"send","receiver_expr":"res","receiver_type":"any","argument_types":["any"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,28],"bytes":[284,309]},"callee":null}}}},"fields":{"app":{"name":"app","type":"any","initializer":"{}","scope":"module","declaration_kind":"const","is_readonly":true,"is_exported":false,"id":"can://typescript/anon-app/src/routes.ts/app","kind":"field","span":{"start":[12,7],"end":[12,20],"bytes":[222,235]}}}}},"call_graph":[],"param_in":[],"param_out":[]}} \ No newline at end of file diff --git a/test/goldens/anon-app-a2.json b/test/goldens/anon-app-a2.json new file mode 100644 index 0000000..c31d8da --- /dev/null +++ b/test/goldens/anon-app-a2.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/anon-app","kind":"application","symbol_table":{"src/routes.ts":{"source":"export function login() {\n return (req: any, res: any) => {\n const email = req.body.email;\n query(`SELECT * FROM Users WHERE email = '${email}'`);\n };\n}\n\nexport function query(sql: string) {\n return sql;\n}\n\nconst app: any = {};\napp.get(\"/health\", (req: any, res: any) => {\n res.send(req.query.probe);\n});\n\nconst named = () => 1;\n\nexport function outer() {\n return () => () => named();\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/anon-app/src/routes.ts","kind":"module","span":{"start":[1,1],"end":[22,1],"bytes":[0,398]},"types":{},"functions":{"login":{"name":"login","signature":"src/routes.login","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"(req: any, res: any) => void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.login.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":11,"end_column":19},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":21,"end_column":29}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login/","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]},"body":{"4:5":{"method_name":"query","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,5],"end":[4,58],"bytes":[99,152]},"callee":"can://typescript/anon-app/src/routes.ts/query"}}}}},"query":{"name":"query","signature":"src/routes.query","comments":[],"decorators":[],"parameters":[{"name":"sql","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":23,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/query","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]},"body":{}},"outer":{"name":"outer","signature":"src/routes.outer","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => () => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer/","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer..","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer//","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]},"body":{}}}}}},"named":{"name":"named","signature":"src/routes.named","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/named","span":{"start":[17,7],"end":[17,22],"bytes":[322,337]},"body":{}},"":{"name":"(anonymous)","signature":"src/routes.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":21,"end_column":29},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":31,"end_column":39}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]},"body":{"14:3":{"method_name":"send","receiver_expr":"res","receiver_type":"any","argument_types":["any"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,28],"bytes":[284,309]},"callee":null}}}},"fields":{"app":{"name":"app","type":"any","initializer":"{}","scope":"module","declaration_kind":"const","is_readonly":true,"is_exported":false,"id":"can://typescript/anon-app/src/routes.ts/app","kind":"field","span":{"start":[12,7],"end":[12,20],"bytes":[222,235]}}}}},"call_graph":[{"src":"can://typescript/anon-app/src/routes.ts/login/","dst":"can://typescript/anon-app/src/routes.ts/query","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/anon-app/src/routes.ts/outer//","dst":"can://typescript/anon-app/src/routes.ts/named","prov":["jelly"],"weight":1}],"param_in":[],"param_out":[],"external_symbols":{},"synthesized_callables":{"can://typescript/anon-app/src/routes.ts/login@2:10":{"id":"can://typescript/anon-app/src/routes.ts/login/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:10":{"id":"can://typescript/anon-app/src/routes.ts/outer/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:16":{"id":"can://typescript/anon-app/src/routes.ts/outer//","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/anon-app-a3.json b/test/goldens/anon-app-a3.json new file mode 100644 index 0000000..1e45135 --- /dev/null +++ b/test/goldens/anon-app-a3.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/anon-app","kind":"application","symbol_table":{"src/routes.ts":{"source":"export function login() {\n return (req: any, res: any) => {\n const email = req.body.email;\n query(`SELECT * FROM Users WHERE email = '${email}'`);\n };\n}\n\nexport function query(sql: string) {\n return sql;\n}\n\nconst app: any = {};\napp.get(\"/health\", (req: any, res: any) => {\n res.send(req.query.probe);\n});\n\nconst named = () => 1;\n\nexport function outer() {\n return () => () => named();\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/anon-app/src/routes.ts","kind":"module","span":{"start":[1,1],"end":[22,1],"bytes":[0,398]},"types":{},"functions":{"login":{"name":"login","signature":"src/routes.login","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"(req: any, res: any) => void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]},"body":{"@entry":{"kind":"entry","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]}},"2:3":{"kind":"statement","span":{"start":[2,3],"end":[5,5],"bytes":[28,158]}},"@exit":{"kind":"exit","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]}}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.login.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":11,"end_column":19},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":21,"end_column":29}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login/","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]},"body":{"4:5":{"method_name":"query","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,5],"end":[4,58],"bytes":[99,152]},"callee":"can://typescript/anon-app/src/routes.ts/query"},"@entry":{"kind":"entry","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]}},"3:5":{"kind":"statement","span":{"start":[3,5],"end":[3,34],"bytes":[65,94]}},"@exit":{"kind":"exit","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]}}},"cfg":[{"src":"@entry","dst":"3:5","kind":"fallthrough"},{"src":"3:5","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"3:5"},{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"3:5","var":"req.body.email","prov":["reaching-defs"]},{"src":"3:5","dst":"4:5","var":"email","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"2:3","kind":"fallthrough"},{"src":"2:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"2:3"}],"ddg":[]},"query":{"name":"query","signature":"src/routes.query","comments":[],"decorators":[],"parameters":[{"name":"sql","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":23,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/query","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]},"body":{"@entry":{"kind":"entry","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,14],"bytes":[201,212]}},"@exit":{"kind":"exit","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]}}},"cfg":[{"src":"@entry","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"9:3","var":"sql","prov":["reaching-defs"]}]},"outer":{"name":"outer","signature":"src/routes.outer","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => () => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]},"body":{"@entry":{"kind":"entry","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]}},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,30],"bytes":[368,395]}},"@exit":{"kind":"exit","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]}}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer/","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]},"body":{"@entry":{"kind":"entry","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]}},"20:16":{"kind":"statement","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"@exit":{"kind":"exit","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]}}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer..","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer//","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]},"body":{"@entry":{"kind":"entry","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"20:22":{"kind":"statement","span":{"start":[20,22],"end":[20,29],"bytes":[387,394]}},"@exit":{"kind":"exit","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}}},"cfg":[{"src":"@entry","dst":"20:22","kind":"fallthrough"},{"src":"20:22","dst":"@exit","kind":"exception"},{"src":"20:22","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:22"}],"ddg":[{"src":"@entry","dst":"20:22","var":"src/routes.named","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"20:16","kind":"fallthrough"},{"src":"20:16","dst":"@exit","kind":"exception"},{"src":"20:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:16"}],"ddg":[{"src":"@entry","dst":"20:16","var":"src/routes.named","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:3"}],"ddg":[{"src":"@entry","dst":"20:3","var":"src/routes.named","prov":["reaching-defs"]}]},"named":{"name":"named","signature":"src/routes.named","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/named","span":{"start":[17,7],"end":[17,22],"bytes":[322,337]},"body":{"@entry":{"kind":"entry","span":{"start":[17,15],"end":[17,22],"bytes":[330,337]}},"17:21":{"kind":"statement","span":{"start":[17,21],"end":[17,22],"bytes":[336,337]}},"@exit":{"kind":"exit","span":{"start":[17,15],"end":[17,22],"bytes":[330,337]}}},"cfg":[{"src":"@entry","dst":"17:21","kind":"fallthrough"},{"src":"17:21","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:21"}],"ddg":[]},"":{"name":"(anonymous)","signature":"src/routes.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":21,"end_column":29},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":31,"end_column":39}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]},"body":{"14:3":{"method_name":"send","receiver_expr":"res","receiver_type":"any","argument_types":["any"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,28],"bytes":[284,309]},"callee":null},"@entry":{"kind":"entry","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]}},"@exit":{"kind":"exit","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]}}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"14:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"req.query.probe","prov":["reaching-defs"]},{"src":"@entry","dst":"14:3","var":"res.send","prov":["reaching-defs"]}]}},"fields":{"app":{"name":"app","type":"any","initializer":"{}","scope":"module","declaration_kind":"const","is_readonly":true,"is_exported":false,"id":"can://typescript/anon-app/src/routes.ts/app","kind":"field","span":{"start":[12,7],"end":[12,20],"bytes":[222,235]}}}}},"call_graph":[{"src":"can://typescript/anon-app/src/routes.ts/login/","dst":"can://typescript/anon-app/src/routes.ts/query","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/anon-app/src/routes.ts/outer//","dst":"can://typescript/anon-app/src/routes.ts/named","prov":["jelly"],"weight":1}],"param_in":[],"param_out":[],"external_symbols":{},"synthesized_callables":{"can://typescript/anon-app/src/routes.ts/login@2:10":{"id":"can://typescript/anon-app/src/routes.ts/login/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:10":{"id":"can://typescript/anon-app/src/routes.ts/outer/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:16":{"id":"can://typescript/anon-app/src/routes.ts/outer//","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/anon-app-a4.json b/test/goldens/anon-app-a4.json new file mode 100644 index 0000000..095e5ec --- /dev/null +++ b/test/goldens/anon-app-a4.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/anon-app","kind":"application","symbol_table":{"src/routes.ts":{"source":"export function login() {\n return (req: any, res: any) => {\n const email = req.body.email;\n query(`SELECT * FROM Users WHERE email = '${email}'`);\n };\n}\n\nexport function query(sql: string) {\n return sql;\n}\n\nconst app: any = {};\napp.get(\"/health\", (req: any, res: any) => {\n res.send(req.query.probe);\n});\n\nconst named = () => 1;\n\nexport function outer() {\n return () => () => named();\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/anon-app/src/routes.ts","kind":"module","span":{"start":[1,1],"end":[22,1],"bytes":[0,398]},"types":{},"functions":{"login":{"name":"login","signature":"src/routes.login","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"(req: any, res: any) => void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]},"body":{"@entry":{"kind":"entry","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]}},"2:3":{"kind":"statement","span":{"start":[2,3],"end":[5,5],"bytes":[28,158]}},"@exit":{"kind":"exit","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.login.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":11,"end_column":19},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":21,"end_column":29}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login/","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]},"body":{"4:5":{"method_name":"query","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,5],"end":[4,58],"bytes":[99,152]},"callee":"can://typescript/anon-app/src/routes.ts/query"},"@entry":{"kind":"entry","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]}},"3:5":{"kind":"statement","span":{"start":[3,5],"end":[3,34],"bytes":[65,94]}},"@exit":{"kind":"exit","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]}},"@formal_in:0":{"kind":"formal_in","of":"req"},"@formal_in:1":{"kind":"formal_in","of":"res"},"@formal_out":{"kind":"formal_out","of":"$ret"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5"}},"cfg":[{"src":"@entry","dst":"3:5","kind":"fallthrough"},{"src":"3:5","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"3:5"},{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"3:5","var":"req.body.email","prov":["reaching-defs"]},{"src":"3:5","dst":"4:5","var":"email","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]}},"cfg":[{"src":"@entry","dst":"2:3","kind":"fallthrough"},{"src":"2:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"2:3"}],"ddg":[{"src":"2:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"query":{"name":"query","signature":"src/routes.query","comments":[],"decorators":[],"parameters":[{"name":"sql","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":23,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/query","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]},"body":{"@entry":{"kind":"entry","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,14],"bytes":[201,212]}},"@exit":{"kind":"exit","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]}},"@formal_in:0":{"kind":"formal_in","of":"sql"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"9:3","var":"sql","prov":["reaching-defs"]},{"src":"9:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"outer":{"name":"outer","signature":"src/routes.outer","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => () => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]},"body":{"@entry":{"kind":"entry","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]}},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,30],"bytes":[368,395]}},"@exit":{"kind":"exit","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer/","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]},"body":{"@entry":{"kind":"entry","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]}},"20:16":{"kind":"statement","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"@exit":{"kind":"exit","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer..","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer//","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]},"body":{"@entry":{"kind":"entry","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"20:22":{"kind":"statement","span":{"start":[20,22],"end":[20,29],"bytes":[387,394]}},"@exit":{"kind":"exit","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"20:22","kind":"fallthrough"},{"src":"20:22","dst":"@exit","kind":"exception"},{"src":"20:22","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:22"}],"ddg":[{"src":"@entry","dst":"20:22","var":"src/routes.named","prov":["reaching-defs"]},{"src":"20:22","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"20:16","kind":"fallthrough"},{"src":"20:16","dst":"@exit","kind":"exception"},{"src":"20:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:16"}],"ddg":[{"src":"@entry","dst":"20:16","var":"src/routes.named","prov":["reaching-defs"]},{"src":"20:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:3"}],"ddg":[{"src":"@entry","dst":"20:3","var":"src/routes.named","prov":["reaching-defs"]},{"src":"20:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"named":{"name":"named","signature":"src/routes.named","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/named","span":{"start":[17,7],"end":[17,22],"bytes":[322,337]},"body":{"@entry":{"kind":"entry","span":{"start":[17,15],"end":[17,22],"bytes":[330,337]}},"17:21":{"kind":"statement","span":{"start":[17,21],"end":[17,22],"bytes":[336,337]}},"@exit":{"kind":"exit","span":{"start":[17,15],"end":[17,22],"bytes":[330,337]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"17:21","kind":"fallthrough"},{"src":"17:21","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:21"}],"ddg":[{"src":"17:21","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"":{"name":"(anonymous)","signature":"src/routes.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":21,"end_column":29},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":31,"end_column":39}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]},"body":{"14:3":{"method_name":"send","receiver_expr":"res","receiver_type":"any","argument_types":["any"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,28],"bytes":[284,309]},"callee":null},"@entry":{"kind":"entry","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]}},"@exit":{"kind":"exit","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]}},"@formal_in:0":{"kind":"formal_in","of":"req"},"@formal_in:1":{"kind":"formal_in","of":"res"},"@formal_out":{"kind":"formal_out","of":"$ret"},"14:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:3"},"14:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:3"}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"14:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"req.query.probe","prov":["reaching-defs"]},{"src":"@entry","dst":"14:3","var":"res.send","prov":["reaching-defs"]}],"summary":[{"src":"14:3/actual_in:0","dst":"14:3/actual_out"}]}},"fields":{"app":{"name":"app","type":"any","initializer":"{}","scope":"module","declaration_kind":"const","is_readonly":true,"is_exported":false,"id":"can://typescript/anon-app/src/routes.ts/app","kind":"field","span":{"start":[12,7],"end":[12,20],"bytes":[222,235]}}}}},"call_graph":[{"src":"can://typescript/anon-app/src/routes.ts/login/","dst":"can://typescript/anon-app/src/routes.ts/query","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/anon-app/src/routes.ts/outer//","dst":"can://typescript/anon-app/src/routes.ts/named","prov":["jelly"],"weight":1}],"param_in":[{"src":"can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0","dst":"can://typescript/anon-app/src/routes.ts/query@formal_in:0"}],"param_out":[{"src":"can://typescript/anon-app/src/routes.ts/query@formal_out","dst":"can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out"}],"external_symbols":{},"synthesized_callables":{"can://typescript/anon-app/src/routes.ts/login@2:10":{"id":"can://typescript/anon-app/src/routes.ts/login/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:10":{"id":"can://typescript/anon-app/src/routes.ts/outer/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:16":{"id":"can://typescript/anon-app/src/routes.ts/outer//","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/anon-app.cypher b/test/goldens/anon-app.cypher new file mode 100644 index 0000000..2fed2c5 --- /dev/null +++ b/test/goldens/anon-app.cypher @@ -0,0 +1,269 @@ + + + + + {f: 'can://typescript/anon-app', t: 'can://typescript/anon-app/src/routes.ts', p: {}} + {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/app', p: {}} + {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/login', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/named', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/outer', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/query', p: {}} + {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@14:3', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_in:0', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@entry', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@exit', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@formal_in:0', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@formal_in:1', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@formal_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/@14:3', t: 'can://typescript/anon-app/src/routes.ts/@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/anon-app/src/routes.ts/@14:3', t: 'can://typescript/anon-app/src/routes.ts/@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_in:0', t: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/@entry', t: 'can://typescript/anon-app/src/routes.ts/@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/@entry', t: 'can://typescript/anon-app/src/routes.ts/@14:3', k: 'req.query.probe|reaching-defs', p: {var: 'req.query.probe', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/@entry', t: 'can://typescript/anon-app/src/routes.ts/@14:3', k: 'res.send|reaching-defs', p: {var: 'res.send', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/@entry', t: 'can://typescript/anon-app/src/routes.ts/@14:3', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login/', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login@2:3', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login@entry', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login@exit', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login@formal_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@3:5', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@entry', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@exit', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:0', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:1', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@formal_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/query', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/@3:5', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5', k: 'email|reaching-defs', p: {var: 'email', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/@3:5', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5', t: 'can://typescript/anon-app/src/routes.ts/login/@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5', t: 'can://typescript/anon-app/src/routes.ts/login/@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5', t: 'can://typescript/anon-app/src/routes.ts/query', p: {}} + {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', p: {}} + {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', t: 'can://typescript/anon-app/src/routes.ts/query@formal_in:0', p: {}} + {f: 'can://typescript/anon-app/src/routes.ts/login/@entry', t: 'can://typescript/anon-app/src/routes.ts/login/@3:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/@entry', t: 'can://typescript/anon-app/src/routes.ts/login/@3:5', k: 'req.body.email|reaching-defs', p: {var: 'req.body.email', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/@entry', t: 'can://typescript/anon-app/src/routes.ts/login/@3:5', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login/@entry', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/login@2:3', t: 'can://typescript/anon-app/src/routes.ts/login@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/anon-app/src/routes.ts/login@2:3', t: 'can://typescript/anon-app/src/routes.ts/login@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/login@entry', t: 'can://typescript/anon-app/src/routes.ts/login@2:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/login@entry', t: 'can://typescript/anon-app/src/routes.ts/login@2:3', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/named', t: 'can://typescript/anon-app/src/routes.ts/named@17:21', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/named', t: 'can://typescript/anon-app/src/routes.ts/named@entry', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/named', t: 'can://typescript/anon-app/src/routes.ts/named@exit', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/named', t: 'can://typescript/anon-app/src/routes.ts/named@formal_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/named@17:21', t: 'can://typescript/anon-app/src/routes.ts/named@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/anon-app/src/routes.ts/named@17:21', t: 'can://typescript/anon-app/src/routes.ts/named@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/named@entry', t: 'can://typescript/anon-app/src/routes.ts/named@17:21', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/named@entry', t: 'can://typescript/anon-app/src/routes.ts/named@17:21', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer/', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer@20:3', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer@entry', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer@exit', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer@formal_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer//', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer/@entry', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer/@exit', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer/@formal_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/named', p: {weight: 1, prov: ['jelly']}} + {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/outer//@entry', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/outer//@exit', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/outer//@formal_out', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', t: 'can://typescript/anon-app/src/routes.ts/outer//@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', t: 'can://typescript/anon-app/src/routes.ts/outer//@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', t: 'can://typescript/anon-app/src/routes.ts/outer//@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//@entry', t: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//@entry', t: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', k: 'src/routes.named|reaching-defs', p: {var: 'src/routes.named', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer//@entry', t: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', t: 'can://typescript/anon-app/src/routes.ts/outer/@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', t: 'can://typescript/anon-app/src/routes.ts/outer/@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', t: 'can://typescript/anon-app/src/routes.ts/outer/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/@entry', t: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/@entry', t: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', k: 'src/routes.named|reaching-defs', p: {var: 'src/routes.named', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer/@entry', t: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer@20:3', t: 'can://typescript/anon-app/src/routes.ts/outer@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer@20:3', t: 'can://typescript/anon-app/src/routes.ts/outer@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer@entry', t: 'can://typescript/anon-app/src/routes.ts/outer@20:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer@entry', t: 'can://typescript/anon-app/src/routes.ts/outer@20:3', k: 'src/routes.named|reaching-defs', p: {var: 'src/routes.named', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/outer@entry', t: 'can://typescript/anon-app/src/routes.ts/outer@20:3', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@9:3', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@entry', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@exit', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@formal_in:0', p: {}}, + {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@formal_out', p: {}} + {f: 'can://typescript/anon-app/src/routes.ts/query@9:3', t: 'can://typescript/anon-app/src/routes.ts/query@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/anon-app/src/routes.ts/query@9:3', t: 'can://typescript/anon-app/src/routes.ts/query@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/anon-app/src/routes.ts/query@entry', t: 'can://typescript/anon-app/src/routes.ts/query@9:3', k: 'fallthrough', p: {kind: 'fallthrough'}} + {f: 'can://typescript/anon-app/src/routes.ts/query@entry', t: 'can://typescript/anon-app/src/routes.ts/query@9:3', k: 'sql|reaching-defs', p: {var: 'sql', prov: ['reaching-defs']}} + {f: 'can://typescript/anon-app/src/routes.ts/query@entry', t: 'can://typescript/anon-app/src/routes.ts/query@9:3', p: {}} + {f: 'can://typescript/anon-app/src/routes.ts/query@formal_out', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', p: {}} + {k: 'can://typescript/anon-app', p: {id: 'can://typescript/anon-app', schema_version: '2.1.0', language: 'typescript', max_level: 4, k_limit: 3, analyzer_name: 'codeanalyzer-typescript', analyzer_version: '1.0.0'}} + {k: 'can://typescript/anon-app/src/routes.ts', p: {id: 'can://typescript/anon-app/src/routes.ts', kind: 'module', name: 'src/routes.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 22, _module: 'src/routes.ts'}} + {k: 'can://typescript/anon-app/src/routes.ts/', p: {id: 'can://typescript/anon-app/src/routes.ts/', kind: 'arrow', signature: 'src/routes.', name: '(anonymous)', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 13, end_line: 15, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/@14:3', p: {id: 'can://typescript/anon-app/src/routes.ts/@14:3', kind: 'call', start_line: 14, end_line: 14, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '14:3', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_out', p: {id: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_out', kind: 'actual_out', of: '$ret', parent: '14:3', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/@entry', kind: 'entry', start_line: 13, end_line: 15, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/@exit', kind: 'exit', start_line: 13, end_line: 15, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/@formal_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/@formal_in:0', kind: 'formal_in', of: 'req', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/@formal_in:1', p: {id: 'can://typescript/anon-app/src/routes.ts/@formal_in:1', kind: 'formal_in', of: 'res', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/app', p: {id: 'can://typescript/anon-app/src/routes.ts/app', kind: 'field', name: 'app', type: 'any', start_line: 12, end_line: 12, _module: 'src/routes.ts'}} + {k: 'can://typescript/anon-app/src/routes.ts/login', p: {id: 'can://typescript/anon-app/src/routes.ts/login', kind: 'function', signature: 'src/routes.login', name: 'login', return_type: '(req: any, res: any) => void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 1, end_line: 6, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/', p: {id: 'can://typescript/anon-app/src/routes.ts/login/', kind: 'arrow', signature: 'src/routes.login.', name: '(anonymous)', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 2, end_line: 5, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@3:5', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@3:5', kind: 'statement', start_line: 3, end_line: 3, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@4:5', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@4:5', kind: 'call', callee: 'can://typescript/anon-app/src/routes.ts/query', start_line: 4, end_line: 4, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '4:5', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', kind: 'actual_out', of: '$ret', parent: '4:5', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@entry', kind: 'entry', start_line: 2, end_line: 5, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@exit', kind: 'exit', start_line: 2, end_line: 5, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:0', kind: 'formal_in', of: 'req', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:1', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:1', kind: 'formal_in', of: 'res', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login/@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login@2:3', p: {id: 'can://typescript/anon-app/src/routes.ts/login@2:3', kind: 'statement', start_line: 2, end_line: 5, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/login@entry', kind: 'entry', start_line: 1, end_line: 6, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/login@exit', kind: 'exit', start_line: 1, end_line: 6, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/login@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/login@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/named', p: {id: 'can://typescript/anon-app/src/routes.ts/named', kind: 'arrow', signature: 'src/routes.named', name: 'named', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 17, end_line: 17, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/named@17:21', p: {id: 'can://typescript/anon-app/src/routes.ts/named@17:21', kind: 'statement', start_line: 17, end_line: 17, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/named@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/named@entry', kind: 'entry', start_line: 17, end_line: 17, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/named@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/named@exit', kind: 'exit', start_line: 17, end_line: 17, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/named@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/named@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer', p: {id: 'can://typescript/anon-app/src/routes.ts/outer', kind: 'function', signature: 'src/routes.outer', name: 'outer', return_type: '() => () => number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 19, end_line: 21, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer/', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/', kind: 'arrow', signature: 'src/routes.outer.', name: '(anonymous)', return_type: '() => number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer//', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//', kind: 'arrow', signature: 'src/routes.outer..', name: '(anonymous)', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 20, end_line: 20, _module: 'src/routes.ts'}} + {k: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer//@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//@entry', kind: 'entry', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer//@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//@exit', kind: 'exit', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer//@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer/@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/@entry', kind: 'entry', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer/@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/@exit', kind: 'exit', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer/@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer@20:3', p: {id: 'can://typescript/anon-app/src/routes.ts/outer@20:3', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/outer@entry', kind: 'entry', start_line: 19, end_line: 21, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/outer@exit', kind: 'exit', start_line: 19, end_line: 21, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/outer@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/outer@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/query', p: {id: 'can://typescript/anon-app/src/routes.ts/query', kind: 'function', signature: 'src/routes.query', name: 'query', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 8, end_line: 10, _module: 'src/routes.ts'}} + {k: 'can://typescript/anon-app/src/routes.ts/query@9:3', p: {id: 'can://typescript/anon-app/src/routes.ts/query@9:3', kind: 'statement', start_line: 9, end_line: 9, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/query@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/query@entry', kind: 'entry', start_line: 8, end_line: 10, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/query@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/query@exit', kind: 'exit', start_line: 8, end_line: 10, _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/query@formal_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/query@formal_in:0', kind: 'formal_in', of: 'sql', _module: 'src/routes.ts'}}, + {k: 'can://typescript/anon-app/src/routes.ts/query@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/query@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}} +// ── constraints & indexes ── +// ── nodes ── +// ── relationships ── +// ── wipe this project's prior subgraph (external targets are shared) ── +CREATE CONSTRAINT application_id IF NOT EXISTS FOR (x:Application) REQUIRE x.id IS UNIQUE; +CREATE CONSTRAINT cannode_id IF NOT EXISTS FOR (x:CanNode) REQUIRE x.id IS UNIQUE; +CREATE INDEX callable_name IF NOT EXISTS FOR (c:TSCallable) ON (c.name); +CREATE INDEX cannode_kind IF NOT EXISTS FOR (n:CanNode) ON (n.kind); +CREATE INDEX cannode_module IF NOT EXISTS FOR (n:CanNode) ON (n._module); +DETACH DELETE x, m, a; +MATCH (a:Application {id: 'can://typescript/anon-app'}) +MATCH (a:Application {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MERGE (a)-[r:TS_CALLS]->(b) +MERGE (a)-[r:TS_CDG]->(b) +MERGE (a)-[r:TS_CFG_NEXT {_k: row.k}]->(b) +MERGE (a)-[r:TS_DDG {_k: row.k}]->(b) +MERGE (a)-[r:TS_DECLARES]->(b) +MERGE (a)-[r:TS_HAS_BODY_NODE]->(b) +MERGE (a)-[r:TS_HAS_FIELD]->(b) +MERGE (a)-[r:TS_HAS_MODULE]->(b) +MERGE (a)-[r:TS_PARAM_IN]->(b) +MERGE (a)-[r:TS_PARAM_OUT]->(b) +MERGE (a)-[r:TS_RESOLVES_TO]->(b) +MERGE (a)-[r:TS_SUMMARY]->(b) +MERGE (n:Application {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +OPTIONAL MATCH (a)-[:TS_HAS_MODULE]->(m:TSModule) +OPTIONAL MATCH (m)-[:TS_DECLARES|TS_HAS_METHOD|TS_HAS_FIELD|TS_HAS_BODY_NODE*1..]->(x) +SET n += row.p, n:TSApplication; +SET n += row.p, n:TSBodyNode; +SET n += row.p, n:TSCallable:TSAnonymousCallable; +SET n += row.p, n:TSCallable; +SET n += row.p, n:TSField; +SET n += row.p, n:TSModule; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row \ No newline at end of file diff --git a/test/goldens/dataflow-app-a1.json b/test/goldens/dataflow-app-a1.json new file mode 100644 index 0000000..9733fee --- /dev/null +++ b/test/goldens/dataflow-app-a1.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/dataflow-app","kind":"application","symbol_table":{"src/chain.ts":{"source":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */\nimport { increment } from \"./util\";\n\nexport function c(z: number): number {\n return z + 1; // the parameter flows to the return value\n}\n\nexport function b(y: number): number {\n const fromC = c(y);\n return fromC;\n}\n\nexport function a(x: number): number {\n const fromB = b(x); // SUMMARY edge here: arg0 flows through b (and c) to the result\n return fromB;\n}\n\nexport function viaOtherFile(x: number): number {\n return increment(x); // cross-module CALL / PARAM_IN / PARAM_OUT edges\n}\n\nexport function isEven(n: number): boolean {\n if (n === 0) return true;\n return isOdd(n - 1); // mutual recursion: {isEven, isOdd} form an SCC\n}\n\nexport function isOdd(n: number): boolean {\n if (n === 0) return false;\n return isEven(n - 1);\n}\n","imports":[{"module":"./util","name":"increment","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":36}],"exports":[],"comments":[{"content":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/chain.ts","kind":"module","span":{"start":[1,1],"end":[31,1],"bytes":[0,824]},"types":{},"functions":{"c":{"name":"c","signature":"src/chain.c","comments":[],"decorators":[],"parameters":[{"name":"z","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/c","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]},"body":{}},"b":{"name":"b","signature":"src/chain.b","comments":[],"decorators":[],"parameters":[{"name":"y","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/b","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]},"body":{"9:17":{"method_name":"c","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,17],"end":[9,21],"bytes":[281,285]},"callee":null}}},"a":{"name":"a","signature":"src/chain.a","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/a","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]},"body":{"14:17":{"method_name":"b","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,17],"end":[14,21],"bytes":[361,365]},"callee":null}}},"viaOtherFile":{"name":"viaOtherFile","signature":"src/chain.viaOtherFile","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":18,"end_line":18,"start_column":30,"end_column":39}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]},"body":{"19:10":{"method_name":"increment","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,10],"end":[19,22],"bytes":[510,522]},"callee":null}}},"isEven":{"name":"isEven","signature":"src/chain.isEven","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":22,"end_line":22,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isEven","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]},"body":{"24:10":{"method_name":"isOdd","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,10],"end":[24,22],"bytes":[659,671]},"callee":null}}},"isOdd":{"name":"isOdd","signature":"src/chain.isOdd","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":27,"end_line":27,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isOdd","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]},"body":{"29:10":{"method_name":"isEven","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,10],"end":[29,23],"bytes":[807,820]},"callee":null}}}},"fields":{}},"src/closures.ts":{"source":"/** Closure capture and copy aliasing. */\n\nexport function makeCounter(start: number): () => number {\n let count = start;\n const inc = (): number => {\n count = count + 1; // writes the captured local\n return count;\n };\n return inc;\n}\n\nexport function useAlias(): number {\n const p = { f: 1 };\n const q = p; // q and p alias the same object\n q.f = 42; // write through q ...\n return p.f; // ... must reach this read through p\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Closure capture and copy aliasing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/closures.ts","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,441]},"types":{},"functions":{"makeCounter":{"name":"makeCounter","signature":"src/closures.makeCounter","comments":[{"content":"Closure capture and copy aliasing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"decorators":[],"parameters":[{"name":"start","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":29,"end_column":42}],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]},"body":{},"callables":{"inc":{"name":"inc","signature":"src/closures.makeCounter.inc","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter/inc","span":{"start":[5,9],"end":[8,4],"bytes":[131,226]},"body":{}}}},"useAlias":{"name":"useAlias","signature":"src/closures.useAlias","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/useAlias","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]},"body":{}}},"fields":{}},"src/flow.ts":{"source":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */\n\nexport function classify(n: number): string {\n let label = \"none\";\n if (n > 0) {\n label = \"pos\";\n } else {\n label = \"neg\";\n }\n return label;\n}\n\nexport function sumTo(n: number): number {\n let acc = 0;\n for (let i = 0; i < n; i++) {\n acc = acc + i; // loop-carried dependency: acc feeds itself around the back edge\n }\n return acc;\n}\n\nexport function early(n: number): number {\n if (n < 0) {\n return -1; // early return (multi-exit normalization)\n }\n const r = n * 2;\n return r;\n}\n\nexport function parse(s: string): number {\n const v = Number(s);\n if (Number.isNaN(v)) {\n throw new Error(`bad input: ${s}`);\n }\n return v;\n}\n\nexport function guarded(s: string): number {\n let out = 0;\n try {\n out = parse(s); // may throw → exception edge into the catch node\n } catch (e) {\n out = -1;\n } finally {\n touch(out);\n }\n return out;\n}\n\nexport function touch(x: number): void {\n void x;\n}\n\nexport function pickDay(d: number): string {\n let name = \"\";\n switch (d) {\n case 0:\n name = \"sun\";\n break;\n case 6:\n name = \"sat\";\n break;\n default:\n name = \"weekday\";\n }\n return name;\n}\n\nexport function spin(): number {\n let ticks = 0;\n while (true) {\n ticks = ticks + 1; // infinite loop: the dead loop-exit edge keeps EXIT reachable\n if (ticks > 3) {\n break;\n }\n }\n return ticks;\n}\n\nexport function shadow(): number {\n const x = 1;\n {\n const x = 2; // shadows the outer x — must NOT leak DDG edges across scopes\n touch(x);\n }\n return x;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/flow.ts","kind":"module","span":{"start":[1,1],"end":[87,1],"bytes":[0,1634]},"types":{},"functions":{"classify":{"name":"classify","signature":"src/flow.classify","comments":[{"content":"Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/classify","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]},"body":{}},"sumTo":{"name":"sumTo","signature":"src/flow.sumTo","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/sumTo","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]},"body":{}},"early":{"name":"early","signature":"src/flow.early","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/early","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]},"body":{}},"parse":{"name":"parse","signature":"src/flow.parse","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":29,"end_line":29,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/parse","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]},"body":{"30:13":{"method_name":"Number","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,13],"end":[30,22],"bytes":[658,667]},"callee":null},"31:7":{"method_name":"isNaN","receiver_expr":"Number","receiver_type":"NumberConstructor","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,7],"end":[31,22],"bytes":[675,690]},"callee":null},"32:11":{"method_name":"Error","argument_types":["string"],"type_arguments":[],"return_type":"Error","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[32,11],"end":[32,39],"bytes":[704,732]},"callee":null}}},"guarded":{"name":"guarded","signature":"src/flow.guarded","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/guarded","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]},"body":{"40:11":{"method_name":"parse","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,11],"end":[40,19],"bytes":[831,839]},"callee":null},"44:5":{"method_name":"touch","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[44,5],"end":[44,15],"bytes":[939,949]},"callee":null}}},"touch":{"name":"touch","signature":"src/flow.touch","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":49,"end_line":49,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/touch","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]},"body":{}},"pickDay":{"name":"pickDay","signature":"src/flow.pickDay","comments":[],"decorators":[],"parameters":[{"name":"d","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":53,"end_line":53,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/pickDay","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]},"body":{}},"spin":{"name":"spin","signature":"src/flow.spin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/spin","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]},"body":{}},"shadow":{"name":"shadow","signature":"src/flow.shadow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/shadow","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]},"body":{"83:5":{"method_name":"touch","argument_types":["2"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[83,5],"end":[83,13],"bytes":[1606,1614]},"callee":null}}}},"fields":{}},"src/hierarchy.ts":{"source":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */\n\nexport interface Shape {\n area(): number;\n}\n\nexport interface Labeled {\n readonly label: string;\n}\n\nexport interface ColoredShape extends Shape {\n readonly color: string;\n}\n\nexport class Rectangle implements Shape {\n constructor(\n protected readonly width: number,\n protected readonly height: number,\n ) {}\n\n area(): number {\n return this.width * this.height;\n }\n}\n\nexport class Square extends Rectangle implements Labeled {\n readonly label = \"square\";\n\n constructor(side: number) {\n super(side, side);\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts","kind":"module","span":{"start":[1,1],"end":[34,1],"bytes":[0,712]},"types":{"Rectangle":{"name":"Rectangle","signature":"src/hierarchy.Rectangle","comments":[],"decorators":[],"base_classes":["src/hierarchy.Shape"],"implements_types":["src/hierarchy.Shape"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle","kind":"class","span":{"start":[16,1],"end":[25,2],"bytes":[359,562]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Rectangle.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]},"body":{}},"constructor":{"name":"constructor","signature":"src/hierarchy.Rectangle.constructor","comments":[],"decorators":[],"parameters":[{"name":"width","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":18,"end_line":18,"start_column":5,"end_column":37},{"name":"height","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":19,"end_line":19,"start_column":5,"end_column":38}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]},"body":{}}},"fields":{"width":{"name":"width","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width","kind":"field"},"height":{"name":"height","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height","kind":"field"}},"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]},"Square":{"name":"Square","signature":"src/hierarchy.Square","comments":[],"decorators":[],"base_classes":["src/hierarchy.Rectangle","src/hierarchy.Labeled"],"implements_types":["src/hierarchy.Labeled"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square","kind":"class","span":{"start":[27,1],"end":[33,2],"bytes":[564,711]},"callables":{"constructor":{"name":"constructor","signature":"src/hierarchy.Square.constructor","comments":[],"decorators":[],"parameters":[{"name":"side","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":30,"end_line":30,"start_column":15,"end_column":27}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]},"body":{"31:5":{"method_name":"super","argument_types":["number","number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,22],"bytes":[687,704]},"callee":null}}}},"fields":{"label":{"name":"label","type":"\"square\"","comments":[],"decorators":[],"initializer":"\"square\"","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/label","kind":"field","span":{"start":[28,3],"end":[28,29],"bytes":[625,651]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Rectangle"],"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Labeled"]},"Shape":{"name":"Shape","signature":"src/hierarchy.Shape","comments":[{"content":"A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\nprojection, including interface→interface EXTENDS (`ColoredShape extends Shape`).","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape","kind":"interface","span":{"start":[4,1],"end":[6,2],"bytes":[182,226]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Shape.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape/area","span":{"start":[5,3],"end":[5,18],"bytes":[209,224]},"body":{}}},"fields":{}},"Labeled":{"name":"Labeled","signature":"src/hierarchy.Labeled","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled","kind":"interface","span":{"start":[8,1],"end":[10,2],"bytes":[228,282]},"callables":{},"fields":{"label":{"name":"label","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label","kind":"field","span":{"start":[9,3],"end":[9,26],"bytes":[257,280]}}}},"ColoredShape":{"name":"ColoredShape","signature":"src/hierarchy.ColoredShape","comments":[],"base_classes":["src/hierarchy.Shape"],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape","kind":"interface","span":{"start":[12,1],"end":[14,2],"bytes":[284,357]},"callables":{},"fields":{"color":{"name":"color","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color","kind":"field","span":{"start":[13,3],"end":[13,26],"bytes":[332,355]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]}},"functions":{},"fields":{}},"src/main.ts":{"source":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */\nimport { a } from \"./chain\";\nimport { bump, readCounter } from \"./state\";\n\nexport function main(): number {\n bump(3);\n const r = a(readCounter());\n return r;\n}\n","imports":[{"module":"./chain","name":"a","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":29},{"module":"./state","name":"bump","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45},{"module":"./state","name":"readCounter","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45}],"exports":[],"comments":[{"content":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":81}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/main.ts","kind":"module","span":{"start":[1,1],"end":[10,1],"bytes":[0,244]},"types":{},"functions":{"main":{"name":"main","signature":"src/main.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/main.ts/main","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]},"body":{"6:3":{"method_name":"bump","argument_types":["3"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[6,3],"end":[6,10],"bytes":[191,198]},"callee":null},"7:13":{"method_name":"a","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,13],"end":[7,29],"bytes":[212,228]},"callee":null},"7:15":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,15],"end":[7,28],"bytes":[214,227]},"callee":null}}}},"fields":{}},"src/state.ts":{"source":"/** Module-level global state: written in one function, read in another. */\n\nexport let counter = 0;\n\nexport function bump(by: number): void {\n counter = counter + by; // global write\n}\n\nexport function readCounter(): number {\n return counter; // global read that flows to the return value\n}\n\nexport function churn(by: number): number {\n bump(by); // transitive global write lands on this callsite node\n return readCounter(); // transitive global read\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Module-level global state: written in one function, read in another. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":76}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/state.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,458]},"types":{},"functions":{"bump":{"name":"bump","signature":"src/state.bump","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":5,"end_line":5,"start_column":22,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/bump","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]},"body":{}},"readCounter":{"name":"readCounter","signature":"src/state.readCounter","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/readCounter","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]},"body":{}},"churn":{"name":"churn","signature":"src/state.churn","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":33}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/churn","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]},"body":{"14:3":{"method_name":"bump","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,11],"bytes":[341,349]},"callee":null},"15:10":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,23],"bytes":[415,428]},"callee":null}}}},"fields":{"counter":{"name":"counter","type":"number","initializer":"0","scope":"module","declaration_kind":"let","is_readonly":false,"is_exported":true,"id":"can://typescript/dataflow-app/src/state.ts/counter","kind":"field","span":{"start":[3,12],"end":[3,23],"bytes":[88,99]}}}},"src/susp.ts":{"source":"/** Suspension points (await/yield) and intra-statement expression control flow. */\n\nexport async function compute(x: number): Promise {\n return x * 2;\n}\n\nexport async function fetchTotal(x: number): Promise {\n const a = await compute(x); // await_resume edge out of this statement\n return a + 1;\n}\n\nexport function* numbers(n: number): Generator {\n let i = 0;\n while (i < n) {\n yield i; // yield (suspend/resume) edge\n i = i + 1;\n }\n return n;\n}\n\nexport function shortCircuit(a: { f?: number } | null, b: number): number {\n const v = (a && a.f) || b; // short-circuit stays intra-statement (documented rule)\n const w = a?.f ?? b; // optional chaining likewise\n return v + w;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Suspension points (await/yield) and intra-statement expression control flow. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/susp.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,735]},"types":{},"functions":{"compute":{"name":"compute","signature":"src/susp.compute","comments":[{"content":"Suspension points (await/yield) and intra-statement expression control flow.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":31,"end_column":40}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/compute","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]},"body":{}},"fetchTotal":{"name":"fetchTotal","signature":"src/susp.fetchTotal","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":34,"end_column":43}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]},"body":{"8:19":{"method_name":"compute","argument_types":["number"],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,19],"end":[8,29],"bytes":[245,255]},"callee":null}}},"numbers":{"name":"numbers","signature":"src/susp.numbers","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"Generator","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":true,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/numbers","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]},"body":{}},"shortCircuit":{"name":"shortCircuit","signature":"src/susp.shortCircuit","comments":[],"decorators":[],"parameters":[{"name":"a","type":"{ f?: number } | null","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":30,"end_column":54},{"name":"b","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":56,"end_column":65}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":4,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/shortCircuit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]},"body":{}}},"fields":{}},"src/taint.ts":{"source":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */\n\nexport function source(): string {\n return \"user-input\";\n}\n\nexport function sanitize(s: string): string {\n return s.replace(/dangerous/g, \"\");\n}\n\nexport function sink(s: string): void {\n void s;\n}\n\nexport function unsafeFlow(): void {\n const s = source();\n sink(s);\n}\n\nexport function safeFlow(): void {\n const s = sanitize(source());\n sink(s);\n}\n","imports":[],"exports":[],"comments":[{"content":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/taint.ts","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,536]},"types":{},"functions":{"source":{"name":"source","signature":"src/taint.source","comments":[{"content":"Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n(issue #2 PR E); the fixture carries the flows now so that PR only adds the query.","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/source","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]},"body":{}},"sanitize":{"name":"sanitize","signature":"src/taint.sanitize","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sanitize","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]},"body":{"11:10":{"method_name":"replace","receiver_expr":"s","receiver_type":"string","argument_types":["RegExp","\"\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[11,10],"end":[11,37],"bytes":[298,325]},"callee":null}}},"sink":{"name":"sink","signature":"src/taint.sink","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":22,"end_column":31}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sink","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]},"body":{}},"unsafeFlow":{"name":"unsafeFlow","signature":"src/taint.unsafeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]},"body":{"19:13":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,13],"end":[19,21],"bytes":[432,440]},"callee":null},"20:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,3],"end":[20,10],"bytes":[444,451]},"callee":null}}},"safeFlow":{"name":"safeFlow","signature":"src/taint.safeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/safeFlow","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]},"body":{"24:13":{"method_name":"sanitize","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,13],"end":[24,31],"bytes":[503,521]},"callee":null},"24:22":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,22],"end":[24,30],"bytes":[512,520]},"callee":null},"25:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,3],"end":[25,10],"bytes":[525,532]},"callee":null}}}},"fields":{}},"src/util.ts":{"source":"export function increment(v: number): number {\n return v + 1;\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[4,1],"bytes":[0,65]},"types":{},"functions":{"increment":{"name":"increment","signature":"src/util.increment","comments":[],"decorators":[],"parameters":[{"name":"v","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":1,"end_line":1,"start_column":27,"end_column":36}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/util.ts/increment","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]},"body":{}}},"fields":{}}},"call_graph":[],"param_in":[],"param_out":[]}} \ No newline at end of file diff --git a/test/goldens/dataflow-app-a2.json b/test/goldens/dataflow-app-a2.json new file mode 100644 index 0000000..ad9b930 --- /dev/null +++ b/test/goldens/dataflow-app-a2.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/dataflow-app","kind":"application","symbol_table":{"src/chain.ts":{"source":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */\nimport { increment } from \"./util\";\n\nexport function c(z: number): number {\n return z + 1; // the parameter flows to the return value\n}\n\nexport function b(y: number): number {\n const fromC = c(y);\n return fromC;\n}\n\nexport function a(x: number): number {\n const fromB = b(x); // SUMMARY edge here: arg0 flows through b (and c) to the result\n return fromB;\n}\n\nexport function viaOtherFile(x: number): number {\n return increment(x); // cross-module CALL / PARAM_IN / PARAM_OUT edges\n}\n\nexport function isEven(n: number): boolean {\n if (n === 0) return true;\n return isOdd(n - 1); // mutual recursion: {isEven, isOdd} form an SCC\n}\n\nexport function isOdd(n: number): boolean {\n if (n === 0) return false;\n return isEven(n - 1);\n}\n","imports":[{"module":"./util","name":"increment","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":36}],"exports":[],"comments":[{"content":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/chain.ts","kind":"module","span":{"start":[1,1],"end":[31,1],"bytes":[0,824]},"types":{},"functions":{"c":{"name":"c","signature":"src/chain.c","comments":[],"decorators":[],"parameters":[{"name":"z","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/c","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]},"body":{}},"b":{"name":"b","signature":"src/chain.b","comments":[],"decorators":[],"parameters":[{"name":"y","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/b","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]},"body":{"9:17":{"method_name":"c","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,17],"end":[9,21],"bytes":[281,285]},"callee":"can://typescript/dataflow-app/src/chain.ts/c"}}},"a":{"name":"a","signature":"src/chain.a","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/a","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]},"body":{"14:17":{"method_name":"b","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,17],"end":[14,21],"bytes":[361,365]},"callee":"can://typescript/dataflow-app/src/chain.ts/b"}}},"viaOtherFile":{"name":"viaOtherFile","signature":"src/chain.viaOtherFile","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":18,"end_line":18,"start_column":30,"end_column":39}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]},"body":{"19:10":{"method_name":"increment","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,10],"end":[19,22],"bytes":[510,522]},"callee":"can://typescript/dataflow-app/src/util.ts/increment"}}},"isEven":{"name":"isEven","signature":"src/chain.isEven","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":22,"end_line":22,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isEven","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]},"body":{"24:10":{"method_name":"isOdd","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,10],"end":[24,22],"bytes":[659,671]},"callee":"can://typescript/dataflow-app/src/chain.ts/isOdd"}}},"isOdd":{"name":"isOdd","signature":"src/chain.isOdd","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":27,"end_line":27,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isOdd","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]},"body":{"29:10":{"method_name":"isEven","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,10],"end":[29,23],"bytes":[807,820]},"callee":"can://typescript/dataflow-app/src/chain.ts/isEven"}}}},"fields":{}},"src/closures.ts":{"source":"/** Closure capture and copy aliasing. */\n\nexport function makeCounter(start: number): () => number {\n let count = start;\n const inc = (): number => {\n count = count + 1; // writes the captured local\n return count;\n };\n return inc;\n}\n\nexport function useAlias(): number {\n const p = { f: 1 };\n const q = p; // q and p alias the same object\n q.f = 42; // write through q ...\n return p.f; // ... must reach this read through p\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Closure capture and copy aliasing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/closures.ts","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,441]},"types":{},"functions":{"makeCounter":{"name":"makeCounter","signature":"src/closures.makeCounter","comments":[{"content":"Closure capture and copy aliasing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"decorators":[],"parameters":[{"name":"start","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":29,"end_column":42}],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]},"body":{},"callables":{"inc":{"name":"inc","signature":"src/closures.makeCounter.inc","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter/inc","span":{"start":[5,9],"end":[8,4],"bytes":[131,226]},"body":{}}}},"useAlias":{"name":"useAlias","signature":"src/closures.useAlias","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/useAlias","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]},"body":{}}},"fields":{}},"src/flow.ts":{"source":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */\n\nexport function classify(n: number): string {\n let label = \"none\";\n if (n > 0) {\n label = \"pos\";\n } else {\n label = \"neg\";\n }\n return label;\n}\n\nexport function sumTo(n: number): number {\n let acc = 0;\n for (let i = 0; i < n; i++) {\n acc = acc + i; // loop-carried dependency: acc feeds itself around the back edge\n }\n return acc;\n}\n\nexport function early(n: number): number {\n if (n < 0) {\n return -1; // early return (multi-exit normalization)\n }\n const r = n * 2;\n return r;\n}\n\nexport function parse(s: string): number {\n const v = Number(s);\n if (Number.isNaN(v)) {\n throw new Error(`bad input: ${s}`);\n }\n return v;\n}\n\nexport function guarded(s: string): number {\n let out = 0;\n try {\n out = parse(s); // may throw → exception edge into the catch node\n } catch (e) {\n out = -1;\n } finally {\n touch(out);\n }\n return out;\n}\n\nexport function touch(x: number): void {\n void x;\n}\n\nexport function pickDay(d: number): string {\n let name = \"\";\n switch (d) {\n case 0:\n name = \"sun\";\n break;\n case 6:\n name = \"sat\";\n break;\n default:\n name = \"weekday\";\n }\n return name;\n}\n\nexport function spin(): number {\n let ticks = 0;\n while (true) {\n ticks = ticks + 1; // infinite loop: the dead loop-exit edge keeps EXIT reachable\n if (ticks > 3) {\n break;\n }\n }\n return ticks;\n}\n\nexport function shadow(): number {\n const x = 1;\n {\n const x = 2; // shadows the outer x — must NOT leak DDG edges across scopes\n touch(x);\n }\n return x;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/flow.ts","kind":"module","span":{"start":[1,1],"end":[87,1],"bytes":[0,1634]},"types":{},"functions":{"classify":{"name":"classify","signature":"src/flow.classify","comments":[{"content":"Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/classify","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]},"body":{}},"sumTo":{"name":"sumTo","signature":"src/flow.sumTo","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/sumTo","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]},"body":{}},"early":{"name":"early","signature":"src/flow.early","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/early","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]},"body":{}},"parse":{"name":"parse","signature":"src/flow.parse","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":29,"end_line":29,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/parse","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]},"body":{"30:13":{"method_name":"Number","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,13],"end":[30,22],"bytes":[658,667]},"callee":null},"31:7":{"method_name":"isNaN","receiver_expr":"Number","receiver_type":"NumberConstructor","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,7],"end":[31,22],"bytes":[675,690]},"callee":"can://typescript/dataflow-app/@external/(builtin)/isNaN"},"32:11":{"method_name":"Error","argument_types":["string"],"type_arguments":[],"return_type":"Error","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[32,11],"end":[32,39],"bytes":[704,732]},"callee":null}}},"guarded":{"name":"guarded","signature":"src/flow.guarded","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/guarded","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]},"body":{"40:11":{"method_name":"parse","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,11],"end":[40,19],"bytes":[831,839]},"callee":"can://typescript/dataflow-app/src/flow.ts/parse"},"44:5":{"method_name":"touch","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[44,5],"end":[44,15],"bytes":[939,949]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"}}},"touch":{"name":"touch","signature":"src/flow.touch","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":49,"end_line":49,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/touch","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]},"body":{}},"pickDay":{"name":"pickDay","signature":"src/flow.pickDay","comments":[],"decorators":[],"parameters":[{"name":"d","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":53,"end_line":53,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/pickDay","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]},"body":{}},"spin":{"name":"spin","signature":"src/flow.spin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/spin","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]},"body":{}},"shadow":{"name":"shadow","signature":"src/flow.shadow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/shadow","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]},"body":{"83:5":{"method_name":"touch","argument_types":["2"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[83,5],"end":[83,13],"bytes":[1606,1614]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"}}}},"fields":{}},"src/hierarchy.ts":{"source":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */\n\nexport interface Shape {\n area(): number;\n}\n\nexport interface Labeled {\n readonly label: string;\n}\n\nexport interface ColoredShape extends Shape {\n readonly color: string;\n}\n\nexport class Rectangle implements Shape {\n constructor(\n protected readonly width: number,\n protected readonly height: number,\n ) {}\n\n area(): number {\n return this.width * this.height;\n }\n}\n\nexport class Square extends Rectangle implements Labeled {\n readonly label = \"square\";\n\n constructor(side: number) {\n super(side, side);\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts","kind":"module","span":{"start":[1,1],"end":[34,1],"bytes":[0,712]},"types":{"Rectangle":{"name":"Rectangle","signature":"src/hierarchy.Rectangle","comments":[],"decorators":[],"base_classes":["src/hierarchy.Shape"],"implements_types":["src/hierarchy.Shape"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle","kind":"class","span":{"start":[16,1],"end":[25,2],"bytes":[359,562]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Rectangle.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]},"body":{}},"constructor":{"name":"constructor","signature":"src/hierarchy.Rectangle.constructor","comments":[],"decorators":[],"parameters":[{"name":"width","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":18,"end_line":18,"start_column":5,"end_column":37},{"name":"height","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":19,"end_line":19,"start_column":5,"end_column":38}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]},"body":{}}},"fields":{"width":{"name":"width","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width","kind":"field"},"height":{"name":"height","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height","kind":"field"}},"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]},"Square":{"name":"Square","signature":"src/hierarchy.Square","comments":[],"decorators":[],"base_classes":["src/hierarchy.Rectangle","src/hierarchy.Labeled"],"implements_types":["src/hierarchy.Labeled"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square","kind":"class","span":{"start":[27,1],"end":[33,2],"bytes":[564,711]},"callables":{"constructor":{"name":"constructor","signature":"src/hierarchy.Square.constructor","comments":[],"decorators":[],"parameters":[{"name":"side","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":30,"end_line":30,"start_column":15,"end_column":27}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]},"body":{"31:5":{"method_name":"super","argument_types":["number","number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,22],"bytes":[687,704]},"callee":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor"}}}},"fields":{"label":{"name":"label","type":"\"square\"","comments":[],"decorators":[],"initializer":"\"square\"","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/label","kind":"field","span":{"start":[28,3],"end":[28,29],"bytes":[625,651]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Rectangle"],"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Labeled"]},"Shape":{"name":"Shape","signature":"src/hierarchy.Shape","comments":[{"content":"A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\nprojection, including interface→interface EXTENDS (`ColoredShape extends Shape`).","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape","kind":"interface","span":{"start":[4,1],"end":[6,2],"bytes":[182,226]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Shape.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape/area","span":{"start":[5,3],"end":[5,18],"bytes":[209,224]},"body":{}}},"fields":{}},"Labeled":{"name":"Labeled","signature":"src/hierarchy.Labeled","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled","kind":"interface","span":{"start":[8,1],"end":[10,2],"bytes":[228,282]},"callables":{},"fields":{"label":{"name":"label","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label","kind":"field","span":{"start":[9,3],"end":[9,26],"bytes":[257,280]}}}},"ColoredShape":{"name":"ColoredShape","signature":"src/hierarchy.ColoredShape","comments":[],"base_classes":["src/hierarchy.Shape"],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape","kind":"interface","span":{"start":[12,1],"end":[14,2],"bytes":[284,357]},"callables":{},"fields":{"color":{"name":"color","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color","kind":"field","span":{"start":[13,3],"end":[13,26],"bytes":[332,355]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]}},"functions":{},"fields":{}},"src/main.ts":{"source":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */\nimport { a } from \"./chain\";\nimport { bump, readCounter } from \"./state\";\n\nexport function main(): number {\n bump(3);\n const r = a(readCounter());\n return r;\n}\n","imports":[{"module":"./chain","name":"a","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":29},{"module":"./state","name":"bump","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45},{"module":"./state","name":"readCounter","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45}],"exports":[],"comments":[{"content":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":81}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/main.ts","kind":"module","span":{"start":[1,1],"end":[10,1],"bytes":[0,244]},"types":{},"functions":{"main":{"name":"main","signature":"src/main.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/main.ts/main","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]},"body":{"6:3":{"method_name":"bump","argument_types":["3"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[6,3],"end":[6,10],"bytes":[191,198]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"7:13":{"method_name":"a","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,13],"end":[7,29],"bytes":[212,228]},"callee":"can://typescript/dataflow-app/src/chain.ts/a"},"7:15":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,15],"end":[7,28],"bytes":[214,227]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"}}}},"fields":{}},"src/state.ts":{"source":"/** Module-level global state: written in one function, read in another. */\n\nexport let counter = 0;\n\nexport function bump(by: number): void {\n counter = counter + by; // global write\n}\n\nexport function readCounter(): number {\n return counter; // global read that flows to the return value\n}\n\nexport function churn(by: number): number {\n bump(by); // transitive global write lands on this callsite node\n return readCounter(); // transitive global read\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Module-level global state: written in one function, read in another. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":76}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/state.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,458]},"types":{},"functions":{"bump":{"name":"bump","signature":"src/state.bump","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":5,"end_line":5,"start_column":22,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/bump","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]},"body":{}},"readCounter":{"name":"readCounter","signature":"src/state.readCounter","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/readCounter","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]},"body":{}},"churn":{"name":"churn","signature":"src/state.churn","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":33}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/churn","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]},"body":{"14:3":{"method_name":"bump","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,11],"bytes":[341,349]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"15:10":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,23],"bytes":[415,428]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"}}}},"fields":{"counter":{"name":"counter","type":"number","initializer":"0","scope":"module","declaration_kind":"let","is_readonly":false,"is_exported":true,"id":"can://typescript/dataflow-app/src/state.ts/counter","kind":"field","span":{"start":[3,12],"end":[3,23],"bytes":[88,99]}}}},"src/susp.ts":{"source":"/** Suspension points (await/yield) and intra-statement expression control flow. */\n\nexport async function compute(x: number): Promise {\n return x * 2;\n}\n\nexport async function fetchTotal(x: number): Promise {\n const a = await compute(x); // await_resume edge out of this statement\n return a + 1;\n}\n\nexport function* numbers(n: number): Generator {\n let i = 0;\n while (i < n) {\n yield i; // yield (suspend/resume) edge\n i = i + 1;\n }\n return n;\n}\n\nexport function shortCircuit(a: { f?: number } | null, b: number): number {\n const v = (a && a.f) || b; // short-circuit stays intra-statement (documented rule)\n const w = a?.f ?? b; // optional chaining likewise\n return v + w;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Suspension points (await/yield) and intra-statement expression control flow. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/susp.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,735]},"types":{},"functions":{"compute":{"name":"compute","signature":"src/susp.compute","comments":[{"content":"Suspension points (await/yield) and intra-statement expression control flow.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":31,"end_column":40}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/compute","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]},"body":{}},"fetchTotal":{"name":"fetchTotal","signature":"src/susp.fetchTotal","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":34,"end_column":43}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]},"body":{"8:19":{"method_name":"compute","argument_types":["number"],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,19],"end":[8,29],"bytes":[245,255]},"callee":"can://typescript/dataflow-app/src/susp.ts/compute"}}},"numbers":{"name":"numbers","signature":"src/susp.numbers","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"Generator","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":true,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/numbers","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]},"body":{}},"shortCircuit":{"name":"shortCircuit","signature":"src/susp.shortCircuit","comments":[],"decorators":[],"parameters":[{"name":"a","type":"{ f?: number } | null","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":30,"end_column":54},{"name":"b","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":56,"end_column":65}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":4,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/shortCircuit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]},"body":{}}},"fields":{}},"src/taint.ts":{"source":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */\n\nexport function source(): string {\n return \"user-input\";\n}\n\nexport function sanitize(s: string): string {\n return s.replace(/dangerous/g, \"\");\n}\n\nexport function sink(s: string): void {\n void s;\n}\n\nexport function unsafeFlow(): void {\n const s = source();\n sink(s);\n}\n\nexport function safeFlow(): void {\n const s = sanitize(source());\n sink(s);\n}\n","imports":[],"exports":[],"comments":[{"content":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/taint.ts","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,536]},"types":{},"functions":{"source":{"name":"source","signature":"src/taint.source","comments":[{"content":"Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n(issue #2 PR E); the fixture carries the flows now so that PR only adds the query.","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/source","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]},"body":{}},"sanitize":{"name":"sanitize","signature":"src/taint.sanitize","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sanitize","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]},"body":{"11:10":{"method_name":"replace","receiver_expr":"s","receiver_type":"string","argument_types":["RegExp","\"\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[11,10],"end":[11,37],"bytes":[298,325]},"callee":"can://typescript/dataflow-app/@external/(builtin)/replace"}}},"sink":{"name":"sink","signature":"src/taint.sink","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":22,"end_column":31}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sink","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]},"body":{}},"unsafeFlow":{"name":"unsafeFlow","signature":"src/taint.unsafeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]},"body":{"19:13":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,13],"end":[19,21],"bytes":[432,440]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"20:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,3],"end":[20,10],"bytes":[444,451]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"}}},"safeFlow":{"name":"safeFlow","signature":"src/taint.safeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/safeFlow","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]},"body":{"24:13":{"method_name":"sanitize","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,13],"end":[24,31],"bytes":[503,521]},"callee":"can://typescript/dataflow-app/src/taint.ts/sanitize"},"24:22":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,22],"end":[24,30],"bytes":[512,520]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"25:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,3],"end":[25,10],"bytes":[525,532]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"}}}},"fields":{}},"src/util.ts":{"source":"export function increment(v: number): number {\n return v + 1;\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[4,1],"bytes":[0,65]},"types":{},"functions":{"increment":{"name":"increment","signature":"src/util.increment","comments":[],"decorators":[],"parameters":[{"name":"v","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":1,"end_line":1,"start_column":27,"end_column":36}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/util.ts/increment","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]},"body":{}}},"fields":{}}},"call_graph":[{"src":"can://typescript/dataflow-app/src/chain.ts/b","dst":"can://typescript/dataflow-app/src/chain.ts/c","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/a","dst":"can://typescript/dataflow-app/src/chain.ts/b","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","dst":"can://typescript/dataflow-app/src/util.ts/increment","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd","dst":"can://typescript/dataflow-app/src/chain.ts/isEven","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/parse","dst":"can://typescript/dataflow-app/@external/(builtin)/isNaN","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/parse","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/shadow","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/chain.ts/a","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","dst":"can://typescript/dataflow-app/src/susp.ts/compute","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/sanitize","dst":"can://typescript/dataflow-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sanitize","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2}],"param_in":[],"param_out":[],"external_symbols":{"can://typescript/dataflow-app/@external/(builtin)/isNaN":{"id":"can://typescript/dataflow-app/@external/(builtin)/isNaN","kind":"external","module":"(builtin)","name":"isNaN"},"can://typescript/dataflow-app/@external/(builtin)/replace":{"id":"can://typescript/dataflow-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"}},"synthesized_callables":{}}} \ No newline at end of file diff --git a/test/goldens/dataflow-app-a3.json b/test/goldens/dataflow-app-a3.json new file mode 100644 index 0000000..62ceaf7 --- /dev/null +++ b/test/goldens/dataflow-app-a3.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/dataflow-app","kind":"application","symbol_table":{"src/chain.ts":{"source":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */\nimport { increment } from \"./util\";\n\nexport function c(z: number): number {\n return z + 1; // the parameter flows to the return value\n}\n\nexport function b(y: number): number {\n const fromC = c(y);\n return fromC;\n}\n\nexport function a(x: number): number {\n const fromB = b(x); // SUMMARY edge here: arg0 flows through b (and c) to the result\n return fromB;\n}\n\nexport function viaOtherFile(x: number): number {\n return increment(x); // cross-module CALL / PARAM_IN / PARAM_OUT edges\n}\n\nexport function isEven(n: number): boolean {\n if (n === 0) return true;\n return isOdd(n - 1); // mutual recursion: {isEven, isOdd} form an SCC\n}\n\nexport function isOdd(n: number): boolean {\n if (n === 0) return false;\n return isEven(n - 1);\n}\n","imports":[{"module":"./util","name":"increment","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":36}],"exports":[],"comments":[{"content":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/chain.ts","kind":"module","span":{"start":[1,1],"end":[31,1],"bytes":[0,824]},"types":{},"functions":{"c":{"name":"c","signature":"src/chain.c","comments":[],"decorators":[],"parameters":[{"name":"z","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/c","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,16],"bytes":[166,179]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]}}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"z","prov":["reaching-defs"]}]},"b":{"name":"b","signature":"src/chain.b","comments":[],"decorators":[],"parameters":[{"name":"y","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/b","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]},"body":{"9:17":{"method_name":"c","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,17],"end":[9,21],"bytes":[281,285]},"callee":"can://typescript/dataflow-app/src/chain.ts/c"},"@entry":{"kind":"entry","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,22],"bytes":[267,286]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,16],"bytes":[289,302]}},"@exit":{"kind":"exit","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]}}},"cfg":[{"src":"@entry","dst":"9:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"10:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"9:3"},{"src":"9:3","dst":"10:3"}],"ddg":[{"src":"@entry","dst":"9:3","var":"y","prov":["reaching-defs"]},{"src":"9:3","dst":"10:3","var":"fromC","prov":["reaching-defs"]}]},"a":{"name":"a","signature":"src/chain.a","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/a","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]},"body":{"14:17":{"method_name":"b","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,17],"end":[14,21],"bytes":[361,365]},"callee":"can://typescript/dataflow-app/src/chain.ts/b"},"@entry":{"kind":"entry","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,22],"bytes":[347,366]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,16],"bytes":[434,447]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]}}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"14:3","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"x","prov":["reaching-defs"]},{"src":"14:3","dst":"15:3","var":"fromB","prov":["reaching-defs"]}]},"viaOtherFile":{"name":"viaOtherFile","signature":"src/chain.viaOtherFile","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":18,"end_line":18,"start_column":30,"end_column":39}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]},"body":{"19:10":{"method_name":"increment","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,10],"end":[19,22],"bytes":[510,522]},"callee":"can://typescript/dataflow-app/src/util.ts/increment"},"@entry":{"kind":"entry","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,23],"bytes":[503,523]}},"@exit":{"kind":"exit","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]}}},"cfg":[{"src":"@entry","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"19:3"}],"ddg":[{"src":"@entry","dst":"19:3","var":"x","prov":["reaching-defs"]}]},"isEven":{"name":"isEven","signature":"src/chain.isEven","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":22,"end_line":22,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isEven","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]},"body":{"24:10":{"method_name":"isOdd","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,10],"end":[24,22],"bytes":[659,671]},"callee":"can://typescript/dataflow-app/src/chain.ts/isOdd"},"@entry":{"kind":"entry","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]}},"23:3":{"kind":"statement","span":{"start":[23,3],"end":[23,28],"bytes":[624,649]}},"23:16":{"kind":"statement","span":{"start":[23,16],"end":[23,28],"bytes":[637,649]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,23],"bytes":[652,672]}},"@exit":{"kind":"exit","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]}}},"cfg":[{"src":"@entry","dst":"23:3","kind":"fallthrough"},{"src":"23:16","dst":"@exit","kind":"return"},{"src":"23:3","dst":"23:16","kind":"true"},{"src":"23:3","dst":"24:3","kind":"false"},{"src":"24:3","dst":"@exit","kind":"exception"},{"src":"24:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"23:3"},{"src":"23:3","dst":"23:16"},{"src":"23:3","dst":"24:3"}],"ddg":[{"src":"@entry","dst":"23:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"24:3","var":"n","prov":["reaching-defs"]}]},"isOdd":{"name":"isOdd","signature":"src/chain.isOdd","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":27,"end_line":27,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isOdd","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]},"body":{"29:10":{"method_name":"isEven","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,10],"end":[29,23],"bytes":[807,820]},"callee":"can://typescript/dataflow-app/src/chain.ts/isEven"},"@entry":{"kind":"entry","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]}},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,29],"bytes":[771,797]}},"28:16":{"kind":"statement","span":{"start":[28,16],"end":[28,29],"bytes":[784,797]}},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[29,24],"bytes":[800,821]}},"@exit":{"kind":"exit","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]}}},"cfg":[{"src":"@entry","dst":"28:3","kind":"fallthrough"},{"src":"28:16","dst":"@exit","kind":"return"},{"src":"28:3","dst":"28:16","kind":"true"},{"src":"28:3","dst":"29:3","kind":"false"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"28:3"},{"src":"28:3","dst":"28:16"},{"src":"28:3","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"28:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"29:3","var":"n","prov":["reaching-defs"]}]}},"fields":{}},"src/closures.ts":{"source":"/** Closure capture and copy aliasing. */\n\nexport function makeCounter(start: number): () => number {\n let count = start;\n const inc = (): number => {\n count = count + 1; // writes the captured local\n return count;\n };\n return inc;\n}\n\nexport function useAlias(): number {\n const p = { f: 1 };\n const q = p; // q and p alias the same object\n q.f = 42; // write through q ...\n return p.f; // ... must reach this read through p\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Closure capture and copy aliasing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/closures.ts","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,441]},"types":{},"functions":{"makeCounter":{"name":"makeCounter","signature":"src/closures.makeCounter","comments":[{"content":"Closure capture and copy aliasing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"decorators":[],"parameters":[{"name":"start","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":29,"end_column":42}],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,21],"bytes":[104,122]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[8,5],"bytes":[125,227]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,14],"bytes":[230,241]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]}}},"callables":{"inc":{"name":"inc","signature":"src/closures.makeCounter.inc","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter/inc","span":{"start":[5,9],"end":[8,4],"bytes":[131,226]},"body":{"@entry":{"kind":"entry","span":{"start":[5,15],"end":[8,4],"bytes":[137,226]}},"6:5":{"kind":"statement","span":{"start":[6,5],"end":[6,23],"bytes":[157,175]}},"7:5":{"kind":"statement","span":{"start":[7,5],"end":[7,18],"bytes":[209,222]}},"@exit":{"kind":"exit","span":{"start":[5,15],"end":[8,4],"bytes":[137,226]}}},"cfg":[{"src":"@entry","dst":"6:5","kind":"fallthrough"},{"src":"6:5","dst":"7:5","kind":"fallthrough"},{"src":"7:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"6:5"},{"src":"@entry","dst":"7:5"}],"ddg":[{"src":"@entry","dst":"6:5","var":"count","prov":["reaching-defs"]},{"src":"@entry","dst":"7:5","var":"count","prov":["reaching-defs"]},{"src":"6:5","dst":"7:5","var":"count","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"4:3","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:3"},{"src":"@entry","dst":"5:3"},{"src":"@entry","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"4:3","var":"start","prov":["reaching-defs"]},{"src":"4:3","dst":"5:3","var":"count","prov":["reaching-defs"]},{"src":"5:3","dst":"9:3","var":"inc","prov":["reaching-defs"]}]},"useAlias":{"name":"useAlias","signature":"src/closures.useAlias","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/useAlias","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]},"body":{"@entry":{"kind":"entry","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,22],"bytes":[284,303]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,15],"bytes":[306,318]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,12],"bytes":[354,363]}},"16:3":{"kind":"statement","span":{"start":[16,3],"end":[16,14],"bytes":[389,400]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]}}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"},{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"15:3"},{"src":"@entry","dst":"16:3"}],"ddg":[{"src":"13:3","dst":"14:3","var":"p","prov":["reaching-defs"]},{"src":"14:3","dst":"16:3","var":"p.f","prov":["reaching-defs"]},{"src":"15:3","dst":"16:3","var":"p.f","prov":["reaching-defs"]}]}},"fields":{}},"src/flow.ts":{"source":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */\n\nexport function classify(n: number): string {\n let label = \"none\";\n if (n > 0) {\n label = \"pos\";\n } else {\n label = \"neg\";\n }\n return label;\n}\n\nexport function sumTo(n: number): number {\n let acc = 0;\n for (let i = 0; i < n; i++) {\n acc = acc + i; // loop-carried dependency: acc feeds itself around the back edge\n }\n return acc;\n}\n\nexport function early(n: number): number {\n if (n < 0) {\n return -1; // early return (multi-exit normalization)\n }\n const r = n * 2;\n return r;\n}\n\nexport function parse(s: string): number {\n const v = Number(s);\n if (Number.isNaN(v)) {\n throw new Error(`bad input: ${s}`);\n }\n return v;\n}\n\nexport function guarded(s: string): number {\n let out = 0;\n try {\n out = parse(s); // may throw → exception edge into the catch node\n } catch (e) {\n out = -1;\n } finally {\n touch(out);\n }\n return out;\n}\n\nexport function touch(x: number): void {\n void x;\n}\n\nexport function pickDay(d: number): string {\n let name = \"\";\n switch (d) {\n case 0:\n name = \"sun\";\n break;\n case 6:\n name = \"sat\";\n break;\n default:\n name = \"weekday\";\n }\n return name;\n}\n\nexport function spin(): number {\n let ticks = 0;\n while (true) {\n ticks = ticks + 1; // infinite loop: the dead loop-exit edge keeps EXIT reachable\n if (ticks > 3) {\n break;\n }\n }\n return ticks;\n}\n\nexport function shadow(): number {\n const x = 1;\n {\n const x = 2; // shadows the outer x — must NOT leak DDG edges across scopes\n touch(x);\n }\n return x;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/flow.ts","kind":"module","span":{"start":[1,1],"end":[87,1],"bytes":[0,1634]},"types":{},"functions":{"classify":{"name":"classify","signature":"src/flow.classify","comments":[{"content":"Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/classify","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,22],"bytes":[146,165]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[9,4],"bytes":[168,233]}},"6:5":{"kind":"statement","span":{"start":[6,5],"end":[6,19],"bytes":[185,199]}},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,19],"bytes":[215,229]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,16],"bytes":[236,249]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]}}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"},{"src":"4:3","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"6:5","kind":"true"},{"src":"5:3","dst":"8:5","kind":"false"},{"src":"6:5","dst":"10:3","kind":"fallthrough"},{"src":"8:5","dst":"10:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"10:3"},{"src":"@entry","dst":"4:3"},{"src":"@entry","dst":"5:3"},{"src":"5:3","dst":"6:5"},{"src":"5:3","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"5:3","var":"n","prov":["reaching-defs"]},{"src":"6:5","dst":"10:3","var":"label","prov":["reaching-defs"]},{"src":"8:5","dst":"10:3","var":"label","prov":["reaching-defs"]}]},"sumTo":{"name":"sumTo","signature":"src/flow.sumTo","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/sumTo","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]},"body":{"@entry":{"kind":"entry","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,15],"bytes":[298,310]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[17,4],"bytes":[313,431]}},"16:5":{"kind":"statement","span":{"start":[16,5],"end":[16,19],"bytes":[347,361]}},"18:3":{"kind":"statement","span":{"start":[18,3],"end":[18,14],"bytes":[434,445]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]}}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"16:5","kind":"true"},{"src":"15:3","dst":"18:3","kind":"false"},{"src":"16:5","dst":"15:3","kind":"loop_back"},{"src":"18:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"15:3"},{"src":"@entry","dst":"18:3"},{"src":"15:3","dst":"16:5"}],"ddg":[{"src":"@entry","dst":"15:3","var":"n","prov":["reaching-defs"]},{"src":"14:3","dst":"16:5","var":"acc","prov":["reaching-defs"]},{"src":"14:3","dst":"18:3","var":"acc","prov":["reaching-defs"]},{"src":"15:3","dst":"15:3","var":"i","prov":["reaching-defs"]},{"src":"15:3","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"16:5","var":"acc","prov":["reaching-defs"]},{"src":"16:5","dst":"18:3","var":"acc","prov":["reaching-defs"]}]},"early":{"name":"early","signature":"src/flow.early","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/early","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]},"body":{"@entry":{"kind":"entry","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]}},"22:3":{"kind":"statement","span":{"start":[22,3],"end":[24,4],"bytes":[494,568]}},"23:5":{"kind":"statement","span":{"start":[23,5],"end":[23,15],"bytes":[511,521]}},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[25,19],"bytes":[571,587]}},"26:3":{"kind":"statement","span":{"start":[26,3],"end":[26,12],"bytes":[590,599]}},"@exit":{"kind":"exit","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]}}},"cfg":[{"src":"@entry","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"23:5","kind":"true"},{"src":"22:3","dst":"25:3","kind":"false"},{"src":"23:5","dst":"@exit","kind":"return"},{"src":"25:3","dst":"26:3","kind":"fallthrough"},{"src":"26:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"22:3"},{"src":"22:3","dst":"23:5"},{"src":"22:3","dst":"25:3"},{"src":"22:3","dst":"26:3"}],"ddg":[{"src":"@entry","dst":"22:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"25:3","var":"n","prov":["reaching-defs"]},{"src":"25:3","dst":"26:3","var":"r","prov":["reaching-defs"]}]},"parse":{"name":"parse","signature":"src/flow.parse","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":29,"end_line":29,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/parse","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]},"body":{"30:13":{"method_name":"Number","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,13],"end":[30,22],"bytes":[658,667]},"callee":null},"31:7":{"method_name":"isNaN","receiver_expr":"Number","receiver_type":"NumberConstructor","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,7],"end":[31,22],"bytes":[675,690]},"callee":"can://typescript/dataflow-app/@external/(builtin)/isNaN"},"32:11":{"method_name":"Error","argument_types":["string"],"type_arguments":[],"return_type":"Error","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[32,11],"end":[32,39],"bytes":[704,732]},"callee":null},"@entry":{"kind":"entry","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]}},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,23],"bytes":[648,668]}},"31:3":{"kind":"statement","span":{"start":[31,3],"end":[33,4],"bytes":[671,737]}},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,40],"bytes":[698,733]}},"34:3":{"kind":"statement","span":{"start":[34,3],"end":[34,12],"bytes":[740,749]}},"@exit":{"kind":"exit","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]}}},"cfg":[{"src":"@entry","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"exception"},{"src":"30:3","dst":"31:3","kind":"fallthrough"},{"src":"31:3","dst":"@exit","kind":"exception"},{"src":"31:3","dst":"32:5","kind":"true"},{"src":"31:3","dst":"34:3","kind":"false"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"34:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"30:3"},{"src":"30:3","dst":"31:3"},{"src":"31:3","dst":"32:5"},{"src":"31:3","dst":"34:3"}],"ddg":[{"src":"@entry","dst":"30:3","var":"s","prov":["reaching-defs"]},{"src":"@entry","dst":"32:5","var":"s","prov":["reaching-defs"]},{"src":"30:3","dst":"31:3","var":"v","prov":["reaching-defs"]},{"src":"30:3","dst":"34:3","var":"v","prov":["reaching-defs"]}]},"guarded":{"name":"guarded","signature":"src/flow.guarded","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/guarded","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]},"body":{"40:11":{"method_name":"parse","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,11],"end":[40,19],"bytes":[831,839]},"callee":"can://typescript/dataflow-app/src/flow.ts/parse"},"44:5":{"method_name":"touch","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[44,5],"end":[44,15],"bytes":[939,949]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"},"@entry":{"kind":"entry","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]}},"38:3":{"kind":"statement","span":{"start":[38,3],"end":[38,15],"bytes":[800,812]}},"40:5":{"kind":"statement","span":{"start":[40,5],"end":[40,20],"bytes":[825,840]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[43,4],"bytes":[895,924]}},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[42,14],"bytes":[911,920]}},"46:3":{"kind":"statement","span":{"start":[46,3],"end":[46,14],"bytes":[957,968]}},"@exit":{"kind":"exit","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]}}},"cfg":[{"src":"@entry","dst":"38:3","kind":"fallthrough"},{"src":"38:3","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"41:5","kind":"exception"},{"src":"40:5","dst":"44:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"44:5","kind":"fallthrough"},{"src":"44:5","dst":"@exit","kind":"exception"},{"src":"44:5","dst":"46:3","kind":"fallthrough"},{"src":"46:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"38:3"},{"src":"@entry","dst":"40:5"},{"src":"@entry","dst":"44:5"},{"src":"40:5","dst":"41:5"},{"src":"40:5","dst":"42:5"},{"src":"44:5","dst":"46:3"}],"ddg":[{"src":"@entry","dst":"40:5","var":"s","prov":["reaching-defs"]},{"src":"40:5","dst":"44:5","var":"out","prov":["reaching-defs"]},{"src":"40:5","dst":"46:3","var":"out","prov":["reaching-defs"]},{"src":"42:5","dst":"44:5","var":"out","prov":["reaching-defs"]},{"src":"42:5","dst":"46:3","var":"out","prov":["reaching-defs"]}]},"touch":{"name":"touch","signature":"src/flow.touch","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":49,"end_line":49,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/touch","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]},"body":{"@entry":{"kind":"entry","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]}},"50:3":{"kind":"statement","span":{"start":[50,3],"end":[50,10],"bytes":[1015,1022]}},"@exit":{"kind":"exit","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]}}},"cfg":[{"src":"@entry","dst":"50:3","kind":"fallthrough"},{"src":"50:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"50:3"}],"ddg":[{"src":"@entry","dst":"50:3","var":"x","prov":["reaching-defs"]}]},"pickDay":{"name":"pickDay","signature":"src/flow.pickDay","comments":[],"decorators":[],"parameters":[{"name":"d","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":53,"end_line":53,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/pickDay","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]},"body":{"@entry":{"kind":"entry","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]}},"54:3":{"kind":"statement","span":{"start":[54,3],"end":[54,17],"bytes":[1073,1087]}},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[64,4],"bytes":[1090,1233]}},"57:7":{"kind":"statement","span":{"start":[57,7],"end":[57,20],"bytes":[1121,1134]}},"58:7":{"kind":"statement","span":{"start":[58,7],"end":[58,13],"bytes":[1141,1147]}},"60:7":{"kind":"statement","span":{"start":[60,7],"end":[60,20],"bytes":[1166,1179]}},"61:7":{"kind":"statement","span":{"start":[61,7],"end":[61,13],"bytes":[1186,1192]}},"63:7":{"kind":"statement","span":{"start":[63,7],"end":[63,24],"bytes":[1212,1229]}},"65:3":{"kind":"statement","span":{"start":[65,3],"end":[65,15],"bytes":[1236,1248]}},"@exit":{"kind":"exit","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]}}},"cfg":[{"src":"@entry","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"57:7","kind":"switch_case"},{"src":"55:3","dst":"60:7","kind":"switch_case"},{"src":"55:3","dst":"63:7","kind":"switch_case"},{"src":"57:7","dst":"58:7","kind":"fallthrough"},{"src":"58:7","dst":"65:3","kind":"break"},{"src":"60:7","dst":"61:7","kind":"fallthrough"},{"src":"61:7","dst":"65:3","kind":"break"},{"src":"63:7","dst":"65:3","kind":"fallthrough"},{"src":"65:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"54:3"},{"src":"@entry","dst":"55:3"},{"src":"@entry","dst":"65:3"},{"src":"55:3","dst":"57:7"},{"src":"55:3","dst":"58:7"},{"src":"55:3","dst":"60:7"},{"src":"55:3","dst":"61:7"},{"src":"55:3","dst":"63:7"}],"ddg":[{"src":"@entry","dst":"55:3","var":"d","prov":["reaching-defs"]},{"src":"57:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"60:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"63:7","dst":"65:3","var":"name","prov":["reaching-defs"]}]},"spin":{"name":"spin","signature":"src/flow.spin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/spin","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]},"body":{"@entry":{"kind":"entry","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]}},"69:3":{"kind":"statement","span":{"start":[69,3],"end":[69,17],"bytes":[1287,1301]}},"70:3":{"kind":"statement","span":{"start":[70,3],"end":[75,4],"bytes":[1304,1448]}},"71:5":{"kind":"statement","span":{"start":[71,5],"end":[71,23],"bytes":[1323,1341]}},"72:5":{"kind":"statement","span":{"start":[72,5],"end":[74,6],"bytes":[1409,1444]}},"73:7":{"kind":"statement","span":{"start":[73,7],"end":[73,13],"bytes":[1432,1438]}},"76:3":{"kind":"statement","span":{"start":[76,3],"end":[76,16],"bytes":[1451,1464]}},"@exit":{"kind":"exit","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]}}},"cfg":[{"src":"@entry","dst":"69:3","kind":"fallthrough"},{"src":"69:3","dst":"70:3","kind":"fallthrough"},{"src":"70:3","dst":"71:5","kind":"true"},{"src":"70:3","dst":"76:3","kind":"false"},{"src":"71:5","dst":"72:5","kind":"fallthrough"},{"src":"72:5","dst":"70:3","kind":"loop_back"},{"src":"72:5","dst":"73:7","kind":"true"},{"src":"73:7","dst":"76:3","kind":"break"},{"src":"76:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"69:3"},{"src":"@entry","dst":"70:3"},{"src":"@entry","dst":"76:3"},{"src":"70:3","dst":"71:5"},{"src":"70:3","dst":"72:5"},{"src":"72:5","dst":"70:3"},{"src":"72:5","dst":"73:7"}],"ddg":[{"src":"69:3","dst":"71:5","var":"ticks","prov":["reaching-defs"]},{"src":"69:3","dst":"76:3","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"71:5","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"72:5","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"76:3","var":"ticks","prov":["reaching-defs"]}]},"shadow":{"name":"shadow","signature":"src/flow.shadow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/shadow","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]},"body":{"83:5":{"method_name":"touch","argument_types":["2"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[83,5],"end":[83,13],"bytes":[1606,1614]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"},"@entry":{"kind":"entry","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]}},"80:3":{"kind":"statement","span":{"start":[80,3],"end":[80,15],"bytes":[1505,1517]}},"82:5":{"kind":"statement","span":{"start":[82,5],"end":[82,17],"bytes":[1526,1538]}},"85:3":{"kind":"statement","span":{"start":[85,3],"end":[85,12],"bytes":[1622,1631]}},"@exit":{"kind":"exit","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]}}},"cfg":[{"src":"@entry","dst":"80:3","kind":"fallthrough"},{"src":"80:3","dst":"82:5","kind":"fallthrough"},{"src":"82:5","dst":"83:5","kind":"fallthrough"},{"src":"83:5","dst":"@exit","kind":"exception"},{"src":"83:5","dst":"85:3","kind":"fallthrough"},{"src":"85:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"80:3"},{"src":"@entry","dst":"82:5"},{"src":"@entry","dst":"83:5"},{"src":"83:5","dst":"85:3"}],"ddg":[{"src":"80:3","dst":"85:3","var":"x","prov":["reaching-defs"]},{"src":"82:5","dst":"83:5","var":"x","prov":["reaching-defs"]}]}},"fields":{}},"src/hierarchy.ts":{"source":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */\n\nexport interface Shape {\n area(): number;\n}\n\nexport interface Labeled {\n readonly label: string;\n}\n\nexport interface ColoredShape extends Shape {\n readonly color: string;\n}\n\nexport class Rectangle implements Shape {\n constructor(\n protected readonly width: number,\n protected readonly height: number,\n ) {}\n\n area(): number {\n return this.width * this.height;\n }\n}\n\nexport class Square extends Rectangle implements Labeled {\n readonly label = \"square\";\n\n constructor(side: number) {\n super(side, side);\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts","kind":"module","span":{"start":[1,1],"end":[34,1],"bytes":[0,712]},"types":{"Rectangle":{"name":"Rectangle","signature":"src/hierarchy.Rectangle","comments":[],"decorators":[],"base_classes":["src/hierarchy.Shape"],"implements_types":["src/hierarchy.Shape"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle","kind":"class","span":{"start":[16,1],"end":[25,2],"bytes":[359,562]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Rectangle.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]},"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]}},"23:5":{"kind":"statement","span":{"start":[23,5],"end":[23,37],"bytes":[524,556]}},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]}}},"cfg":[{"src":"@entry","dst":"23:5","kind":"fallthrough"},{"src":"23:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"23:5"}],"ddg":[{"src":"@entry","dst":"23:5","var":"this.height","prov":["reaching-defs"]},{"src":"@entry","dst":"23:5","var":"this.width","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/hierarchy.Rectangle.constructor","comments":[],"decorators":[],"parameters":[{"name":"width","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":18,"end_line":18,"start_column":5,"end_column":37},{"name":"height","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":19,"end_line":19,"start_column":5,"end_column":38}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]},"body":{"@entry":{"kind":"entry","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]}},"@exit":{"kind":"exit","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"width":{"name":"width","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width","kind":"field"},"height":{"name":"height","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height","kind":"field"}},"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]},"Square":{"name":"Square","signature":"src/hierarchy.Square","comments":[],"decorators":[],"base_classes":["src/hierarchy.Rectangle","src/hierarchy.Labeled"],"implements_types":["src/hierarchy.Labeled"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square","kind":"class","span":{"start":[27,1],"end":[33,2],"bytes":[564,711]},"callables":{"constructor":{"name":"constructor","signature":"src/hierarchy.Square.constructor","comments":[],"decorators":[],"parameters":[{"name":"side","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":30,"end_line":30,"start_column":15,"end_column":27}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]},"body":{"31:5":{"method_name":"super","argument_types":["number","number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,22],"bytes":[687,704]},"callee":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor"},"@entry":{"kind":"entry","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]}},"@exit":{"kind":"exit","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]}}},"cfg":[{"src":"@entry","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"31:5"}],"ddg":[{"src":"@entry","dst":"31:5","var":"side","prov":["reaching-defs"]}]}},"fields":{"label":{"name":"label","type":"\"square\"","comments":[],"decorators":[],"initializer":"\"square\"","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/label","kind":"field","span":{"start":[28,3],"end":[28,29],"bytes":[625,651]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Rectangle"],"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Labeled"]},"Shape":{"name":"Shape","signature":"src/hierarchy.Shape","comments":[{"content":"A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\nprojection, including interface→interface EXTENDS (`ColoredShape extends Shape`).","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape","kind":"interface","span":{"start":[4,1],"end":[6,2],"bytes":[182,226]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Shape.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape/area","span":{"start":[5,3],"end":[5,18],"bytes":[209,224]},"body":{}}},"fields":{}},"Labeled":{"name":"Labeled","signature":"src/hierarchy.Labeled","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled","kind":"interface","span":{"start":[8,1],"end":[10,2],"bytes":[228,282]},"callables":{},"fields":{"label":{"name":"label","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label","kind":"field","span":{"start":[9,3],"end":[9,26],"bytes":[257,280]}}}},"ColoredShape":{"name":"ColoredShape","signature":"src/hierarchy.ColoredShape","comments":[],"base_classes":["src/hierarchy.Shape"],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape","kind":"interface","span":{"start":[12,1],"end":[14,2],"bytes":[284,357]},"callables":{},"fields":{"color":{"name":"color","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color","kind":"field","span":{"start":[13,3],"end":[13,26],"bytes":[332,355]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]}},"functions":{},"fields":{}},"src/main.ts":{"source":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */\nimport { a } from \"./chain\";\nimport { bump, readCounter } from \"./state\";\n\nexport function main(): number {\n bump(3);\n const r = a(readCounter());\n return r;\n}\n","imports":[{"module":"./chain","name":"a","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":29},{"module":"./state","name":"bump","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45},{"module":"./state","name":"readCounter","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45}],"exports":[],"comments":[{"content":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":81}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/main.ts","kind":"module","span":{"start":[1,1],"end":[10,1],"bytes":[0,244]},"types":{},"functions":{"main":{"name":"main","signature":"src/main.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/main.ts/main","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]},"body":{"6:3":{"method_name":"bump","argument_types":["3"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[6,3],"end":[6,10],"bytes":[191,198]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"7:13":{"method_name":"a","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,13],"end":[7,29],"bytes":[212,228]},"callee":"can://typescript/dataflow-app/src/chain.ts/a"},"7:15":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,15],"end":[7,28],"bytes":[214,227]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"},"@entry":{"kind":"entry","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,30],"bytes":[202,229]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,12],"bytes":[232,241]}},"@exit":{"kind":"exit","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]}}},"cfg":[{"src":"@entry","dst":"6:3","kind":"fallthrough"},{"src":"6:3","dst":"@exit","kind":"exception"},{"src":"6:3","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"6:3"},{"src":"6:3","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"6:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"@entry","dst":"7:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"6:3","dst":"7:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"r","prov":["reaching-defs"]}]}},"fields":{}},"src/state.ts":{"source":"/** Module-level global state: written in one function, read in another. */\n\nexport let counter = 0;\n\nexport function bump(by: number): void {\n counter = counter + by; // global write\n}\n\nexport function readCounter(): number {\n return counter; // global read that flows to the return value\n}\n\nexport function churn(by: number): number {\n bump(by); // transitive global write lands on this callsite node\n return readCounter(); // transitive global read\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Module-level global state: written in one function, read in another. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":76}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/state.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,458]},"types":{},"functions":{"bump":{"name":"bump","signature":"src/state.bump","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":5,"end_line":5,"start_column":22,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/bump","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]},"body":{"@entry":{"kind":"entry","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]}},"6:3":{"kind":"statement","span":{"start":[6,3],"end":[6,26],"bytes":[145,168]}},"@exit":{"kind":"exit","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]}}},"cfg":[{"src":"@entry","dst":"6:3","kind":"fallthrough"},{"src":"6:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"6:3"}],"ddg":[{"src":"@entry","dst":"6:3","var":"by","prov":["reaching-defs"]},{"src":"@entry","dst":"6:3","var":"src/state.counter","prov":["reaching-defs"]}]},"readCounter":{"name":"readCounter","signature":"src/state.readCounter","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/readCounter","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]},"body":{"@entry":{"kind":"entry","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,18],"bytes":[230,245]}},"@exit":{"kind":"exit","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]}}},"cfg":[{"src":"@entry","dst":"10:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"10:3"}],"ddg":[{"src":"@entry","dst":"10:3","var":"src/state.counter","prov":["reaching-defs"]}]},"churn":{"name":"churn","signature":"src/state.churn","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":33}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/churn","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]},"body":{"14:3":{"method_name":"bump","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,11],"bytes":[341,349]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"15:10":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,23],"bytes":[415,428]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"},"@entry":{"kind":"entry","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,24],"bytes":[408,429]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]}}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"14:3","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"by","prov":["reaching-defs"]},{"src":"@entry","dst":"14:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"@entry","dst":"15:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"14:3","dst":"15:3","var":"src/state.counter","prov":["reaching-defs"]}]}},"fields":{"counter":{"name":"counter","type":"number","initializer":"0","scope":"module","declaration_kind":"let","is_readonly":false,"is_exported":true,"id":"can://typescript/dataflow-app/src/state.ts/counter","kind":"field","span":{"start":[3,12],"end":[3,23],"bytes":[88,99]}}}},"src/susp.ts":{"source":"/** Suspension points (await/yield) and intra-statement expression control flow. */\n\nexport async function compute(x: number): Promise {\n return x * 2;\n}\n\nexport async function fetchTotal(x: number): Promise {\n const a = await compute(x); // await_resume edge out of this statement\n return a + 1;\n}\n\nexport function* numbers(n: number): Generator {\n let i = 0;\n while (i < n) {\n yield i; // yield (suspend/resume) edge\n i = i + 1;\n }\n return n;\n}\n\nexport function shortCircuit(a: { f?: number } | null, b: number): number {\n const v = (a && a.f) || b; // short-circuit stays intra-statement (documented rule)\n const w = a?.f ?? b; // optional chaining likewise\n return v + w;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Suspension points (await/yield) and intra-statement expression control flow. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/susp.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,735]},"types":{},"functions":{"compute":{"name":"compute","signature":"src/susp.compute","comments":[{"content":"Suspension points (await/yield) and intra-statement expression control flow.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":31,"end_column":40}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/compute","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,16],"bytes":[147,160]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]}}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"4:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:3"}],"ddg":[{"src":"@entry","dst":"4:3","var":"x","prov":["reaching-defs"]}]},"fetchTotal":{"name":"fetchTotal","signature":"src/susp.fetchTotal","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":34,"end_column":43}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]},"body":{"8:19":{"method_name":"compute","argument_types":["number"],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,19],"end":[8,29],"bytes":[245,255]},"callee":"can://typescript/dataflow-app/src/susp.ts/compute"},"@entry":{"kind":"entry","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,30],"bytes":[229,256]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,16],"bytes":[302,315]}},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]}}},"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"await_resume"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"},{"src":"8:3","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"x","prov":["reaching-defs"]},{"src":"8:3","dst":"9:3","var":"a","prov":["reaching-defs"]}]},"numbers":{"name":"numbers","signature":"src/susp.numbers","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"Generator","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":true,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/numbers","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]},"body":{"@entry":{"kind":"entry","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,13],"bytes":[395,405]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[17,4],"bytes":[408,486]}},"15:5":{"kind":"statement","span":{"start":[15,5],"end":[15,13],"bytes":[428,436]}},"16:5":{"kind":"statement","span":{"start":[16,5],"end":[16,15],"bytes":[472,482]}},"18:3":{"kind":"statement","span":{"start":[18,3],"end":[18,12],"bytes":[489,498]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]}}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:5","kind":"true"},{"src":"14:3","dst":"18:3","kind":"false"},{"src":"15:5","dst":"16:5","kind":"yield"},{"src":"16:5","dst":"14:3","kind":"loop_back"},{"src":"18:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"},{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"18:3"},{"src":"14:3","dst":"15:5"},{"src":"14:3","dst":"16:5"}],"ddg":[{"src":"@entry","dst":"14:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"18:3","var":"n","prov":["reaching-defs"]},{"src":"13:3","dst":"14:3","var":"i","prov":["reaching-defs"]},{"src":"13:3","dst":"15:5","var":"i","prov":["reaching-defs"]},{"src":"13:3","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"14:3","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"15:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"16:5","var":"i","prov":["reaching-defs"]}]},"shortCircuit":{"name":"shortCircuit","signature":"src/susp.shortCircuit","comments":[],"decorators":[],"parameters":[{"name":"a","type":"{ f?: number } | null","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":30,"end_column":54},{"name":"b","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":56,"end_column":65}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":4,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/shortCircuit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]},"body":{"@entry":{"kind":"entry","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]}},"22:3":{"kind":"statement","span":{"start":[22,3],"end":[22,29],"bytes":[580,606]}},"23:3":{"kind":"statement","span":{"start":[23,3],"end":[23,23],"bytes":[666,686]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,16],"bytes":[719,732]}},"@exit":{"kind":"exit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]}}},"cfg":[{"src":"@entry","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"23:3","kind":"fallthrough"},{"src":"23:3","dst":"24:3","kind":"fallthrough"},{"src":"24:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"22:3"},{"src":"@entry","dst":"23:3"},{"src":"@entry","dst":"24:3"}],"ddg":[{"src":"@entry","dst":"22:3","var":"a","prov":["reaching-defs"]},{"src":"@entry","dst":"22:3","var":"a.f","prov":["reaching-defs"]},{"src":"@entry","dst":"22:3","var":"b","prov":["reaching-defs"]},{"src":"@entry","dst":"23:3","var":"a.f","prov":["reaching-defs"]},{"src":"@entry","dst":"23:3","var":"b","prov":["reaching-defs"]},{"src":"22:3","dst":"24:3","var":"v","prov":["reaching-defs"]},{"src":"23:3","dst":"24:3","var":"w","prov":["reaching-defs"]}]}},"fields":{}},"src/taint.ts":{"source":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */\n\nexport function source(): string {\n return \"user-input\";\n}\n\nexport function sanitize(s: string): string {\n return s.replace(/dangerous/g, \"\");\n}\n\nexport function sink(s: string): void {\n void s;\n}\n\nexport function unsafeFlow(): void {\n const s = source();\n sink(s);\n}\n\nexport function safeFlow(): void {\n const s = sanitize(source());\n sink(s);\n}\n","imports":[],"exports":[],"comments":[{"content":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/taint.ts","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,536]},"types":{},"functions":{"source":{"name":"source","signature":"src/taint.source","comments":[{"content":"Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n(issue #2 PR E); the fixture carries the flows now so that PR only adds the query.","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/source","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]},"body":{"@entry":{"kind":"entry","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,23],"bytes":[219,239]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]}}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"}],"ddg":[]},"sanitize":{"name":"sanitize","signature":"src/taint.sanitize","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sanitize","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]},"body":{"11:10":{"method_name":"replace","receiver_expr":"s","receiver_type":"string","argument_types":["RegExp","\"\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[11,10],"end":[11,37],"bytes":[298,325]},"callee":"can://typescript/dataflow-app/@external/(builtin)/replace"},"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,38],"bytes":[291,326]}},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]}}},"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"11:3","var":"s.replace","prov":["reaching-defs"]}]},"sink":{"name":"sink","signature":"src/taint.sink","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":22,"end_column":31}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sink","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]},"body":{"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,10],"bytes":[372,379]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]}}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"s","prov":["reaching-defs"]}]},"unsafeFlow":{"name":"unsafeFlow","signature":"src/taint.unsafeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]},"body":{"19:13":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,13],"end":[19,21],"bytes":[432,440]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"20:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,3],"end":[20,10],"bytes":[444,451]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"},"@entry":{"kind":"entry","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,22],"bytes":[422,441]}},"@exit":{"kind":"exit","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]}}},"cfg":[{"src":"@entry","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"19:3"},{"src":"19:3","dst":"20:3"}],"ddg":[{"src":"19:3","dst":"20:3","var":"s","prov":["reaching-defs"]}]},"safeFlow":{"name":"safeFlow","signature":"src/taint.safeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/safeFlow","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]},"body":{"24:13":{"method_name":"sanitize","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,13],"end":[24,31],"bytes":[503,521]},"callee":"can://typescript/dataflow-app/src/taint.ts/sanitize"},"24:22":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,22],"end":[24,30],"bytes":[512,520]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"25:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,3],"end":[25,10],"bytes":[525,532]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"},"@entry":{"kind":"entry","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,32],"bytes":[493,522]}},"@exit":{"kind":"exit","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]}}},"cfg":[{"src":"@entry","dst":"24:3","kind":"fallthrough"},{"src":"24:3","dst":"@exit","kind":"exception"},{"src":"24:3","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"24:3"},{"src":"24:3","dst":"25:3"}],"ddg":[{"src":"24:3","dst":"25:3","var":"s","prov":["reaching-defs"]}]}},"fields":{}},"src/util.ts":{"source":"export function increment(v: number): number {\n return v + 1;\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[4,1],"bytes":[0,65]},"types":{},"functions":{"increment":{"name":"increment","signature":"src/util.increment","comments":[],"decorators":[],"parameters":[{"name":"v","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":1,"end_line":1,"start_column":27,"end_column":36}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/util.ts/increment","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]},"body":{"@entry":{"kind":"entry","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]}},"2:3":{"kind":"statement","span":{"start":[2,3],"end":[2,16],"bytes":[49,62]}},"@exit":{"kind":"exit","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]}}},"cfg":[{"src":"@entry","dst":"2:3","kind":"fallthrough"},{"src":"2:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"2:3"}],"ddg":[{"src":"@entry","dst":"2:3","var":"v","prov":["reaching-defs"]}]}},"fields":{}}},"call_graph":[{"src":"can://typescript/dataflow-app/src/chain.ts/b","dst":"can://typescript/dataflow-app/src/chain.ts/c","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/a","dst":"can://typescript/dataflow-app/src/chain.ts/b","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","dst":"can://typescript/dataflow-app/src/util.ts/increment","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd","dst":"can://typescript/dataflow-app/src/chain.ts/isEven","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/parse","dst":"can://typescript/dataflow-app/@external/(builtin)/isNaN","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/parse","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/shadow","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/chain.ts/a","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","dst":"can://typescript/dataflow-app/src/susp.ts/compute","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/sanitize","dst":"can://typescript/dataflow-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sanitize","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2}],"param_in":[],"param_out":[],"external_symbols":{"can://typescript/dataflow-app/@external/(builtin)/isNaN":{"id":"can://typescript/dataflow-app/@external/(builtin)/isNaN","kind":"external","module":"(builtin)","name":"isNaN"},"can://typescript/dataflow-app/@external/(builtin)/replace":{"id":"can://typescript/dataflow-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"}},"synthesized_callables":{}}} \ No newline at end of file diff --git a/test/goldens/dataflow-app-a4.json b/test/goldens/dataflow-app-a4.json new file mode 100644 index 0000000..f3ab5ee --- /dev/null +++ b/test/goldens/dataflow-app-a4.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/dataflow-app","kind":"application","symbol_table":{"src/chain.ts":{"source":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */\nimport { increment } from \"./util\";\n\nexport function c(z: number): number {\n return z + 1; // the parameter flows to the return value\n}\n\nexport function b(y: number): number {\n const fromC = c(y);\n return fromC;\n}\n\nexport function a(x: number): number {\n const fromB = b(x); // SUMMARY edge here: arg0 flows through b (and c) to the result\n return fromB;\n}\n\nexport function viaOtherFile(x: number): number {\n return increment(x); // cross-module CALL / PARAM_IN / PARAM_OUT edges\n}\n\nexport function isEven(n: number): boolean {\n if (n === 0) return true;\n return isOdd(n - 1); // mutual recursion: {isEven, isOdd} form an SCC\n}\n\nexport function isOdd(n: number): boolean {\n if (n === 0) return false;\n return isEven(n - 1);\n}\n","imports":[{"module":"./util","name":"increment","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":36}],"exports":[],"comments":[{"content":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/chain.ts","kind":"module","span":{"start":[1,1],"end":[31,1],"bytes":[0,824]},"types":{},"functions":{"c":{"name":"c","signature":"src/chain.c","comments":[],"decorators":[],"parameters":[{"name":"z","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/c","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,16],"bytes":[166,179]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]}},"@formal_in:0":{"kind":"formal_in","of":"z"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"z","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"b":{"name":"b","signature":"src/chain.b","comments":[],"decorators":[],"parameters":[{"name":"y","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/b","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]},"body":{"9:17":{"method_name":"c","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,17],"end":[9,21],"bytes":[281,285]},"callee":"can://typescript/dataflow-app/src/chain.ts/c"},"@entry":{"kind":"entry","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,22],"bytes":[267,286]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,16],"bytes":[289,302]}},"@exit":{"kind":"exit","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]}},"@formal_in:0":{"kind":"formal_in","of":"y"},"@formal_out":{"kind":"formal_out","of":"$ret"},"9:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"9:3"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3"}},"cfg":[{"src":"@entry","dst":"9:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"10:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"9:3"},{"src":"9:3","dst":"10:3"}],"ddg":[{"src":"@entry","dst":"9:3","var":"y","prov":["reaching-defs"]},{"src":"10:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"9:3","dst":"10:3","var":"fromC","prov":["reaching-defs"]}],"summary":[{"src":"9:3/actual_in:0","dst":"9:3/actual_out"}]},"a":{"name":"a","signature":"src/chain.a","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/a","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]},"body":{"14:17":{"method_name":"b","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,17],"end":[14,21],"bytes":[361,365]},"callee":"can://typescript/dataflow-app/src/chain.ts/b"},"@entry":{"kind":"entry","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,22],"bytes":[347,366]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,16],"bytes":[434,447]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"},"14:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:3"},"14:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:3"}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"14:3","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"x","prov":["reaching-defs"]},{"src":"14:3","dst":"15:3","var":"fromB","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"14:3/actual_in:0","dst":"14:3/actual_out"}]},"viaOtherFile":{"name":"viaOtherFile","signature":"src/chain.viaOtherFile","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":18,"end_line":18,"start_column":30,"end_column":39}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]},"body":{"19:10":{"method_name":"increment","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,10],"end":[19,22],"bytes":[510,522]},"callee":"can://typescript/dataflow-app/src/util.ts/increment"},"@entry":{"kind":"entry","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,23],"bytes":[503,523]}},"@exit":{"kind":"exit","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3"}},"cfg":[{"src":"@entry","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"19:3"}],"ddg":[{"src":"@entry","dst":"19:3","var":"x","prov":["reaching-defs"]},{"src":"19:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"19:3/actual_in:0","dst":"19:3/actual_out"}]},"isEven":{"name":"isEven","signature":"src/chain.isEven","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":22,"end_line":22,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isEven","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]},"body":{"24:10":{"method_name":"isOdd","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,10],"end":[24,22],"bytes":[659,671]},"callee":"can://typescript/dataflow-app/src/chain.ts/isOdd"},"@entry":{"kind":"entry","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]}},"23:3":{"kind":"statement","span":{"start":[23,3],"end":[23,28],"bytes":[624,649]}},"23:16":{"kind":"statement","span":{"start":[23,16],"end":[23,28],"bytes":[637,649]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,23],"bytes":[652,672]}},"@exit":{"kind":"exit","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"},"24:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"24:3"},"24:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"24:3"}},"cfg":[{"src":"@entry","dst":"23:3","kind":"fallthrough"},{"src":"23:16","dst":"@exit","kind":"return"},{"src":"23:3","dst":"23:16","kind":"true"},{"src":"23:3","dst":"24:3","kind":"false"},{"src":"24:3","dst":"@exit","kind":"exception"},{"src":"24:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"23:3"},{"src":"23:3","dst":"23:16"},{"src":"23:3","dst":"24:3"}],"ddg":[{"src":"@entry","dst":"23:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"24:3","var":"n","prov":["reaching-defs"]},{"src":"23:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"24:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"24:3/actual_in:0","dst":"24:3/actual_out"}]},"isOdd":{"name":"isOdd","signature":"src/chain.isOdd","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":27,"end_line":27,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isOdd","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]},"body":{"29:10":{"method_name":"isEven","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,10],"end":[29,23],"bytes":[807,820]},"callee":"can://typescript/dataflow-app/src/chain.ts/isEven"},"@entry":{"kind":"entry","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]}},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,29],"bytes":[771,797]}},"28:16":{"kind":"statement","span":{"start":[28,16],"end":[28,29],"bytes":[784,797]}},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[29,24],"bytes":[800,821]}},"@exit":{"kind":"exit","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"},"29:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"29:3"},"29:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"29:3"}},"cfg":[{"src":"@entry","dst":"28:3","kind":"fallthrough"},{"src":"28:16","dst":"@exit","kind":"return"},{"src":"28:3","dst":"28:16","kind":"true"},{"src":"28:3","dst":"29:3","kind":"false"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"28:3"},{"src":"28:3","dst":"28:16"},{"src":"28:3","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"28:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"29:3","var":"n","prov":["reaching-defs"]},{"src":"28:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"29:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"29:3/actual_in:0","dst":"29:3/actual_out"}]}},"fields":{}},"src/closures.ts":{"source":"/** Closure capture and copy aliasing. */\n\nexport function makeCounter(start: number): () => number {\n let count = start;\n const inc = (): number => {\n count = count + 1; // writes the captured local\n return count;\n };\n return inc;\n}\n\nexport function useAlias(): number {\n const p = { f: 1 };\n const q = p; // q and p alias the same object\n q.f = 42; // write through q ...\n return p.f; // ... must reach this read through p\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Closure capture and copy aliasing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/closures.ts","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,441]},"types":{},"functions":{"makeCounter":{"name":"makeCounter","signature":"src/closures.makeCounter","comments":[{"content":"Closure capture and copy aliasing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"decorators":[],"parameters":[{"name":"start","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":29,"end_column":42}],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,21],"bytes":[104,122]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[8,5],"bytes":[125,227]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,14],"bytes":[230,241]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]}},"@formal_in:0":{"kind":"formal_in","of":"start"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"inc":{"name":"inc","signature":"src/closures.makeCounter.inc","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter/inc","span":{"start":[5,9],"end":[8,4],"bytes":[131,226]},"body":{"@entry":{"kind":"entry","span":{"start":[5,15],"end":[8,4],"bytes":[137,226]}},"6:5":{"kind":"statement","span":{"start":[6,5],"end":[6,23],"bytes":[157,175]}},"7:5":{"kind":"statement","span":{"start":[7,5],"end":[7,18],"bytes":[209,222]}},"@exit":{"kind":"exit","span":{"start":[5,15],"end":[8,4],"bytes":[137,226]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"6:5","kind":"fallthrough"},{"src":"6:5","dst":"7:5","kind":"fallthrough"},{"src":"7:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"6:5"},{"src":"@entry","dst":"7:5"}],"ddg":[{"src":"@entry","dst":"6:5","var":"count","prov":["reaching-defs"]},{"src":"@entry","dst":"7:5","var":"count","prov":["reaching-defs"]},{"src":"6:5","dst":"7:5","var":"count","prov":["reaching-defs"]},{"src":"7:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"4:3","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:3"},{"src":"@entry","dst":"5:3"},{"src":"@entry","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"4:3","var":"start","prov":["reaching-defs"]},{"src":"4:3","dst":"5:3","var":"count","prov":["reaching-defs"]},{"src":"5:3","dst":"9:3","var":"inc","prov":["reaching-defs"]},{"src":"9:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"useAlias":{"name":"useAlias","signature":"src/closures.useAlias","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/useAlias","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]},"body":{"@entry":{"kind":"entry","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,22],"bytes":[284,303]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,15],"bytes":[306,318]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,12],"bytes":[354,363]}},"16:3":{"kind":"statement","span":{"start":[16,3],"end":[16,14],"bytes":[389,400]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"},{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"15:3"},{"src":"@entry","dst":"16:3"}],"ddg":[{"src":"13:3","dst":"14:3","var":"p","prov":["reaching-defs"]},{"src":"14:3","dst":"16:3","var":"p.f","prov":["reaching-defs"]},{"src":"15:3","dst":"16:3","var":"p.f","prov":["reaching-defs"]},{"src":"16:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/flow.ts":{"source":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */\n\nexport function classify(n: number): string {\n let label = \"none\";\n if (n > 0) {\n label = \"pos\";\n } else {\n label = \"neg\";\n }\n return label;\n}\n\nexport function sumTo(n: number): number {\n let acc = 0;\n for (let i = 0; i < n; i++) {\n acc = acc + i; // loop-carried dependency: acc feeds itself around the back edge\n }\n return acc;\n}\n\nexport function early(n: number): number {\n if (n < 0) {\n return -1; // early return (multi-exit normalization)\n }\n const r = n * 2;\n return r;\n}\n\nexport function parse(s: string): number {\n const v = Number(s);\n if (Number.isNaN(v)) {\n throw new Error(`bad input: ${s}`);\n }\n return v;\n}\n\nexport function guarded(s: string): number {\n let out = 0;\n try {\n out = parse(s); // may throw → exception edge into the catch node\n } catch (e) {\n out = -1;\n } finally {\n touch(out);\n }\n return out;\n}\n\nexport function touch(x: number): void {\n void x;\n}\n\nexport function pickDay(d: number): string {\n let name = \"\";\n switch (d) {\n case 0:\n name = \"sun\";\n break;\n case 6:\n name = \"sat\";\n break;\n default:\n name = \"weekday\";\n }\n return name;\n}\n\nexport function spin(): number {\n let ticks = 0;\n while (true) {\n ticks = ticks + 1; // infinite loop: the dead loop-exit edge keeps EXIT reachable\n if (ticks > 3) {\n break;\n }\n }\n return ticks;\n}\n\nexport function shadow(): number {\n const x = 1;\n {\n const x = 2; // shadows the outer x — must NOT leak DDG edges across scopes\n touch(x);\n }\n return x;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/flow.ts","kind":"module","span":{"start":[1,1],"end":[87,1],"bytes":[0,1634]},"types":{},"functions":{"classify":{"name":"classify","signature":"src/flow.classify","comments":[{"content":"Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/classify","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,22],"bytes":[146,165]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[9,4],"bytes":[168,233]}},"6:5":{"kind":"statement","span":{"start":[6,5],"end":[6,19],"bytes":[185,199]}},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,19],"bytes":[215,229]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,16],"bytes":[236,249]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"},{"src":"4:3","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"6:5","kind":"true"},{"src":"5:3","dst":"8:5","kind":"false"},{"src":"6:5","dst":"10:3","kind":"fallthrough"},{"src":"8:5","dst":"10:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"10:3"},{"src":"@entry","dst":"4:3"},{"src":"@entry","dst":"5:3"},{"src":"5:3","dst":"6:5"},{"src":"5:3","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"5:3","var":"n","prov":["reaching-defs"]},{"src":"10:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"6:5","dst":"10:3","var":"label","prov":["reaching-defs"]},{"src":"8:5","dst":"10:3","var":"label","prov":["reaching-defs"]}],"summary":[]},"sumTo":{"name":"sumTo","signature":"src/flow.sumTo","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/sumTo","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]},"body":{"@entry":{"kind":"entry","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,15],"bytes":[298,310]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[17,4],"bytes":[313,431]}},"16:5":{"kind":"statement","span":{"start":[16,5],"end":[16,19],"bytes":[347,361]}},"18:3":{"kind":"statement","span":{"start":[18,3],"end":[18,14],"bytes":[434,445]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"16:5","kind":"true"},{"src":"15:3","dst":"18:3","kind":"false"},{"src":"16:5","dst":"15:3","kind":"loop_back"},{"src":"18:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"15:3"},{"src":"@entry","dst":"18:3"},{"src":"15:3","dst":"16:5"}],"ddg":[{"src":"@entry","dst":"15:3","var":"n","prov":["reaching-defs"]},{"src":"14:3","dst":"16:5","var":"acc","prov":["reaching-defs"]},{"src":"14:3","dst":"18:3","var":"acc","prov":["reaching-defs"]},{"src":"15:3","dst":"15:3","var":"i","prov":["reaching-defs"]},{"src":"15:3","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"16:5","var":"acc","prov":["reaching-defs"]},{"src":"16:5","dst":"18:3","var":"acc","prov":["reaching-defs"]},{"src":"18:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"early":{"name":"early","signature":"src/flow.early","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/early","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]},"body":{"@entry":{"kind":"entry","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]}},"22:3":{"kind":"statement","span":{"start":[22,3],"end":[24,4],"bytes":[494,568]}},"23:5":{"kind":"statement","span":{"start":[23,5],"end":[23,15],"bytes":[511,521]}},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[25,19],"bytes":[571,587]}},"26:3":{"kind":"statement","span":{"start":[26,3],"end":[26,12],"bytes":[590,599]}},"@exit":{"kind":"exit","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"23:5","kind":"true"},{"src":"22:3","dst":"25:3","kind":"false"},{"src":"23:5","dst":"@exit","kind":"return"},{"src":"25:3","dst":"26:3","kind":"fallthrough"},{"src":"26:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"22:3"},{"src":"22:3","dst":"23:5"},{"src":"22:3","dst":"25:3"},{"src":"22:3","dst":"26:3"}],"ddg":[{"src":"@entry","dst":"22:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"25:3","var":"n","prov":["reaching-defs"]},{"src":"23:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"25:3","dst":"26:3","var":"r","prov":["reaching-defs"]},{"src":"26:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"parse":{"name":"parse","signature":"src/flow.parse","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":29,"end_line":29,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/parse","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]},"body":{"30:13":{"method_name":"Number","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,13],"end":[30,22],"bytes":[658,667]},"callee":null},"31:7":{"method_name":"isNaN","receiver_expr":"Number","receiver_type":"NumberConstructor","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,7],"end":[31,22],"bytes":[675,690]},"callee":"can://typescript/dataflow-app/@external/(builtin)/isNaN"},"32:11":{"method_name":"Error","argument_types":["string"],"type_arguments":[],"return_type":"Error","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[32,11],"end":[32,39],"bytes":[704,732]},"callee":null},"@entry":{"kind":"entry","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]}},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,23],"bytes":[648,668]}},"31:3":{"kind":"statement","span":{"start":[31,3],"end":[33,4],"bytes":[671,737]}},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,40],"bytes":[698,733]}},"34:3":{"kind":"statement","span":{"start":[34,3],"end":[34,12],"bytes":[740,749]}},"@exit":{"kind":"exit","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"},"30:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:3"},"30:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:3"},"31:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:3"},"31:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:3"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5"}},"cfg":[{"src":"@entry","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"exception"},{"src":"30:3","dst":"31:3","kind":"fallthrough"},{"src":"31:3","dst":"@exit","kind":"exception"},{"src":"31:3","dst":"32:5","kind":"true"},{"src":"31:3","dst":"34:3","kind":"false"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"34:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"30:3"},{"src":"30:3","dst":"31:3"},{"src":"31:3","dst":"32:5"},{"src":"31:3","dst":"34:3"}],"ddg":[{"src":"@entry","dst":"30:3","var":"s","prov":["reaching-defs"]},{"src":"@entry","dst":"32:5","var":"s","prov":["reaching-defs"]},{"src":"30:3","dst":"31:3","var":"v","prov":["reaching-defs"]},{"src":"30:3","dst":"34:3","var":"v","prov":["reaching-defs"]},{"src":"34:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"30:3/actual_in:0","dst":"30:3/actual_out"},{"src":"31:3/actual_in:0","dst":"31:3/actual_out"},{"src":"32:5/actual_in:0","dst":"32:5/actual_out"}]},"guarded":{"name":"guarded","signature":"src/flow.guarded","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/guarded","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]},"body":{"40:11":{"method_name":"parse","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,11],"end":[40,19],"bytes":[831,839]},"callee":"can://typescript/dataflow-app/src/flow.ts/parse"},"44:5":{"method_name":"touch","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[44,5],"end":[44,15],"bytes":[939,949]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"},"@entry":{"kind":"entry","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]}},"38:3":{"kind":"statement","span":{"start":[38,3],"end":[38,15],"bytes":[800,812]}},"40:5":{"kind":"statement","span":{"start":[40,5],"end":[40,20],"bytes":[825,840]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[43,4],"bytes":[895,924]}},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[42,14],"bytes":[911,920]}},"46:3":{"kind":"statement","span":{"start":[46,3],"end":[46,14],"bytes":[957,968]}},"@exit":{"kind":"exit","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5"},"44:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"44:5"},"44:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"44:5"}},"cfg":[{"src":"@entry","dst":"38:3","kind":"fallthrough"},{"src":"38:3","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"41:5","kind":"exception"},{"src":"40:5","dst":"44:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"44:5","kind":"fallthrough"},{"src":"44:5","dst":"@exit","kind":"exception"},{"src":"44:5","dst":"46:3","kind":"fallthrough"},{"src":"46:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"38:3"},{"src":"@entry","dst":"40:5"},{"src":"@entry","dst":"44:5"},{"src":"40:5","dst":"41:5"},{"src":"40:5","dst":"42:5"},{"src":"44:5","dst":"46:3"}],"ddg":[{"src":"@entry","dst":"40:5","var":"s","prov":["reaching-defs"]},{"src":"40:5","dst":"44:5","var":"out","prov":["reaching-defs"]},{"src":"40:5","dst":"46:3","var":"out","prov":["reaching-defs"]},{"src":"42:5","dst":"44:5","var":"out","prov":["reaching-defs"]},{"src":"42:5","dst":"46:3","var":"out","prov":["reaching-defs"]},{"src":"46:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"40:5/actual_in:0","dst":"40:5/actual_out"}]},"touch":{"name":"touch","signature":"src/flow.touch","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":49,"end_line":49,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/touch","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]},"body":{"@entry":{"kind":"entry","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]}},"50:3":{"kind":"statement","span":{"start":[50,3],"end":[50,10],"bytes":[1015,1022]}},"@exit":{"kind":"exit","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"50:3","kind":"fallthrough"},{"src":"50:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"50:3"}],"ddg":[{"src":"@entry","dst":"50:3","var":"x","prov":["reaching-defs"]}],"summary":[]},"pickDay":{"name":"pickDay","signature":"src/flow.pickDay","comments":[],"decorators":[],"parameters":[{"name":"d","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":53,"end_line":53,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/pickDay","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]},"body":{"@entry":{"kind":"entry","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]}},"54:3":{"kind":"statement","span":{"start":[54,3],"end":[54,17],"bytes":[1073,1087]}},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[64,4],"bytes":[1090,1233]}},"57:7":{"kind":"statement","span":{"start":[57,7],"end":[57,20],"bytes":[1121,1134]}},"58:7":{"kind":"statement","span":{"start":[58,7],"end":[58,13],"bytes":[1141,1147]}},"60:7":{"kind":"statement","span":{"start":[60,7],"end":[60,20],"bytes":[1166,1179]}},"61:7":{"kind":"statement","span":{"start":[61,7],"end":[61,13],"bytes":[1186,1192]}},"63:7":{"kind":"statement","span":{"start":[63,7],"end":[63,24],"bytes":[1212,1229]}},"65:3":{"kind":"statement","span":{"start":[65,3],"end":[65,15],"bytes":[1236,1248]}},"@exit":{"kind":"exit","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]}},"@formal_in:0":{"kind":"formal_in","of":"d"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"57:7","kind":"switch_case"},{"src":"55:3","dst":"60:7","kind":"switch_case"},{"src":"55:3","dst":"63:7","kind":"switch_case"},{"src":"57:7","dst":"58:7","kind":"fallthrough"},{"src":"58:7","dst":"65:3","kind":"break"},{"src":"60:7","dst":"61:7","kind":"fallthrough"},{"src":"61:7","dst":"65:3","kind":"break"},{"src":"63:7","dst":"65:3","kind":"fallthrough"},{"src":"65:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"54:3"},{"src":"@entry","dst":"55:3"},{"src":"@entry","dst":"65:3"},{"src":"55:3","dst":"57:7"},{"src":"55:3","dst":"58:7"},{"src":"55:3","dst":"60:7"},{"src":"55:3","dst":"61:7"},{"src":"55:3","dst":"63:7"}],"ddg":[{"src":"@entry","dst":"55:3","var":"d","prov":["reaching-defs"]},{"src":"57:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"60:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"63:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"65:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"spin":{"name":"spin","signature":"src/flow.spin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/spin","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]},"body":{"@entry":{"kind":"entry","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]}},"69:3":{"kind":"statement","span":{"start":[69,3],"end":[69,17],"bytes":[1287,1301]}},"70:3":{"kind":"statement","span":{"start":[70,3],"end":[75,4],"bytes":[1304,1448]}},"71:5":{"kind":"statement","span":{"start":[71,5],"end":[71,23],"bytes":[1323,1341]}},"72:5":{"kind":"statement","span":{"start":[72,5],"end":[74,6],"bytes":[1409,1444]}},"73:7":{"kind":"statement","span":{"start":[73,7],"end":[73,13],"bytes":[1432,1438]}},"76:3":{"kind":"statement","span":{"start":[76,3],"end":[76,16],"bytes":[1451,1464]}},"@exit":{"kind":"exit","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"69:3","kind":"fallthrough"},{"src":"69:3","dst":"70:3","kind":"fallthrough"},{"src":"70:3","dst":"71:5","kind":"true"},{"src":"70:3","dst":"76:3","kind":"false"},{"src":"71:5","dst":"72:5","kind":"fallthrough"},{"src":"72:5","dst":"70:3","kind":"loop_back"},{"src":"72:5","dst":"73:7","kind":"true"},{"src":"73:7","dst":"76:3","kind":"break"},{"src":"76:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"69:3"},{"src":"@entry","dst":"70:3"},{"src":"@entry","dst":"76:3"},{"src":"70:3","dst":"71:5"},{"src":"70:3","dst":"72:5"},{"src":"72:5","dst":"70:3"},{"src":"72:5","dst":"73:7"}],"ddg":[{"src":"69:3","dst":"71:5","var":"ticks","prov":["reaching-defs"]},{"src":"69:3","dst":"76:3","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"71:5","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"72:5","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"76:3","var":"ticks","prov":["reaching-defs"]},{"src":"76:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"shadow":{"name":"shadow","signature":"src/flow.shadow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/shadow","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]},"body":{"83:5":{"method_name":"touch","argument_types":["2"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[83,5],"end":[83,13],"bytes":[1606,1614]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"},"@entry":{"kind":"entry","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]}},"80:3":{"kind":"statement","span":{"start":[80,3],"end":[80,15],"bytes":[1505,1517]}},"82:5":{"kind":"statement","span":{"start":[82,5],"end":[82,17],"bytes":[1526,1538]}},"85:3":{"kind":"statement","span":{"start":[85,3],"end":[85,12],"bytes":[1622,1631]}},"@exit":{"kind":"exit","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"83:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"83:5"},"83:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"83:5"}},"cfg":[{"src":"@entry","dst":"80:3","kind":"fallthrough"},{"src":"80:3","dst":"82:5","kind":"fallthrough"},{"src":"82:5","dst":"83:5","kind":"fallthrough"},{"src":"83:5","dst":"@exit","kind":"exception"},{"src":"83:5","dst":"85:3","kind":"fallthrough"},{"src":"85:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"80:3"},{"src":"@entry","dst":"82:5"},{"src":"@entry","dst":"83:5"},{"src":"83:5","dst":"85:3"}],"ddg":[{"src":"80:3","dst":"85:3","var":"x","prov":["reaching-defs"]},{"src":"82:5","dst":"83:5","var":"x","prov":["reaching-defs"]},{"src":"85:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/hierarchy.ts":{"source":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */\n\nexport interface Shape {\n area(): number;\n}\n\nexport interface Labeled {\n readonly label: string;\n}\n\nexport interface ColoredShape extends Shape {\n readonly color: string;\n}\n\nexport class Rectangle implements Shape {\n constructor(\n protected readonly width: number,\n protected readonly height: number,\n ) {}\n\n area(): number {\n return this.width * this.height;\n }\n}\n\nexport class Square extends Rectangle implements Labeled {\n readonly label = \"square\";\n\n constructor(side: number) {\n super(side, side);\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts","kind":"module","span":{"start":[1,1],"end":[34,1],"bytes":[0,712]},"types":{"Rectangle":{"name":"Rectangle","signature":"src/hierarchy.Rectangle","comments":[],"decorators":[],"base_classes":["src/hierarchy.Shape"],"implements_types":["src/hierarchy.Shape"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle","kind":"class","span":{"start":[16,1],"end":[25,2],"bytes":[359,562]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Rectangle.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]},"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]}},"23:5":{"kind":"statement","span":{"start":[23,5],"end":[23,37],"bytes":[524,556]}},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"23:5","kind":"fallthrough"},{"src":"23:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"23:5"}],"ddg":[{"src":"@entry","dst":"23:5","var":"this.height","prov":["reaching-defs"]},{"src":"@entry","dst":"23:5","var":"this.width","prov":["reaching-defs"]},{"src":"23:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/hierarchy.Rectangle.constructor","comments":[],"decorators":[],"parameters":[{"name":"width","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":18,"end_line":18,"start_column":5,"end_column":37},{"name":"height","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":19,"end_line":19,"start_column":5,"end_column":38}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]},"body":{"@entry":{"kind":"entry","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]}},"@exit":{"kind":"exit","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]}},"@formal_in:0":{"kind":"formal_in","of":"width"},"@formal_in:1":{"kind":"formal_in","of":"height"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"width":{"name":"width","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width","kind":"field"},"height":{"name":"height","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height","kind":"field"}},"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]},"Square":{"name":"Square","signature":"src/hierarchy.Square","comments":[],"decorators":[],"base_classes":["src/hierarchy.Rectangle","src/hierarchy.Labeled"],"implements_types":["src/hierarchy.Labeled"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square","kind":"class","span":{"start":[27,1],"end":[33,2],"bytes":[564,711]},"callables":{"constructor":{"name":"constructor","signature":"src/hierarchy.Square.constructor","comments":[],"decorators":[],"parameters":[{"name":"side","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":30,"end_line":30,"start_column":15,"end_column":27}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]},"body":{"31:5":{"method_name":"super","argument_types":["number","number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,22],"bytes":[687,704]},"callee":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor"},"@entry":{"kind":"entry","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]}},"@exit":{"kind":"exit","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]}},"@formal_in:0":{"kind":"formal_in","of":"side"},"@formal_out":{"kind":"formal_out","of":"$ret"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5"},"31:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"31:5"}},"cfg":[{"src":"@entry","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"31:5"}],"ddg":[{"src":"@entry","dst":"31:5","var":"side","prov":["reaching-defs"]}],"summary":[]}},"fields":{"label":{"name":"label","type":"\"square\"","comments":[],"decorators":[],"initializer":"\"square\"","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/label","kind":"field","span":{"start":[28,3],"end":[28,29],"bytes":[625,651]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Rectangle"],"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Labeled"]},"Shape":{"name":"Shape","signature":"src/hierarchy.Shape","comments":[{"content":"A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\nprojection, including interface→interface EXTENDS (`ColoredShape extends Shape`).","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape","kind":"interface","span":{"start":[4,1],"end":[6,2],"bytes":[182,226]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Shape.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape/area","span":{"start":[5,3],"end":[5,18],"bytes":[209,224]},"body":{}}},"fields":{}},"Labeled":{"name":"Labeled","signature":"src/hierarchy.Labeled","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled","kind":"interface","span":{"start":[8,1],"end":[10,2],"bytes":[228,282]},"callables":{},"fields":{"label":{"name":"label","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label","kind":"field","span":{"start":[9,3],"end":[9,26],"bytes":[257,280]}}}},"ColoredShape":{"name":"ColoredShape","signature":"src/hierarchy.ColoredShape","comments":[],"base_classes":["src/hierarchy.Shape"],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape","kind":"interface","span":{"start":[12,1],"end":[14,2],"bytes":[284,357]},"callables":{},"fields":{"color":{"name":"color","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color","kind":"field","span":{"start":[13,3],"end":[13,26],"bytes":[332,355]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]}},"functions":{},"fields":{}},"src/main.ts":{"source":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */\nimport { a } from \"./chain\";\nimport { bump, readCounter } from \"./state\";\n\nexport function main(): number {\n bump(3);\n const r = a(readCounter());\n return r;\n}\n","imports":[{"module":"./chain","name":"a","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":29},{"module":"./state","name":"bump","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45},{"module":"./state","name":"readCounter","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45}],"exports":[],"comments":[{"content":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":81}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/main.ts","kind":"module","span":{"start":[1,1],"end":[10,1],"bytes":[0,244]},"types":{},"functions":{"main":{"name":"main","signature":"src/main.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/main.ts/main","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]},"body":{"6:3":{"method_name":"bump","argument_types":["3"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[6,3],"end":[6,10],"bytes":[191,198]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"7:13":{"method_name":"a","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,13],"end":[7,29],"bytes":[212,228]},"callee":"can://typescript/dataflow-app/src/chain.ts/a"},"7:15":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,15],"end":[7,28],"bytes":[214,227]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"},"@entry":{"kind":"entry","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,30],"bytes":[202,229]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,12],"bytes":[232,241]}},"@exit":{"kind":"exit","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3"},"6:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"6:3"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3"},"6:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"6:3"}},"cfg":[{"src":"@entry","dst":"6:3","kind":"fallthrough"},{"src":"6:3","dst":"@exit","kind":"exception"},{"src":"6:3","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"6:3"},{"src":"6:3","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"6:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"@entry","dst":"7:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"6:3","dst":"@formal_out","var":"src/state.counter","prov":["reaching-defs"]},{"src":"6:3","dst":"7:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"r","prov":["reaching-defs"]},{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"7:3","dst":"7:3","var":"src/state.counter"},{"src":"7:3/actual_in:0","dst":"7:3/actual_out"}]}},"fields":{}},"src/state.ts":{"source":"/** Module-level global state: written in one function, read in another. */\n\nexport let counter = 0;\n\nexport function bump(by: number): void {\n counter = counter + by; // global write\n}\n\nexport function readCounter(): number {\n return counter; // global read that flows to the return value\n}\n\nexport function churn(by: number): number {\n bump(by); // transitive global write lands on this callsite node\n return readCounter(); // transitive global read\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Module-level global state: written in one function, read in another. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":76}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/state.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,458]},"types":{},"functions":{"bump":{"name":"bump","signature":"src/state.bump","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":5,"end_line":5,"start_column":22,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/bump","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]},"body":{"@entry":{"kind":"entry","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]}},"6:3":{"kind":"statement","span":{"start":[6,3],"end":[6,26],"bytes":[145,168]}},"@exit":{"kind":"exit","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]}},"@formal_in:0":{"kind":"formal_in","of":"by"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"6:3","kind":"fallthrough"},{"src":"6:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"6:3"}],"ddg":[{"src":"@entry","dst":"6:3","var":"by","prov":["reaching-defs"]},{"src":"@entry","dst":"6:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"6:3","dst":"@formal_out","var":"src/state.counter","prov":["reaching-defs"]}],"summary":[]},"readCounter":{"name":"readCounter","signature":"src/state.readCounter","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/readCounter","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]},"body":{"@entry":{"kind":"entry","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,18],"bytes":[230,245]}},"@exit":{"kind":"exit","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"10:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"10:3"}],"ddg":[{"src":"@entry","dst":"10:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"10:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"churn":{"name":"churn","signature":"src/state.churn","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":33}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/churn","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]},"body":{"14:3":{"method_name":"bump","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,11],"bytes":[341,349]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"15:10":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,23],"bytes":[415,428]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"},"@entry":{"kind":"entry","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,24],"bytes":[408,429]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]}},"@formal_in:0":{"kind":"formal_in","of":"by"},"@formal_out":{"kind":"formal_out","of":"$ret"},"14:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:3"},"14:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:3"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3"}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"14:3","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"by","prov":["reaching-defs"]},{"src":"@entry","dst":"14:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"@entry","dst":"15:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"14:3","dst":"@formal_out","var":"src/state.counter","prov":["reaching-defs"]},{"src":"14:3","dst":"15:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3","dst":"15:3","var":"src/state.counter"}]}},"fields":{"counter":{"name":"counter","type":"number","initializer":"0","scope":"module","declaration_kind":"let","is_readonly":false,"is_exported":true,"id":"can://typescript/dataflow-app/src/state.ts/counter","kind":"field","span":{"start":[3,12],"end":[3,23],"bytes":[88,99]}}}},"src/susp.ts":{"source":"/** Suspension points (await/yield) and intra-statement expression control flow. */\n\nexport async function compute(x: number): Promise {\n return x * 2;\n}\n\nexport async function fetchTotal(x: number): Promise {\n const a = await compute(x); // await_resume edge out of this statement\n return a + 1;\n}\n\nexport function* numbers(n: number): Generator {\n let i = 0;\n while (i < n) {\n yield i; // yield (suspend/resume) edge\n i = i + 1;\n }\n return n;\n}\n\nexport function shortCircuit(a: { f?: number } | null, b: number): number {\n const v = (a && a.f) || b; // short-circuit stays intra-statement (documented rule)\n const w = a?.f ?? b; // optional chaining likewise\n return v + w;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Suspension points (await/yield) and intra-statement expression control flow. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/susp.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,735]},"types":{},"functions":{"compute":{"name":"compute","signature":"src/susp.compute","comments":[{"content":"Suspension points (await/yield) and intra-statement expression control flow.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":31,"end_column":40}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/compute","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,16],"bytes":[147,160]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"4:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:3"}],"ddg":[{"src":"@entry","dst":"4:3","var":"x","prov":["reaching-defs"]},{"src":"4:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"fetchTotal":{"name":"fetchTotal","signature":"src/susp.fetchTotal","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":34,"end_column":43}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]},"body":{"8:19":{"method_name":"compute","argument_types":["number"],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,19],"end":[8,29],"bytes":[245,255]},"callee":"can://typescript/dataflow-app/src/susp.ts/compute"},"@entry":{"kind":"entry","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,30],"bytes":[229,256]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,16],"bytes":[302,315]}},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3"}},"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"await_resume"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"},{"src":"8:3","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"x","prov":["reaching-defs"]},{"src":"8:3","dst":"9:3","var":"a","prov":["reaching-defs"]},{"src":"9:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:3/actual_in:0","dst":"8:3/actual_out"}]},"numbers":{"name":"numbers","signature":"src/susp.numbers","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"Generator","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":true,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/numbers","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]},"body":{"@entry":{"kind":"entry","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,13],"bytes":[395,405]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[17,4],"bytes":[408,486]}},"15:5":{"kind":"statement","span":{"start":[15,5],"end":[15,13],"bytes":[428,436]}},"16:5":{"kind":"statement","span":{"start":[16,5],"end":[16,15],"bytes":[472,482]}},"18:3":{"kind":"statement","span":{"start":[18,3],"end":[18,12],"bytes":[489,498]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:5","kind":"true"},{"src":"14:3","dst":"18:3","kind":"false"},{"src":"15:5","dst":"16:5","kind":"yield"},{"src":"16:5","dst":"14:3","kind":"loop_back"},{"src":"18:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"},{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"18:3"},{"src":"14:3","dst":"15:5"},{"src":"14:3","dst":"16:5"}],"ddg":[{"src":"@entry","dst":"14:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"18:3","var":"n","prov":["reaching-defs"]},{"src":"13:3","dst":"14:3","var":"i","prov":["reaching-defs"]},{"src":"13:3","dst":"15:5","var":"i","prov":["reaching-defs"]},{"src":"13:3","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"14:3","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"15:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"18:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"shortCircuit":{"name":"shortCircuit","signature":"src/susp.shortCircuit","comments":[],"decorators":[],"parameters":[{"name":"a","type":"{ f?: number } | null","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":30,"end_column":54},{"name":"b","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":56,"end_column":65}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":4,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/shortCircuit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]},"body":{"@entry":{"kind":"entry","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]}},"22:3":{"kind":"statement","span":{"start":[22,3],"end":[22,29],"bytes":[580,606]}},"23:3":{"kind":"statement","span":{"start":[23,3],"end":[23,23],"bytes":[666,686]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,16],"bytes":[719,732]}},"@exit":{"kind":"exit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]}},"@formal_in:0":{"kind":"formal_in","of":"a"},"@formal_in:1":{"kind":"formal_in","of":"b"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"23:3","kind":"fallthrough"},{"src":"23:3","dst":"24:3","kind":"fallthrough"},{"src":"24:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"22:3"},{"src":"@entry","dst":"23:3"},{"src":"@entry","dst":"24:3"}],"ddg":[{"src":"@entry","dst":"22:3","var":"a","prov":["reaching-defs"]},{"src":"@entry","dst":"22:3","var":"a.f","prov":["reaching-defs"]},{"src":"@entry","dst":"22:3","var":"b","prov":["reaching-defs"]},{"src":"@entry","dst":"23:3","var":"a.f","prov":["reaching-defs"]},{"src":"@entry","dst":"23:3","var":"b","prov":["reaching-defs"]},{"src":"22:3","dst":"24:3","var":"v","prov":["reaching-defs"]},{"src":"23:3","dst":"24:3","var":"w","prov":["reaching-defs"]},{"src":"24:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/taint.ts":{"source":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */\n\nexport function source(): string {\n return \"user-input\";\n}\n\nexport function sanitize(s: string): string {\n return s.replace(/dangerous/g, \"\");\n}\n\nexport function sink(s: string): void {\n void s;\n}\n\nexport function unsafeFlow(): void {\n const s = source();\n sink(s);\n}\n\nexport function safeFlow(): void {\n const s = sanitize(source());\n sink(s);\n}\n","imports":[],"exports":[],"comments":[{"content":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/taint.ts","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,536]},"types":{},"functions":{"source":{"name":"source","signature":"src/taint.source","comments":[{"content":"Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n(issue #2 PR E); the fixture carries the flows now so that PR only adds the query.","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/source","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]},"body":{"@entry":{"kind":"entry","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,23],"bytes":[219,239]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"}],"ddg":[{"src":"7:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"sanitize":{"name":"sanitize","signature":"src/taint.sanitize","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sanitize","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]},"body":{"11:10":{"method_name":"replace","receiver_expr":"s","receiver_type":"string","argument_types":["RegExp","\"\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[11,10],"end":[11,37],"bytes":[298,325]},"callee":"can://typescript/dataflow-app/@external/(builtin)/replace"},"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,38],"bytes":[291,326]}},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3"},"11:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"11:3"}},"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"11:3","var":"s.replace","prov":["reaching-defs"]},{"src":"11:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"11:3/actual_in:0","dst":"11:3/actual_out"},{"src":"11:3/actual_in:1","dst":"11:3/actual_out"}]},"sink":{"name":"sink","signature":"src/taint.sink","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":22,"end_column":31}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sink","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]},"body":{"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,10],"bytes":[372,379]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"s","prov":["reaching-defs"]}],"summary":[]},"unsafeFlow":{"name":"unsafeFlow","signature":"src/taint.unsafeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]},"body":{"19:13":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,13],"end":[19,21],"bytes":[432,440]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"20:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,3],"end":[20,10],"bytes":[444,451]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"},"@entry":{"kind":"entry","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,22],"bytes":[422,441]}},"@exit":{"kind":"exit","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"20:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:3"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3"},"20:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:3"}},"cfg":[{"src":"@entry","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"19:3"},{"src":"19:3","dst":"20:3"}],"ddg":[{"src":"19:3","dst":"20:3","var":"s","prov":["reaching-defs"]}],"summary":[]},"safeFlow":{"name":"safeFlow","signature":"src/taint.safeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/safeFlow","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]},"body":{"24:13":{"method_name":"sanitize","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,13],"end":[24,31],"bytes":[503,521]},"callee":"can://typescript/dataflow-app/src/taint.ts/sanitize"},"24:22":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,22],"end":[24,30],"bytes":[512,520]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"25:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,3],"end":[25,10],"bytes":[525,532]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"},"@entry":{"kind":"entry","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,32],"bytes":[493,522]}},"@exit":{"kind":"exit","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"24:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"24:3"},"24:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"24:3"},"25:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:3"},"25:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:3"}},"cfg":[{"src":"@entry","dst":"24:3","kind":"fallthrough"},{"src":"24:3","dst":"@exit","kind":"exception"},{"src":"24:3","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"24:3"},{"src":"24:3","dst":"25:3"}],"ddg":[{"src":"24:3","dst":"25:3","var":"s","prov":["reaching-defs"]}],"summary":[{"src":"24:3/actual_in:0","dst":"24:3/actual_out"}]}},"fields":{}},"src/util.ts":{"source":"export function increment(v: number): number {\n return v + 1;\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[4,1],"bytes":[0,65]},"types":{},"functions":{"increment":{"name":"increment","signature":"src/util.increment","comments":[],"decorators":[],"parameters":[{"name":"v","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":1,"end_line":1,"start_column":27,"end_column":36}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/util.ts/increment","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]},"body":{"@entry":{"kind":"entry","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]}},"2:3":{"kind":"statement","span":{"start":[2,3],"end":[2,16],"bytes":[49,62]}},"@exit":{"kind":"exit","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]}},"@formal_in:0":{"kind":"formal_in","of":"v"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"2:3","kind":"fallthrough"},{"src":"2:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"2:3"}],"ddg":[{"src":"@entry","dst":"2:3","var":"v","prov":["reaching-defs"]},{"src":"2:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}}},"call_graph":[{"src":"can://typescript/dataflow-app/src/chain.ts/b","dst":"can://typescript/dataflow-app/src/chain.ts/c","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/a","dst":"can://typescript/dataflow-app/src/chain.ts/b","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","dst":"can://typescript/dataflow-app/src/util.ts/increment","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd","dst":"can://typescript/dataflow-app/src/chain.ts/isEven","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/parse","dst":"can://typescript/dataflow-app/@external/(builtin)/isNaN","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/parse","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/shadow","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/chain.ts/a","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","dst":"can://typescript/dataflow-app/src/susp.ts/compute","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/sanitize","dst":"can://typescript/dataflow-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sanitize","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2}],"param_in":[{"src":"can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/b@formal_in:0"},{"src":"can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/c@formal_in:0"},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0"},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0"},{"src":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0","dst":"can://typescript/dataflow-app/src/util.ts/increment@formal_in:0"},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0","dst":"can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0"},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0","dst":"can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0"},{"src":"can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0","dst":"can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0"},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0"},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1"},{"src":"can://typescript/dataflow-app/src/main.ts/main@6:3","dst":"can://typescript/dataflow-app/src/state.ts/bump@entry","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0","dst":"can://typescript/dataflow-app/src/state.ts/bump@formal_in:0"},{"src":"can://typescript/dataflow-app/src/main.ts/main@7:3","dst":"can://typescript/dataflow-app/src/state.ts/readCounter@entry","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/a@formal_in:0"},{"src":"can://typescript/dataflow-app/src/state.ts/churn@14:3","dst":"can://typescript/dataflow-app/src/state.ts/bump@entry","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0","dst":"can://typescript/dataflow-app/src/state.ts/bump@formal_in:0"},{"src":"can://typescript/dataflow-app/src/state.ts/churn@15:3","dst":"can://typescript/dataflow-app/src/state.ts/readCounter@entry","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0","dst":"can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0"},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0","dst":"can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0"},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0","dst":"can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0"},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0","dst":"can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0"}],"param_out":[{"src":"can://typescript/dataflow-app/src/chain.ts/a@formal_out","dst":"can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out"},{"src":"can://typescript/dataflow-app/src/chain.ts/b@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out"},{"src":"can://typescript/dataflow-app/src/chain.ts/c@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out"},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out"},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out"},{"src":"can://typescript/dataflow-app/src/flow.ts/parse@formal_out","dst":"can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out"},{"src":"can://typescript/dataflow-app/src/flow.ts/touch@formal_out","dst":"can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out"},{"src":"can://typescript/dataflow-app/src/flow.ts/touch@formal_out","dst":"can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out"},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out"},{"src":"can://typescript/dataflow-app/src/state.ts/bump@formal_out","dst":"can://typescript/dataflow-app/src/main.ts/main@6:3","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/state.ts/bump@formal_out","dst":"can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out"},{"src":"can://typescript/dataflow-app/src/state.ts/bump@formal_out","dst":"can://typescript/dataflow-app/src/state.ts/churn@14:3","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/state.ts/bump@formal_out","dst":"can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out"},{"src":"can://typescript/dataflow-app/src/state.ts/readCounter@formal_out","dst":"can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out"},{"src":"can://typescript/dataflow-app/src/state.ts/readCounter@formal_out","dst":"can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out"},{"src":"can://typescript/dataflow-app/src/susp.ts/compute@formal_out","dst":"can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/sink@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/sink@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/source@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/source@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out"},{"src":"can://typescript/dataflow-app/src/util.ts/increment@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out"}],"external_symbols":{"can://typescript/dataflow-app/@external/(builtin)/isNaN":{"id":"can://typescript/dataflow-app/@external/(builtin)/isNaN","kind":"external","module":"(builtin)","name":"isNaN"},"can://typescript/dataflow-app/@external/(builtin)/replace":{"id":"can://typescript/dataflow-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"}},"synthesized_callables":{}}} \ No newline at end of file diff --git a/test/goldens/dataflow-app.cypher b/test/goldens/dataflow-app.cypher new file mode 100644 index 0000000..8765769 --- /dev/null +++ b/test/goldens/dataflow-app.cypher @@ -0,0 +1,1303 @@ + + + + + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/chain.ts', p: {}}, + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/closures.ts', p: {}}, + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/flow.ts', p: {}}, + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/hierarchy.ts', p: {}}, + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/main.ts', p: {}}, + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/state.ts', p: {}}, + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/susp.ts', p: {}}, + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/taint.ts', p: {}}, + {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/util.ts', p: {}} + {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/a', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/b', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/c', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/isEven', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:17', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/b', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:17', t: 'can://typescript/dataflow-app/src/chain.ts/b', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', k: 'fromB|reaching-defs', p: {var: 'fromB', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/b@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@entry', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@entry', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@entry', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:17', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/c', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:17', t: 'can://typescript/dataflow-app/src/chain.ts/c', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', k: 'fromC|reaching-defs', p: {var: 'fromC', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/c@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@entry', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@entry', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', k: 'y|reaching-defs', p: {var: 'y', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@entry', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', t: 'can://typescript/dataflow-app/src/chain.ts/c@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', t: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c@entry', t: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c@entry', t: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', k: 'z|reaching-defs', p: {var: 'z', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c@entry', t: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:10', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:10', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isEven', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:10', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:10', t: 'can://typescript/dataflow-app/src/chain.ts/isEven', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:10', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/util.ts/increment', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:10', t: 'can://typescript/dataflow-app/src/util.ts/increment', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', t: 'can://typescript/dataflow-app/src/util.ts/increment@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', k: 'count|reaching-defs', p: {var: 'count', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', k: 'count|reaching-defs', p: {var: 'count', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', k: 'count|reaching-defs', p: {var: 'count', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', k: 'count|reaching-defs', p: {var: 'count', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', k: 'inc|reaching-defs', p: {var: 'inc', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', k: 'start|reaching-defs', p: {var: 'start', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', k: 'p|reaching-defs', p: {var: 'p', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', k: 'p.f|reaching-defs', p: {var: 'p.f', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', k: 'p.f|reaching-defs', p: {var: 'p.f', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/classify', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/early', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/guarded', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/parse', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/shadow', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/spin', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', k: 'label|reaching-defs', p: {var: 'label', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', k: 'label|reaching-defs', p: {var: 'label', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', t: 'can://typescript/dataflow-app/src/flow.ts/early@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', t: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', k: 'r|reaching-defs', p: {var: 'r', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@entry', t: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@entry', t: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@entry', t: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/early@entry', t: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:11', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/parse', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:11', t: 'can://typescript/dataflow-app/src/flow.ts/parse', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:13', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:11', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', k: 'v|reaching-defs', p: {var: 'v', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', k: 'v|reaching-defs', p: {var: 'v', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:7', t: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', k: 'switch_case', p: {kind: 'switch_case'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', k: 'switch_case', p: {kind: 'switch_case'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', k: 'switch_case', p: {kind: 'switch_case'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'break', p: {kind: 'break'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'break', p: {kind: 'break'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', k: 'd|reaching-defs', p: {var: 'd', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', k: 'loop_back', p: {kind: 'loop_back'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', k: 'break', p: {kind: 'break'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', t: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', t: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', k: 'acc|reaching-defs', p: {var: 'acc', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', k: 'acc|reaching-defs', p: {var: 'acc', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', k: 'loop_back', p: {kind: 'loop_back'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', k: 'acc|reaching-defs', p: {var: 'acc', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', k: 'acc|reaching-defs', p: {var: 'acc', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', t: 'can://typescript/dataflow-app/src/flow.ts/touch@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', t: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', t: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', t: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', t: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', k: 'this.height|reaching-defs', p: {var: 'this.height', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', k: 'this.width|reaching-defs', p: {var: 'this.width', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape/area', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', p: {}} + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', p: {}} + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', p: {}} + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/label', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1', p: {}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', k: 'side|reaching-defs', p: {var: 'side', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts', t: 'can://typescript/dataflow-app/src/main.ts/main', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/chain.ts/a', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:13', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:15', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@8:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/state.ts/bump@entry', p: {var: 'src/state.counter'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:13', t: 'can://typescript/dataflow-app/src/chain.ts/a', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:15', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', p: {var: 'src/state.counter'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@8:3', k: 'r|reaching-defs', p: {var: 'r', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@8:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', p: {var: 'src/state.counter'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/a@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@8:3', t: 'can://typescript/dataflow-app/src/main.ts/main@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@8:3', t: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@entry', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@entry', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@entry', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/main.ts/main@entry', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts', t: 'can://typescript/dataflow-app/src/state.ts/churn', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts', t: 'can://typescript/dataflow-app/src/state.ts/counter', p: {}} + {f: 'can://typescript/dataflow-app/src/state.ts', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', t: 'can://typescript/dataflow-app/src/state.ts/bump@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@entry', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', k: 'by|reaching-defs', p: {var: 'by', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@entry', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@entry', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@entry', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', p: {var: 'src/state.counter'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', p: {var: 'src/state.counter'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:10', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/bump@entry', p: {var: 'src/state.counter'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:10', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', p: {var: 'src/state.counter'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', p: {var: 'src/state.counter'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', k: 'by|reaching-defs', p: {var: 'by', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts', t: 'can://typescript/dataflow-app/src/susp.ts/compute', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts', t: 'can://typescript/dataflow-app/src/susp.ts/numbers', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', t: 'can://typescript/dataflow-app/src/susp.ts/compute@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', t: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', t: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', t: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', t: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/compute', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:19', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:19', t: 'can://typescript/dataflow-app/src/susp.ts/compute', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', k: 'await_resume', p: {kind: 'await_resume'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', k: 'a|reaching-defs', p: {var: 'a', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', t: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', k: 'yield', p: {kind: 'yield'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'loop_back', p: {kind: 'loop_back'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:1', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', k: 'v|reaching-defs', p: {var: 'v', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', k: 'w|reaching-defs', p: {var: 'w', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', k: 'a.f|reaching-defs', p: {var: 'a.f', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', k: 'a|reaching-defs', p: {var: 'a', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', k: 'b|reaching-defs', p: {var: 'b', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', k: 'a.f|reaching-defs', p: {var: 'a.f', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', k: 'b|reaching-defs', p: {var: 'b', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:13', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:22', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:13', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:22', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/@external/(builtin)/replace', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:10', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:1', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:10', t: 'can://typescript/dataflow-app/@external/(builtin)/replace', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:1', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', p: {}} + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', k: 's.replace|reaching-defs', p: {var: 's.replace', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', t: 'can://typescript/dataflow-app/src/taint.ts/sink@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source', t: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source', t: 'can://typescript/dataflow-app/src/taint.ts/source@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source', t: 'can://typescript/dataflow-app/src/taint.ts/source@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source', t: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', t: 'can://typescript/dataflow-app/src/taint.ts/source@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', t: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source@entry', t: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source@entry', t: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {weight: 2, prov: ['tsc', 'jelly']}} + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:13', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@formal_out', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:13', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {}} + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', p: {}} + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/util.ts', t: 'can://typescript/dataflow-app/src/util.ts/increment', p: {}} + {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', p: {}}, + {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@entry', p: {}}, + {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@exit', p: {}}, + {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@formal_in:0', p: {}}, + {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', p: {}} + {f: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', t: 'can://typescript/dataflow-app/src/util.ts/increment@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', t: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/dataflow-app/src/util.ts/increment@entry', t: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', k: 'fallthrough', p: {kind: 'fallthrough'}} + {f: 'can://typescript/dataflow-app/src/util.ts/increment@entry', t: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', k: 'v|reaching-defs', p: {var: 'v', prov: ['reaching-defs']}} + {f: 'can://typescript/dataflow-app/src/util.ts/increment@entry', t: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', p: {}} + {f: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', p: {}} + {k: 'can://typescript/dataflow-app', p: {id: 'can://typescript/dataflow-app', schema_version: '2.1.0', language: 'typescript', max_level: 4, k_limit: 3, analyzer_name: 'codeanalyzer-typescript', analyzer_version: '1.0.0'}} + {k: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', p: {id: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', kind: 'external', name: 'isNaN', module: '(builtin)'}}, + {k: 'can://typescript/dataflow-app/@external/(builtin)/replace', p: {id: 'can://typescript/dataflow-app/@external/(builtin)/replace', kind: 'external', name: 'replace', module: '(builtin)'}} + {k: 'can://typescript/dataflow-app/src/chain.ts', p: {id: 'can://typescript/dataflow-app/src/chain.ts', kind: 'module', name: 'src/chain.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 31, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a', kind: 'function', signature: 'src/chain.a', name: 'a', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 13, end_line: 16, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@14:17', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@14:17', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/b', start_line: 14, end_line: 14, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', kind: 'statement', start_line: 14, end_line: 14, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '14:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', kind: 'actual_out', of: '$ret', parent: '14:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@entry', kind: 'entry', start_line: 13, end_line: 16, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@exit', kind: 'exit', start_line: 13, end_line: 16, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b', kind: 'function', signature: 'src/chain.b', name: 'b', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 8, end_line: 11, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', kind: 'statement', start_line: 10, end_line: 10, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@9:17', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@9:17', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/c', start_line: 9, end_line: 9, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', kind: 'statement', start_line: 9, end_line: 9, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '9:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', kind: 'actual_out', of: '$ret', parent: '9:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@entry', kind: 'entry', start_line: 8, end_line: 11, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@exit', kind: 'exit', start_line: 8, end_line: 11, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@formal_in:0', kind: 'formal_in', of: 'y', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/c', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c', kind: 'function', signature: 'src/chain.c', name: 'c', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 4, end_line: 6, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', kind: 'statement', start_line: 5, end_line: 5, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/c@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@entry', kind: 'entry', start_line: 4, end_line: 6, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/c@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@exit', kind: 'exit', start_line: 4, end_line: 6, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/c@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@formal_in:0', kind: 'formal_in', of: 'z', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven', kind: 'function', signature: 'src/chain.isEven', name: 'isEven', return_type: 'boolean', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 22, end_line: 25, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:10', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:10', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/isOdd', start_line: 24, end_line: 24, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', kind: 'statement', start_line: 24, end_line: 24, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '24:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', kind: 'actual_out', of: '$ret', parent: '24:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', kind: 'entry', start_line: 22, end_line: 25, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', kind: 'exit', start_line: 22, end_line: 25, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd', kind: 'function', signature: 'src/chain.isOdd', name: 'isOdd', return_type: 'boolean', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 27, end_line: 30, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', kind: 'statement', start_line: 28, end_line: 28, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', kind: 'statement', start_line: 28, end_line: 28, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:10', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:10', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/isEven', start_line: 29, end_line: 29, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', kind: 'statement', start_line: 29, end_line: 29, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '29:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', kind: 'actual_out', of: '$ret', parent: '29:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', kind: 'entry', start_line: 27, end_line: 30, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', kind: 'exit', start_line: 27, end_line: 30, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', kind: 'function', signature: 'src/chain.viaOtherFile', name: 'viaOtherFile', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 18, end_line: 20, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:10', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:10', kind: 'call', callee: 'can://typescript/dataflow-app/src/util.ts/increment', start_line: 19, end_line: 19, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', kind: 'statement', start_line: 19, end_line: 19, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '19:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', kind: 'actual_out', of: '$ret', parent: '19:3', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', kind: 'entry', start_line: 18, end_line: 20, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', kind: 'exit', start_line: 18, end_line: 20, _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts', p: {id: 'can://typescript/dataflow-app/src/closures.ts', kind: 'module', name: 'src/closures.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 18, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', kind: 'function', signature: 'src/closures.makeCounter', name: 'makeCounter', return_type: '() => number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 3, end_line: 10, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', kind: 'arrow', signature: 'src/closures.makeCounter.inc', name: 'inc', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 5, end_line: 8, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', kind: 'statement', start_line: 6, end_line: 6, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', kind: 'entry', start_line: 5, end_line: 8, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@exit', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@exit', kind: 'exit', start_line: 5, end_line: 8, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@formal_out', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', kind: 'statement', start_line: 4, end_line: 4, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', kind: 'statement', start_line: 5, end_line: 8, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', kind: 'statement', start_line: 9, end_line: 9, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', kind: 'entry', start_line: 3, end_line: 10, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@exit', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@exit', kind: 'exit', start_line: 3, end_line: 10, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_in:0', kind: 'formal_in', of: 'start', _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_out', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias', kind: 'function', signature: 'src/closures.useAlias', name: 'useAlias', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 12, end_line: 17, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', kind: 'statement', start_line: 13, end_line: 13, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', kind: 'statement', start_line: 14, end_line: 14, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', kind: 'statement', start_line: 16, end_line: 16, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', kind: 'entry', start_line: 12, end_line: 17, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@exit', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@exit', kind: 'exit', start_line: 12, end_line: 17, _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@formal_out', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/closures.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts', p: {id: 'can://typescript/dataflow-app/src/flow.ts', kind: 'module', name: 'src/flow.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 87, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify', kind: 'function', signature: 'src/flow.classify', name: 'classify', return_type: 'string', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 3, end_line: 11, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', kind: 'statement', start_line: 10, end_line: 10, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', kind: 'statement', start_line: 4, end_line: 4, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', kind: 'statement', start_line: 5, end_line: 9, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', kind: 'statement', start_line: 6, end_line: 6, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', kind: 'entry', start_line: 3, end_line: 11, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@exit', kind: 'exit', start_line: 3, end_line: 11, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early', kind: 'function', signature: 'src/flow.early', name: 'early', return_type: 'number', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 21, end_line: 27, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', kind: 'statement', start_line: 22, end_line: 24, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', kind: 'statement', start_line: 25, end_line: 25, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', kind: 'statement', start_line: 26, end_line: 26, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@entry', kind: 'entry', start_line: 21, end_line: 27, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@exit', kind: 'exit', start_line: 21, end_line: 27, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded', kind: 'function', signature: 'src/flow.guarded', name: 'guarded', return_type: 'number', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 37, end_line: 47, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', kind: 'statement', start_line: 38, end_line: 38, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:11', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:11', kind: 'call', callee: 'can://typescript/dataflow-app/src/flow.ts/parse', start_line: 40, end_line: 40, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', kind: 'statement', start_line: 40, end_line: 40, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '40:5', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', kind: 'actual_out', of: '$ret', parent: '40:5', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', kind: 'statement', start_line: 41, end_line: 43, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', kind: 'statement', start_line: 42, end_line: 42, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', kind: 'call', callee: 'can://typescript/dataflow-app/src/flow.ts/touch', start_line: 44, end_line: 44, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '44:5', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out', kind: 'actual_out', of: '$ret', parent: '44:5', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', kind: 'statement', start_line: 46, end_line: 46, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', kind: 'entry', start_line: 37, end_line: 47, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', kind: 'exit', start_line: 37, end_line: 47, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse', kind: 'function', signature: 'src/flow.parse', name: 'parse', return_type: 'number', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 29, end_line: 35, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@30:13', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@30:13', kind: 'call', start_line: 30, end_line: 30, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', kind: 'statement', start_line: 30, end_line: 30, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '30:3', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_out', kind: 'actual_out', of: '$ret', parent: '30:3', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', kind: 'statement', start_line: 31, end_line: 33, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '31:3', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_out', kind: 'actual_out', of: '$ret', parent: '31:3', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@31:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@31:7', kind: 'call', callee: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', start_line: 31, end_line: 31, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@32:11', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@32:11', kind: 'call', start_line: 32, end_line: 32, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', kind: 'statement', start_line: 32, end_line: 32, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '32:5', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_out', kind: 'actual_out', of: '$ret', parent: '32:5', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', kind: 'statement', start_line: 34, end_line: 34, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', kind: 'entry', start_line: 29, end_line: 35, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', kind: 'exit', start_line: 29, end_line: 35, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay', kind: 'function', signature: 'src/flow.pickDay', name: 'pickDay', return_type: 'string', cyclomatic_complexity: 3, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 53, end_line: 66, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', kind: 'statement', start_line: 54, end_line: 54, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', kind: 'statement', start_line: 55, end_line: 64, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', kind: 'statement', start_line: 57, end_line: 57, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', kind: 'statement', start_line: 58, end_line: 58, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', kind: 'statement', start_line: 60, end_line: 60, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', kind: 'statement', start_line: 61, end_line: 61, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', kind: 'statement', start_line: 63, end_line: 63, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', kind: 'statement', start_line: 65, end_line: 65, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', kind: 'entry', start_line: 53, end_line: 66, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@exit', kind: 'exit', start_line: 53, end_line: 66, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_in:0', kind: 'formal_in', of: 'd', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow', kind: 'function', signature: 'src/flow.shadow', name: 'shadow', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 79, end_line: 86, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', kind: 'statement', start_line: 80, end_line: 80, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', kind: 'statement', start_line: 82, end_line: 82, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', kind: 'call', callee: 'can://typescript/dataflow-app/src/flow.ts/touch', start_line: 83, end_line: 83, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '83:5', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out', kind: 'actual_out', of: '$ret', parent: '83:5', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', kind: 'statement', start_line: 85, end_line: 85, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', kind: 'entry', start_line: 79, end_line: 86, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', kind: 'exit', start_line: 79, end_line: 86, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin', kind: 'function', signature: 'src/flow.spin', name: 'spin', return_type: 'number', cyclomatic_complexity: 3, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 68, end_line: 77, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', kind: 'statement', start_line: 69, end_line: 69, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', kind: 'statement', start_line: 70, end_line: 75, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', kind: 'statement', start_line: 71, end_line: 71, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', kind: 'statement', start_line: 72, end_line: 74, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', kind: 'statement', start_line: 73, end_line: 73, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', kind: 'statement', start_line: 76, end_line: 76, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', kind: 'entry', start_line: 68, end_line: 77, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@exit', kind: 'exit', start_line: 68, end_line: 77, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/spin@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo', kind: 'function', signature: 'src/flow.sumTo', name: 'sumTo', return_type: 'number', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 13, end_line: 19, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', kind: 'statement', start_line: 14, end_line: 14, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', kind: 'statement', start_line: 15, end_line: 17, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', kind: 'statement', start_line: 16, end_line: 16, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', kind: 'statement', start_line: 18, end_line: 18, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', kind: 'entry', start_line: 13, end_line: 19, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@exit', kind: 'exit', start_line: 13, end_line: 19, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch', kind: 'function', signature: 'src/flow.touch', name: 'touch', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 49, end_line: 51, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', kind: 'statement', start_line: 50, end_line: 50, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', kind: 'entry', start_line: 49, end_line: 51, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/touch@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@exit', kind: 'exit', start_line: 49, end_line: 51, _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts', kind: 'module', name: 'src/hierarchy.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 34, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', kind: 'interface', signature: 'src/hierarchy.ColoredShape', name: 'ColoredShape', base_classes: ['src/hierarchy.Shape'], is_exported: true, is_ambient: false, start_line: 12, end_line: 14}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color', kind: 'field', name: 'color', type: 'string', start_line: 13, end_line: 13, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', kind: 'interface', signature: 'src/hierarchy.Labeled', name: 'Labeled', is_exported: true, is_ambient: false, start_line: 8, end_line: 10}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label', kind: 'field', name: 'label', type: 'string', start_line: 9, end_line: 9, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', kind: 'class', signature: 'src/hierarchy.Rectangle', name: 'Rectangle', base_classes: ['src/hierarchy.Shape'], implements_types: ['src/hierarchy.Shape'], is_abstract: false, is_exported: true, is_ambient: false, start_line: 16, end_line: 25}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', kind: 'method', signature: 'src/hierarchy.Rectangle.area', name: 'area', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 22, end_line: 24, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', kind: 'entry', start_line: 22, end_line: 24, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@exit', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@exit', kind: 'exit', start_line: 22, end_line: 24, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@formal_out', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', kind: 'constructor', signature: 'src/hierarchy.Rectangle.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 17, end_line: 20, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@entry', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@entry', kind: 'entry', start_line: 17, end_line: 20, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@exit', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@exit', kind: 'exit', start_line: 17, end_line: 20, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0', kind: 'formal_in', of: 'width', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1', kind: 'formal_in', of: 'height', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height', kind: 'field', name: 'height', type: 'number', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width', kind: 'field', name: 'width', type: 'number', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', kind: 'interface', signature: 'src/hierarchy.Shape', name: 'Shape', is_exported: true, is_ambient: false, start_line: 4, end_line: 6}} + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape/area', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape/area', kind: 'method', signature: 'src/hierarchy.Shape.area', name: 'area', return_type: 'number', cyclomatic_complexity: 0, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 5, end_line: 5, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', kind: 'class', signature: 'src/hierarchy.Square', name: 'Square', base_classes: ['src/hierarchy.Rectangle', 'src/hierarchy.Labeled'], implements_types: ['src/hierarchy.Labeled'], is_abstract: false, is_exported: true, is_ambient: false, start_line: 27, end_line: 33}} + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', kind: 'constructor', signature: 'src/hierarchy.Square.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 30, end_line: 32, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', kind: 'call', callee: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', start_line: 31, end_line: 31, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '31:5', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '31:5', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out', kind: 'actual_out', of: '$ret', parent: '31:5', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', kind: 'entry', start_line: 30, end_line: 32, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', kind: 'exit', start_line: 30, end_line: 32, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_in:0', kind: 'formal_in', of: 'side', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_out', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/label', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/label', kind: 'field', name: 'label', type: '"square"', start_line: 28, end_line: 28, _module: 'src/hierarchy.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts', p: {id: 'can://typescript/dataflow-app/src/main.ts', kind: 'module', name: 'src/main.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 10, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main', p: {id: 'can://typescript/dataflow-app/src/main.ts/main', kind: 'function', signature: 'src/main.main', name: 'main', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 5, end_line: 9, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@6:3', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@6:3', kind: 'call', callee: 'can://typescript/dataflow-app/src/state.ts/bump', start_line: 6, end_line: 6, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '6:3', _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out', kind: 'actual_out', of: '$ret', parent: '6:3', _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@7:13', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:13', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/a', start_line: 7, end_line: 7, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@7:15', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:15', kind: 'call', callee: 'can://typescript/dataflow-app/src/state.ts/readCounter', start_line: 7, end_line: 7, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@7:3', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:3', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '7:3', _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', kind: 'actual_out', of: '$ret', parent: '7:3', _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@8:3', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@8:3', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@entry', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@entry', kind: 'entry', start_line: 5, end_line: 9, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@exit', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@exit', kind: 'exit', start_line: 5, end_line: 9, _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/main.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts', p: {id: 'can://typescript/dataflow-app/src/state.ts', kind: 'module', name: 'src/state.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 17, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/bump', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump', kind: 'function', signature: 'src/state.bump', name: 'bump', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 5, end_line: 7, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', kind: 'statement', start_line: 6, end_line: 6, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/bump@entry', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@entry', kind: 'entry', start_line: 5, end_line: 7, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/bump@exit', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@exit', kind: 'exit', start_line: 5, end_line: 7, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', kind: 'formal_in', of: 'by', _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn', kind: 'function', signature: 'src/state.churn', name: 'churn', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 13, end_line: 16, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', kind: 'call', callee: 'can://typescript/dataflow-app/src/state.ts/bump', start_line: 14, end_line: 14, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '14:3', _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out', kind: 'actual_out', of: '$ret', parent: '14:3', _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@15:10', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@15:10', kind: 'call', callee: 'can://typescript/dataflow-app/src/state.ts/readCounter', start_line: 15, end_line: 15, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out', kind: 'actual_out', of: '$ret', parent: '15:3', _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@entry', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@entry', kind: 'entry', start_line: 13, end_line: 16, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@exit', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@exit', kind: 'exit', start_line: 13, end_line: 16, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@formal_in:0', kind: 'formal_in', of: 'by', _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/counter', p: {id: 'can://typescript/dataflow-app/src/state.ts/counter', kind: 'field', name: 'counter', type: 'number', start_line: 3, end_line: 3, _module: 'src/state.ts'}} + {k: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter', kind: 'function', signature: 'src/state.readCounter', name: 'readCounter', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 9, end_line: 11, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', kind: 'statement', start_line: 10, end_line: 10, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', kind: 'entry', start_line: 9, end_line: 11, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/readCounter@exit', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter@exit', kind: 'exit', start_line: 9, end_line: 11, _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/state.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts', p: {id: 'can://typescript/dataflow-app/src/susp.ts', kind: 'module', name: 'src/susp.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 26, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/compute', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute', kind: 'function', signature: 'src/susp.compute', name: 'compute', return_type: 'Promise', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: true, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 3, end_line: 5, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', kind: 'statement', start_line: 4, end_line: 4, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', kind: 'entry', start_line: 3, end_line: 5, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/compute@exit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@exit', kind: 'exit', start_line: 3, end_line: 5, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', kind: 'function', signature: 'src/susp.fetchTotal', name: 'fetchTotal', return_type: 'Promise', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: true, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 7, end_line: 10, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:19', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:19', kind: 'call', callee: 'can://typescript/dataflow-app/src/susp.ts/compute', start_line: 8, end_line: 8, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '8:3', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', kind: 'actual_out', of: '$ret', parent: '8:3', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', kind: 'statement', start_line: 9, end_line: 9, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', kind: 'entry', start_line: 7, end_line: 10, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', kind: 'exit', start_line: 7, end_line: 10, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers', kind: 'function', signature: 'src/susp.numbers', name: 'numbers', return_type: 'Generator', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: true, is_exported: true, is_ambient: false, is_implicit: false, start_line: 12, end_line: 19, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', kind: 'statement', start_line: 13, end_line: 13, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', kind: 'statement', start_line: 14, end_line: 17, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', kind: 'statement', start_line: 16, end_line: 16, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', kind: 'statement', start_line: 18, end_line: 18, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', kind: 'entry', start_line: 12, end_line: 19, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@exit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@exit', kind: 'exit', start_line: 12, end_line: 19, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', kind: 'function', signature: 'src/susp.shortCircuit', name: 'shortCircuit', return_type: 'number', cyclomatic_complexity: 4, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 21, end_line: 25, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', kind: 'statement', start_line: 22, end_line: 22, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', kind: 'statement', start_line: 24, end_line: 24, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', kind: 'entry', start_line: 21, end_line: 25, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@exit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@exit', kind: 'exit', start_line: 21, end_line: 25, _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:0', kind: 'formal_in', of: 'a', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:1', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:1', kind: 'formal_in', of: 'b', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/susp.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts', p: {id: 'can://typescript/dataflow-app/src/taint.ts', kind: 'module', name: 'src/taint.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 27, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', kind: 'function', signature: 'src/taint.safeFlow', name: 'safeFlow', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 23, end_line: 26, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:13', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:13', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/sanitize', start_line: 24, end_line: 24, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:22', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:22', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/source', start_line: 24, end_line: 24, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', kind: 'statement', start_line: 24, end_line: 24, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '24:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', kind: 'actual_out', of: '$ret', parent: '24:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/sink', start_line: 25, end_line: 25, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '25:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out', kind: 'actual_out', of: '$ret', parent: '25:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', kind: 'entry', start_line: 23, end_line: 26, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', kind: 'exit', start_line: 23, end_line: 26, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize', kind: 'function', signature: 'src/taint.sanitize', name: 'sanitize', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 10, end_line: 12, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:10', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:10', kind: 'call', callee: 'can://typescript/dataflow-app/@external/(builtin)/replace', start_line: 11, end_line: 11, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', kind: 'statement', start_line: 11, end_line: 11, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '11:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:1', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '11:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', kind: 'actual_out', of: '$ret', parent: '11:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', kind: 'entry', start_line: 10, end_line: 12, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', kind: 'exit', start_line: 10, end_line: 12, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink', kind: 'function', signature: 'src/taint.sink', name: 'sink', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 14, end_line: 16, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', kind: 'entry', start_line: 14, end_line: 16, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sink@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@exit', kind: 'exit', start_line: 14, end_line: 16, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/source', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source', kind: 'function', signature: 'src/taint.source', name: 'source', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 6, end_line: 8, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/source@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source@entry', kind: 'entry', start_line: 6, end_line: 8, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/source@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source@exit', kind: 'exit', start_line: 6, end_line: 8, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', kind: 'function', signature: 'src/taint.unsafeFlow', name: 'unsafeFlow', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 18, end_line: 21, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:13', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:13', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/source', start_line: 19, end_line: 19, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', kind: 'statement', start_line: 19, end_line: 19, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out', kind: 'actual_out', of: '$ret', parent: '19:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/sink', start_line: 20, end_line: 20, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '20:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out', kind: 'actual_out', of: '$ret', parent: '20:3', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', kind: 'entry', start_line: 18, end_line: 21, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', kind: 'exit', start_line: 18, end_line: 21, _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, + {k: 'can://typescript/dataflow-app/src/util.ts', p: {id: 'can://typescript/dataflow-app/src/util.ts', kind: 'module', name: 'src/util.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 4, _module: 'src/util.ts'}} + {k: 'can://typescript/dataflow-app/src/util.ts/increment', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment', kind: 'function', signature: 'src/util.increment', name: 'increment', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 1, end_line: 3, _module: 'src/util.ts'}} + {k: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', kind: 'statement', start_line: 2, end_line: 2, _module: 'src/util.ts'}}, + {k: 'can://typescript/dataflow-app/src/util.ts/increment@entry', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@entry', kind: 'entry', start_line: 1, end_line: 3, _module: 'src/util.ts'}}, + {k: 'can://typescript/dataflow-app/src/util.ts/increment@exit', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@exit', kind: 'exit', start_line: 1, end_line: 3, _module: 'src/util.ts'}}, + {k: 'can://typescript/dataflow-app/src/util.ts/increment@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@formal_in:0', kind: 'formal_in', of: 'v', _module: 'src/util.ts'}}, + {k: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}} +// ── constraints & indexes ── +// ── nodes ── +// ── relationships ── +// ── wipe this project's prior subgraph (external targets are shared) ── +CREATE CONSTRAINT application_id IF NOT EXISTS FOR (x:Application) REQUIRE x.id IS UNIQUE; +CREATE CONSTRAINT cannode_id IF NOT EXISTS FOR (x:CanNode) REQUIRE x.id IS UNIQUE; +CREATE INDEX callable_name IF NOT EXISTS FOR (c:TSCallable) ON (c.name); +CREATE INDEX cannode_kind IF NOT EXISTS FOR (n:CanNode) ON (n.kind); +CREATE INDEX cannode_module IF NOT EXISTS FOR (n:CanNode) ON (n._module); +DETACH DELETE x, m, a; +MATCH (a:Application {id: 'can://typescript/dataflow-app'}) +MATCH (a:Application {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MERGE (a)-[r:TS_CALLS]->(b) +MERGE (a)-[r:TS_CDG]->(b) +MERGE (a)-[r:TS_CFG_NEXT {_k: row.k}]->(b) +MERGE (a)-[r:TS_DDG {_k: row.k}]->(b) +MERGE (a)-[r:TS_DECLARES]->(b) +MERGE (a)-[r:TS_EXTENDS]->(b) +MERGE (a)-[r:TS_HAS_BODY_NODE]->(b) +MERGE (a)-[r:TS_HAS_FIELD]->(b) +MERGE (a)-[r:TS_HAS_METHOD]->(b) +MERGE (a)-[r:TS_HAS_MODULE]->(b) +MERGE (a)-[r:TS_IMPLEMENTS]->(b) +MERGE (a)-[r:TS_PARAM_IN]->(b) +MERGE (a)-[r:TS_PARAM_OUT]->(b) +MERGE (a)-[r:TS_RESOLVES_TO]->(b) +MERGE (a)-[r:TS_SUMMARY]->(b) +MERGE (n:Application {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +OPTIONAL MATCH (a)-[:TS_HAS_MODULE]->(m:TSModule) +OPTIONAL MATCH (m)-[:TS_DECLARES|TS_HAS_METHOD|TS_HAS_FIELD|TS_HAS_BODY_NODE*1..]->(x) +SET n += row.p, n:TSApplication; +SET n += row.p, n:TSBodyNode; +SET n += row.p, n:TSCallable; +SET n += row.p, n:TSClass; +SET n += row.p, n:TSExternal; +SET n += row.p, n:TSField; +SET n += row.p, n:TSInterface; +SET n += row.p, n:TSModule; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row \ No newline at end of file diff --git a/test/goldens/sample-app-a1.json b/test/goldens/sample-app-a1.json new file mode 100644 index 0000000..1a03271 --- /dev/null +++ b/test/goldens/sample-app-a1.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"types":{"UserController":{"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","qualified_name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"callables":{"show":{"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","qualified_name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/show","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"body":{"20:18":{"method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":null},"21:12":{"method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":null}}},"list":{"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/list","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"body":{"26:12":{"method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":null}}},"constructor":{"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"body":{}}},"fields":{"service":{"name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController/service","kind":"field"}}}},"functions":{"Controller":{"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller/","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"body":{}}}},"Get":{"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get/","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"body":{}}}},"Param":{"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param/","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"body":{}}}}},"fields":{}},"src/external-calls.ts":{"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3089]},"types":{},"functions":{"readsConfig":{"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/readsConfig","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]},"body":{"15:10":{"method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[938,973]},"callee":null}}},"makesCommand":{"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesCommand","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]},"body":{"27:15":{"method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1617,1630]},"callee":null},"28:3":{"method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1634,1669]},"callee":null},"28:3/2":{"method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1634,1649]},"callee":null},"29:3":{"method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1673,1702]},"callee":null}}},"makesDriver":{"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesDriver","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]},"body":{"39:10":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2044,2076]},"callee":null}}},"makesSession":{"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesSession","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]},"body":{"52:13":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2800,2866]},"callee":null},"52:46":{"method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2833,2865]},"callee":null},"53:13":{"method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2880,2891]},"callee":null},"54:3":{"method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2895,2908]},"callee":null}}},"unsafeEval":{"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]},"body":{"60:10":{"method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3076,3085]},"callee":null}}}},"fields":{}},"src/external.ts":{"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,578]},"types":{},"functions":{"fingerprint":{"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/fingerprint","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]},"body":{"7:14":{"method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[340,352]},"callee":null},"8:10":{"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[363,425]},"callee":null},"8:10/2":{"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[363,406]},"callee":null},"8:10/3":{"method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[363,383]},"callee":null}}},"extensionOf":{"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/extensionOf","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]},"body":{"15:10":{"method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[556,574]},"callee":null}}}},"fields":{}},"src/index.ts":{"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37}],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"types":{},"functions":{"main":{"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/index.ts/main","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"body":{"7:19":{"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":null},"8:3":{"method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":null},"9:3":{"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":null},"11:22":{"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":null},"12:3":{"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":null},"13:3":{"method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":null},"16:3":{"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":null},"16:12":{"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":null},"17:3":{"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":null},"17:12":{"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":null},"19:16":{"method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":null},"20:19":{"method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":null},"21:3":{"method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":null},"21:3/2":{"method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":null},"21:3/3":{"method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":null},"22:3":{"method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":null}}}},"fields":{}},"src/models.ts":{"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"types":{"Entity":{"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"is_abstract":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"callables":{"describe":{"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"id":"can://typescript/sample-app/src/models.ts/Entity/describe","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Entity/constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"body":{}}},"fields":{"id":{"name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Entity/id","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Identifiable"]},"User":{"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"callables":{"describe":{"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/describe","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"body":{}},"recordLogin":{"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/recordLogin","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"body":{"40:5":{"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":null}}},"isAdmin#get":{"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"kind":"getter","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/isAdmin","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"body":{}}},"fields":{"loginCount":{"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]}},"instances":{"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]}},"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/name","kind":"field"},"role":{"name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/role","kind":"field"}},"extends_ids":["can://typescript/sample-app/src/models.ts/Entity"],"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Robot":{"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"callables":{"describe":{"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/describe","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Robot/name","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Identifiable":{"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"callables":{},"fields":{"id":{"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]}}}},"Named":{"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"callables":{"describe":{"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Named/describe","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]}}}},"Role":{"name":"Role","signature":"src/models.Role","comments":[],"is_const":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"fields":{"Admin":{"name":"Admin","value":"admin","id":"can://typescript/sample-app/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]}},"Member":{"name":"Member","value":"member","id":"can://typescript/sample-app/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]}},"Guest":{"name":"Guest","value":"guest","id":"can://typescript/sample-app/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]}}}},"Flag":{"name":"Flag","signature":"src/models.Flag","comments":[],"is_const":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"fields":{"None":{"name":"None","value":"0","id":"can://typescript/sample-app/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]}},"Active":{"name":"Active","value":"1","id":"can://typescript/sample-app/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]}}}},"UserId":{"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]}}},"functions":{},"fields":{}},"src/services.ts":{"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"types":{"UserService":{"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"callables":{"create":{"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/create","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"body":{"25:16":{"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":null},"26:18":{"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":null},"27:5":{"method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":null}}},"createGuest":{"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/createGuest","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"body":{"32:18":{"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":null},"33:12":{"method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":null}}},"describeAll":{"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"body":{"37:12":{"method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":null}},"callables":{"":{"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"body":{}}}},"loginAll":{"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/loginAll","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"body":{"43:22":{"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":null}}},"constructor":{"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"body":{}}},"fields":{"users":{"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]}},"startId":{"name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/startId","kind":"field"}}}},"functions":{"makeGuestName":{"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/makeGuestName","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"body":{}},"announce":{"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/announce","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"body":{"13:10":{"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":null}}},"nextId":{"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/nextId","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"body":{}}},"fields":{}},"src/util.ts":{"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"types":{"StringUtil":{"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"types":{"Builder":{"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"callables":{"add":{"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"body":{"14:7":{"method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":null},"14:23":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":null}}},"build":{"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"body":{"18:14":{"method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":null}}},"constructor":{"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"body":{}}},"fields":{"parts":{"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]}}}}},"functions":{"repeat":{"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"body":{"4:12":{"method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":null},"4:12/2":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":null}}},"slug":{"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/slug","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"body":{"8:12":{"method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":null},"8:12/2":{"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":null}}}},"fields":{}}},"functions":{"classify":{"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"body":{"30:15":{"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":null},"31:5":{"method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":null}},"callables":{"keyOf":{"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify/keyOf","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"body":{"26:12":{"method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":null}}}}}},"fields":{}}},"call_graph":[],"param_in":[],"param_out":[]}} \ No newline at end of file diff --git a/test/goldens/sample-app-a2.json b/test/goldens/sample-app-a2.json new file mode 100644 index 0000000..e78e079 --- /dev/null +++ b/test/goldens/sample-app-a2.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"types":{"UserController":{"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","qualified_name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"callables":{"show":{"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","qualified_name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/show","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"body":{"20:18":{"method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"21:12":{"method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/sample-app/src/models.ts/User/describe"}}},"list":{"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/list","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"body":{"26:12":{"method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/sample-app/src/services.ts/UserService/describeAll"}}},"constructor":{"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"body":{}}},"fields":{"service":{"name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController/service","kind":"field"}}}},"functions":{"Controller":{"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller/","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"body":{}}}},"Get":{"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get/","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"body":{}}}},"Param":{"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param/","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"body":{}}}}},"fields":{}},"src/external-calls.ts":{"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3089]},"types":{},"functions":{"readsConfig":{"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/readsConfig","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]},"body":{"15:10":{"method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[938,973]},"callee":"can://typescript/sample-app/@external/node:fs/readFileSync"}}},"makesCommand":{"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesCommand","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]},"body":{"27:15":{"method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1617,1630]},"callee":"can://typescript/sample-app/@external/commander/Command"},"28:3":{"method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1634,1669]},"callee":"can://typescript/sample-app/@external/commander/description"},"28:3/2":{"method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1634,1649]},"callee":"can://typescript/sample-app/@external/commander/name"},"29:3":{"method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1673,1702]},"callee":"can://typescript/sample-app/@external/commander/parse"}}},"makesDriver":{"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesDriver","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]},"body":{"39:10":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2044,2076]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"}}},"makesSession":{"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesSession","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]},"body":{"52:13":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2800,2866]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"52:46":{"method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2833,2865]},"callee":"can://typescript/sample-app/@external/neo4j-driver/basic"},"53:13":{"method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2880,2891]},"callee":"can://typescript/sample-app/@external/neo4j-driver-core/session"},"54:3":{"method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2895,2908]},"callee":"can://typescript/sample-app/@external/neo4j-driver/rxSession"}}},"unsafeEval":{"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]},"body":{"60:10":{"method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3076,3085]},"callee":"can://typescript/sample-app/@external/(builtin)/eval"}}}},"fields":{}},"src/external.ts":{"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,578]},"types":{},"functions":{"fingerprint":{"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/fingerprint","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]},"body":{"7:14":{"method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[340,352]},"callee":"can://typescript/sample-app/@external/node:crypto/randomUUID"},"8:10":{"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[363,425]},"callee":null},"8:10/2":{"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[363,406]},"callee":null},"8:10/3":{"method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[363,383]},"callee":"can://typescript/sample-app/@external/node:crypto/createHash"}}},"extensionOf":{"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/extensionOf","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]},"body":{"15:10":{"method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[556,574]},"callee":"can://typescript/sample-app/@external/node:path/extname"}}}},"fields":{}},"src/index.ts":{"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37}],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"types":{},"functions":{"main":{"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/index.ts/main","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"body":{"7:19":{"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/sample-app/src/services.ts/UserService/constructor"},"8:3":{"method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"9:3":{"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/sample-app/src/services.ts/UserService/createGuest"},"11:22":{"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/constructor"},"12:3":{"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/list"},"13:3":{"method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/show"},"16:3":{"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"16:12":{"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"17:3":{"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"17:12":{"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/sample-app/src/models.ts/Robot/constructor"},"19:16":{"method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/repeat"},"20:19":{"method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor"},"21:3":{"method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build"},"21:3/2":{"method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"21:3/3":{"method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"22:3":{"method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/sample-app/@external/(builtin)/log"}}}},"fields":{}},"src/models.ts":{"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"types":{"Entity":{"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"is_abstract":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"callables":{"describe":{"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"id":"can://typescript/sample-app/src/models.ts/Entity/describe","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Entity/constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"body":{}}},"fields":{"id":{"name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Entity/id","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Identifiable"]},"User":{"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"callables":{"describe":{"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/describe","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"body":{}},"recordLogin":{"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/recordLogin","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"body":{"40:5":{"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/sample-app/src/models.ts/Entity/constructor"}}},"isAdmin#get":{"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"kind":"getter","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/isAdmin","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"body":{}}},"fields":{"loginCount":{"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]}},"instances":{"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]}},"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/name","kind":"field"},"role":{"name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/role","kind":"field"}},"extends_ids":["can://typescript/sample-app/src/models.ts/Entity"],"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Robot":{"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"callables":{"describe":{"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/describe","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Robot/name","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Identifiable":{"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"callables":{},"fields":{"id":{"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]}}}},"Named":{"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"callables":{"describe":{"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Named/describe","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]}}}},"Role":{"name":"Role","signature":"src/models.Role","comments":[],"is_const":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"fields":{"Admin":{"name":"Admin","value":"admin","id":"can://typescript/sample-app/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]}},"Member":{"name":"Member","value":"member","id":"can://typescript/sample-app/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]}},"Guest":{"name":"Guest","value":"guest","id":"can://typescript/sample-app/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]}}}},"Flag":{"name":"Flag","signature":"src/models.Flag","comments":[],"is_const":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"fields":{"None":{"name":"None","value":"0","id":"can://typescript/sample-app/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]}},"Active":{"name":"Active","value":"1","id":"can://typescript/sample-app/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]}}}},"UserId":{"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]}}},"functions":{},"fields":{}},"src/services.ts":{"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"types":{"UserService":{"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"callables":{"create":{"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/create","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"body":{"25:16":{"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/sample-app/src/services.ts/nextId"},"26:18":{"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"27:5":{"method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/sample-app/@external/(builtin)/push"}}},"createGuest":{"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/createGuest","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"body":{"32:18":{"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/sample-app/src/services.ts/makeGuestName"},"33:12":{"method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"}}},"describeAll":{"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"body":{"37:12":{"method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/sample-app/@external/(builtin)/map"}},"callables":{"":{"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"body":{}}}},"loginAll":{"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/loginAll","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"body":{"43:22":{"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/sample-app/src/models.ts/User/recordLogin"}}},"constructor":{"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"body":{}}},"fields":{"users":{"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]}},"startId":{"name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/startId","kind":"field"}}}},"functions":{"makeGuestName":{"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/makeGuestName","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"body":{}},"announce":{"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/announce","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"body":{"13:10":{"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/sample-app/src/models.ts/Named/describe"}}},"nextId":{"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/nextId","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"body":{}}},"fields":{}},"src/util.ts":{"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"types":{"StringUtil":{"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"types":{"Builder":{"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"callables":{"add":{"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"body":{"14:7":{"method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"14:23":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"}}},"build":{"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"body":{"18:14":{"method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/sample-app/@external/(builtin)/join"}}},"constructor":{"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"body":{}}},"fields":{"parts":{"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]}}}}},"functions":{"repeat":{"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"body":{"4:12":{"method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/sample-app/@external/(builtin)/repeat"},"4:12/2":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"}}},"slug":{"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/slug","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"body":{"8:12":{"method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/sample-app/@external/(builtin)/replace"},"8:12/2":{"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/sample-app/@external/(builtin)/toLowerCase"}}}},"fields":{}}},"functions":{"classify":{"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"body":{"30:15":{"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/sample-app/src/util.ts/classify/keyOf"},"31:5":{"method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/sample-app/@external/(builtin)/push"}},"callables":{"keyOf":{"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify/keyOf","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"body":{"26:12":{"method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/sample-app/@external/(builtin)/charAt"}}}}}},"fields":{}}},"call_graph":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/external-calls.ts/readsConfig","dst":"can://typescript/sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesDriver","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","dst":"can://typescript/sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/extensionOf","dst":"can://typescript/sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/list","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/announce","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/models.ts/User/constructor","dst":"can://typescript/sample-app/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Robot/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/services.ts/nextId","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/makeGuestName","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/loginAll","dst":"can://typescript/sample-app/src/models.ts/User/recordLogin","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/src/util.ts/classify/keyOf","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/classify/keyOf","dst":"can://typescript/sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Param","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["jelly"],"weight":1}],"param_in":[],"param_out":[],"external_symbols":{"can://typescript/sample-app/@external/node:fs/readFileSync":{"id":"can://typescript/sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://typescript/sample-app/@external/commander/Command":{"id":"can://typescript/sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://typescript/sample-app/@external/commander/description":{"id":"can://typescript/sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://typescript/sample-app/@external/commander/name":{"id":"can://typescript/sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://typescript/sample-app/@external/commander/parse":{"id":"can://typescript/sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://typescript/sample-app/@external/neo4j-driver/driver":{"id":"can://typescript/sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://typescript/sample-app/@external/neo4j-driver/basic":{"id":"can://typescript/sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://typescript/sample-app/@external/neo4j-driver-core/session":{"id":"can://typescript/sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://typescript/sample-app/@external/neo4j-driver/rxSession":{"id":"can://typescript/sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://typescript/sample-app/@external/(builtin)/eval":{"id":"can://typescript/sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://typescript/sample-app/@external/node:crypto/randomUUID":{"id":"can://typescript/sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://typescript/sample-app/@external/node:crypto/createHash":{"id":"can://typescript/sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://typescript/sample-app/@external/node:path/extname":{"id":"can://typescript/sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://typescript/sample-app/@external/(builtin)/log":{"id":"can://typescript/sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/sample-app/@external/(builtin)/push":{"id":"can://typescript/sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/sample-app/@external/(builtin)/map":{"id":"can://typescript/sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/sample-app/@external/(builtin)/charAt":{"id":"can://typescript/sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/sample-app/@external/(builtin)/repeat":{"id":"can://typescript/sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/sample-app/@external/(builtin)/replace":{"id":"can://typescript/sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/sample-app/@external/(builtin)/toLowerCase":{"id":"can://typescript/sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/sample-app/@external/(builtin)/join":{"id":"can://typescript/sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/sample-app/src/controllers.ts/Controller@5:10":{"id":"can://typescript/sample-app/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Get@8:10":{"id":"can://typescript/sample-app/src/controllers.ts/Get/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Param@11:10":{"id":"can://typescript/sample-app/src/controllers.ts/Param/","kind":"callable"},"can://typescript/sample-app/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/sample-app-a3.json b/test/goldens/sample-app-a3.json new file mode 100644 index 0000000..98a91c4 --- /dev/null +++ b/test/goldens/sample-app-a3.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"types":{"UserController":{"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","qualified_name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"callables":{"show":{"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","qualified_name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/show","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"body":{"20:18":{"method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"21:12":{"method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/sample-app/src/models.ts/User/describe"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]}},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]}},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]}},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]}}},"cfg":[{"src":"@entry","dst":"20:5","kind":"fallthrough"},{"src":"20:5","dst":"@exit","kind":"exception"},{"src":"20:5","dst":"21:5","kind":"fallthrough"},{"src":"21:5","dst":"@exit","kind":"exception"},{"src":"21:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:5"},{"src":"20:5","dst":"21:5"}],"ddg":[{"src":"@entry","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"this.service.create","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]}]},"list":{"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/list","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"body":{"26:12":{"method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/sample-app/src/services.ts/UserService/describeAll"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]}},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]}}},"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"this.service.describeAll","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]}},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"service":{"name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController/service","kind":"field"}}}},"functions":{"Controller":{"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]}}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller/","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]}},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]}},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]}}},"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[]}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[]},"Get":{"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]}},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]}}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get/","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]}},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]}},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]}}},"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[]}},"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[]},"Param":{"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]}},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]}}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param/","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]}},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]}},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]}}},"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[]}},"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[]}},"fields":{}},"src/external-calls.ts":{"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3089]},"types":{},"functions":{"readsConfig":{"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/readsConfig","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]},"body":{"15:10":{"method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[938,973]},"callee":"can://typescript/sample-app/@external/node:fs/readFileSync"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,46],"bytes":[931,974]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]}}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[]},"makesCommand":{"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesCommand","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]},"body":{"27:15":{"method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1617,1630]},"callee":"can://typescript/sample-app/@external/commander/Command"},"28:3":{"method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1634,1669]},"callee":"can://typescript/sample-app/@external/commander/description"},"28:3/2":{"method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1634,1649]},"callee":"can://typescript/sample-app/@external/commander/name"},"29:3":{"method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1673,1702]},"callee":"can://typescript/sample-app/@external/commander/parse"},"@entry":{"kind":"entry","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]}},"27:3":{"kind":"statement","span":{"start":[27,3],"end":[27,29],"bytes":[1605,1631]}},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,14],"bytes":[1706,1717]}},"@exit":{"kind":"exit","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]}}},"cfg":[{"src":"@entry","dst":"27:3","kind":"fallthrough"},{"src":"27:3","dst":"@exit","kind":"exception"},{"src":"27:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"@exit","kind":"exception"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"27:3"},{"src":"27:3","dst":"28:3"},{"src":"28:3","dst":"29:3"},{"src":"29:3","dst":"30:3"}],"ddg":[{"src":"27:3","dst":"28:3","var":"cmd.name","prov":["reaching-defs"]},{"src":"27:3","dst":"29:3","var":"cmd.parse","prov":["reaching-defs"]},{"src":"27:3","dst":"30:3","var":"cmd","prov":["reaching-defs"]}]},"makesDriver":{"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesDriver","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]},"body":{"39:10":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2044,2076]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"@entry":{"kind":"entry","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]}},"39:3":{"kind":"statement","span":{"start":[39,3],"end":[39,43],"bytes":[2037,2077]}},"@exit":{"kind":"exit","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]}}},"cfg":[{"src":"@entry","dst":"39:3","kind":"fallthrough"},{"src":"39:3","dst":"@exit","kind":"exception"},{"src":"39:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"39:3"}],"ddg":[]},"makesSession":{"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesSession","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]},"body":{"52:13":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2800,2866]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"52:46":{"method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2833,2865]},"callee":"can://typescript/sample-app/@external/neo4j-driver/basic"},"53:13":{"method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2880,2891]},"callee":"can://typescript/sample-app/@external/neo4j-driver-core/session"},"54:3":{"method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2895,2908]},"callee":"can://typescript/sample-app/@external/neo4j-driver/rxSession"},"@entry":{"kind":"entry","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]}},"52:3":{"kind":"statement","span":{"start":[52,3],"end":[52,80],"bytes":[2790,2867]}},"53:3":{"kind":"statement","span":{"start":[53,3],"end":[53,25],"bytes":[2870,2892]}},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[55,12],"bytes":[2912,2921]}},"@exit":{"kind":"exit","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]}}},"cfg":[{"src":"@entry","dst":"52:3","kind":"fallthrough"},{"src":"52:3","dst":"@exit","kind":"exception"},{"src":"52:3","dst":"53:3","kind":"fallthrough"},{"src":"53:3","dst":"@exit","kind":"exception"},{"src":"53:3","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"@exit","kind":"exception"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"52:3"},{"src":"52:3","dst":"53:3"},{"src":"53:3","dst":"54:3"},{"src":"54:3","dst":"55:3"}],"ddg":[{"src":"52:3","dst":"53:3","var":"d.session","prov":["reaching-defs"]},{"src":"52:3","dst":"54:3","var":"d.rxSession","prov":["reaching-defs"]},{"src":"53:3","dst":"55:3","var":"s","prov":["reaching-defs"]}]},"unsafeEval":{"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]},"body":{"60:10":{"method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3076,3085]},"callee":"can://typescript/sample-app/@external/(builtin)/eval"},"@entry":{"kind":"entry","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]}},"60:3":{"kind":"statement","span":{"start":[60,3],"end":[60,20],"bytes":[3069,3086]}},"@exit":{"kind":"exit","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]}}},"cfg":[{"src":"@entry","dst":"60:3","kind":"fallthrough"},{"src":"60:3","dst":"@exit","kind":"exception"},{"src":"60:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"60:3"}],"ddg":[{"src":"@entry","dst":"60:3","var":"raw","prov":["reaching-defs"]}]}},"fields":{}},"src/external.ts":{"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,578]},"types":{},"functions":{"fingerprint":{"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/fingerprint","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]},"body":{"7:14":{"method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[340,352]},"callee":"can://typescript/sample-app/@external/node:crypto/randomUUID"},"8:10":{"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[363,425]},"callee":null},"8:10/2":{"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[363,406]},"callee":null},"8:10/3":{"method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[363,383]},"callee":"can://typescript/sample-app/@external/node:crypto/createHash"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,27],"bytes":[329,353]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[10,20],"bytes":[356,426]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]}}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"id","prov":["reaching-defs"]}]},"extensionOf":{"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/extensionOf","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]},"body":{"15:10":{"method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[556,574]},"callee":"can://typescript/sample-app/@external/node:path/extname"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,29],"bytes":[549,575]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]}}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"file","prov":["reaching-defs"]}]}},"fields":{}},"src/index.ts":{"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37}],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"types":{},"functions":{"main":{"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/index.ts/main","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"body":{"7:19":{"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/sample-app/src/services.ts/UserService/constructor"},"8:3":{"method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"9:3":{"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/sample-app/src/services.ts/UserService/createGuest"},"11:22":{"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/constructor"},"12:3":{"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/list"},"13:3":{"method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/show"},"16:3":{"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"16:12":{"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"17:3":{"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"17:12":{"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/sample-app/src/models.ts/Robot/constructor"},"19:16":{"method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/repeat"},"20:19":{"method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor"},"21:3":{"method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build"},"21:3/2":{"method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"21:3/3":{"method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"22:3":{"method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/sample-app/@external/(builtin)/log"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]}},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]}}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"12:3","kind":"fallthrough"},{"src":"12:3","dst":"@exit","kind":"exception"},{"src":"12:3","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"exception"},{"src":"16:3","dst":"17:3","kind":"fallthrough"},{"src":"17:3","dst":"@exit","kind":"exception"},{"src":"17:3","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"21:3","kind":"fallthrough"},{"src":"21:3","dst":"@exit","kind":"exception"},{"src":"21:3","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"@exit","kind":"exception"},{"src":"22:3","dst":"@exit","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"11:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"11:3","dst":"12:3"},{"src":"12:3","dst":"13:3"},{"src":"13:3","dst":"16:3"},{"src":"16:3","dst":"17:3"},{"src":"17:3","dst":"19:3"},{"src":"19:3","dst":"20:3"},{"src":"20:3","dst":"21:3"},{"src":"21:3","dst":"22:3"},{"src":"7:3","dst":"8:3"},{"src":"8:3","dst":"9:3"},{"src":"9:3","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"8:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"9:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"11:3","dst":"12:3","var":"controller.list","prov":["reaching-defs"]},{"src":"11:3","dst":"13:3","var":"controller.show","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"service.create","prov":["reaching-defs"]},{"src":"7:3","dst":"9:3","var":"service.createGuest","prov":["reaching-defs"]}]}},"fields":{}},"src/models.ts":{"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"types":{"Entity":{"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"is_abstract":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"callables":{"describe":{"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"id":"can://typescript/sample-app/src/models.ts/Entity/describe","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Entity/constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]}},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"id":{"name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Entity/id","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Identifiable"]},"User":{"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"callables":{"describe":{"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/describe","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]}},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]}},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]}}},"cfg":[{"src":"@entry","dst":"49:5","kind":"fallthrough"},{"src":"49:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"49:5"}],"ddg":[{"src":"@entry","dst":"49:5","var":"this.name","prov":["reaching-defs"]},{"src":"@entry","dst":"49:5","var":"this.role","prov":["reaching-defs"]}]},"recordLogin":{"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/recordLogin","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]}},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]}},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]}},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]}}},"cfg":[{"src":"@entry","dst":"53:5","kind":"fallthrough"},{"src":"53:5","dst":"54:5","kind":"fallthrough"},{"src":"54:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"53:5"},{"src":"@entry","dst":"54:5"}],"ddg":[{"src":"@entry","dst":"53:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"@entry","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"53:5","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"body":{"40:5":{"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/sample-app/src/models.ts/Entity/constructor"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]}},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]}}},"cfg":[{"src":"@entry","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"@exit","kind":"exception"},{"src":"40:5","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"40:5"},{"src":"40:5","dst":"41:5"}],"ddg":[{"src":"@entry","dst":"40:5","var":"id","prov":["reaching-defs"]}]},"isAdmin#get":{"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"kind":"getter","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/isAdmin","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]}},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]}},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]}}},"cfg":[{"src":"@entry","dst":"45:5","kind":"fallthrough"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"45:5"}],"ddg":[{"src":"@entry","dst":"45:5","var":"this.role","prov":["reaching-defs"]}]}},"fields":{"loginCount":{"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]}},"instances":{"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]}},"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/name","kind":"field"},"role":{"name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/role","kind":"field"}},"extends_ids":["can://typescript/sample-app/src/models.ts/Entity"],"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Robot":{"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"callables":{"describe":{"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/describe","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]}},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]}},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]}}},"cfg":[{"src":"@entry","dst":"62:5","kind":"fallthrough"},{"src":"62:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"62:5"}],"ddg":[{"src":"@entry","dst":"62:5","var":"this.name","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]}},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Robot/name","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Identifiable":{"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"callables":{},"fields":{"id":{"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]}}}},"Named":{"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"callables":{"describe":{"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Named/describe","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]}}}},"Role":{"name":"Role","signature":"src/models.Role","comments":[],"is_const":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"fields":{"Admin":{"name":"Admin","value":"admin","id":"can://typescript/sample-app/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]}},"Member":{"name":"Member","value":"member","id":"can://typescript/sample-app/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]}},"Guest":{"name":"Guest","value":"guest","id":"can://typescript/sample-app/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]}}}},"Flag":{"name":"Flag","signature":"src/models.Flag","comments":[],"is_const":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"fields":{"None":{"name":"None","value":"0","id":"can://typescript/sample-app/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]}},"Active":{"name":"Active","value":"1","id":"can://typescript/sample-app/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]}}}},"UserId":{"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]}}},"functions":{},"fields":{}},"src/services.ts":{"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"types":{"UserService":{"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"callables":{"create":{"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/create","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"body":{"25:16":{"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/sample-app/src/services.ts/nextId"},"26:18":{"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"27:5":{"method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]}},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]}},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]}},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]}}},"cfg":[{"src":"@entry","dst":"25:5","kind":"fallthrough"},{"src":"25:5","dst":"@exit","kind":"exception"},{"src":"25:5","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"27:5","kind":"fallthrough"},{"src":"27:5","dst":"@exit","kind":"exception"},{"src":"27:5","dst":"28:5","kind":"fallthrough"},{"src":"28:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:5"},{"src":"25:5","dst":"26:5"},{"src":"26:5","dst":"27:5"},{"src":"27:5","dst":"28:5"}],"ddg":[{"src":"@entry","dst":"25:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@entry","dst":"27:5","var":"this.users.push","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"26:5","dst":"27:5","var":"user","prov":["reaching-defs"]},{"src":"26:5","dst":"28:5","var":"user","prov":["reaching-defs"]}]},"createGuest":{"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/createGuest","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"body":{"32:18":{"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/sample-app/src/services.ts/makeGuestName"},"33:12":{"method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]}},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]}},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]}},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]}}},"cfg":[{"src":"@entry","dst":"32:5","kind":"fallthrough"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"32:5","dst":"33:5","kind":"fallthrough"},{"src":"33:5","dst":"@exit","kind":"exception"},{"src":"33:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"32:5"},{"src":"32:5","dst":"33:5"}],"ddg":[{"src":"@entry","dst":"32:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"this.create","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5","var":"name","prov":["reaching-defs"]}]},"describeAll":{"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"body":{"37:12":{"method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/sample-app/@external/(builtin)/map"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]}},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]}},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]}}},"callables":{"":{"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"body":{"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]}},"37:34":{"kind":"statement","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]}},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]}}},"cfg":[{"src":"@entry","dst":"37:34","kind":"fallthrough"},{"src":"37:34","dst":"@exit","kind":"exception"},{"src":"37:34","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:34"}],"ddg":[{"src":"@entry","dst":"37:34","var":"u.describe","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"37:5","kind":"fallthrough"},{"src":"37:5","dst":"@exit","kind":"exception"},{"src":"37:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:5"}],"ddg":[{"src":"@entry","dst":"37:5","var":"this.users.map","prov":["reaching-defs"]}]},"loginAll":{"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/loginAll","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"body":{"43:22":{"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/sample-app/src/models.ts/User/recordLogin"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]}},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]}},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]}},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]}},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]}}},"cfg":[{"src":"@entry","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"43:7","kind":"true"},{"src":"42:5","dst":"45:5","kind":"false"},{"src":"43:7","dst":"@exit","kind":"exception"},{"src":"43:7","dst":"42:5","kind":"loop_back"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"41:5"},{"src":"@entry","dst":"42:5"},{"src":"42:5","dst":"43:7"},{"src":"42:5","dst":"45:5"},{"src":"43:7","dst":"42:5"}],"ddg":[{"src":"@entry","dst":"42:5","var":"this.users","prov":["reaching-defs"]},{"src":"41:5","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"41:5","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"42:5","dst":"43:7","var":"u.recordLogin","prov":["reaching-defs"]},{"src":"43:7","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"43:7","dst":"45:5","var":"total","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]}},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"users":{"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]}},"startId":{"name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/startId","kind":"field"}}}},"functions":{"makeGuestName":{"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/makeGuestName","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]}}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"seed","prov":["reaching-defs"]}]},"announce":{"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/announce","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"body":{"13:10":{"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/sample-app/src/models.ts/Named/describe"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]}}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]}]},"nextId":{"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/nextId","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]}},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]}},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]}}},"cfg":[{"src":"@entry","dst":"17:46","kind":"fallthrough"},{"src":"17:46","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:46"}],"ddg":[{"src":"@entry","dst":"17:46","var":"n","prov":["reaching-defs"]}]}},"fields":{}},"src/util.ts":{"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"types":{"StringUtil":{"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"types":{"Builder":{"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"callables":{"add":{"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"body":{"14:7":{"method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"14:23":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]}},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]}},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]}}},"cfg":[{"src":"@entry","dst":"14:7","kind":"fallthrough"},{"src":"14:7","dst":"@exit","kind":"exception"},{"src":"14:7","dst":"15:7","kind":"fallthrough"},{"src":"15:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:7"},{"src":"14:7","dst":"15:7"}],"ddg":[{"src":"@entry","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@entry","dst":"14:7","var":"this.parts.push","prov":["reaching-defs"]},{"src":"@entry","dst":"15:7","var":"this","prov":["reaching-defs"]}]},"build":{"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"body":{"18:14":{"method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/sample-app/@external/(builtin)/join"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]}},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]}},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]}}},"cfg":[{"src":"@entry","dst":"18:7","kind":"fallthrough"},{"src":"18:7","dst":"@exit","kind":"exception"},{"src":"18:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"18:7"}],"ddg":[{"src":"@entry","dst":"18:7","var":"this.parts.join","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"body":{}}},"fields":{"parts":{"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]}}}}},"functions":{"repeat":{"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"body":{"4:12":{"method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/sample-app/@external/(builtin)/repeat"},"4:12/2":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]}},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]}},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]}}},"cfg":[{"src":"@entry","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"4:5","var":"s","prov":["reaching-defs"]}]},"slug":{"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/slug","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"body":{"8:12":{"method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/sample-app/@external/(builtin)/replace"},"8:12/2":{"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/sample-app/@external/(builtin)/toLowerCase"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]}},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]}},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]}}},"cfg":[{"src":"@entry","dst":"8:5","kind":"fallthrough"},{"src":"8:5","dst":"@exit","kind":"exception"},{"src":"8:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]}]}},"fields":{}}},"functions":{"classify":{"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"body":{"30:15":{"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/sample-app/src/util.ts/classify/keyOf"},"31:5":{"method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]}},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]}},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]}},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]}},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]}},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]}}},"callables":{"keyOf":{"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify/keyOf","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"body":{"26:12":{"method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/sample-app/@external/(builtin)/charAt"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]}},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}}},"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"30:5","kind":"true"},{"src":"29:3","dst":"33:3","kind":"false"},{"src":"30:5","dst":"@exit","kind":"exception"},{"src":"30:5","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"29:3","kind":"loop_back"},{"src":"33:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:3"},{"src":"25:3","dst":"28:3"},{"src":"25:3","dst":"29:3"},{"src":"29:3","dst":"30:5"},{"src":"29:3","dst":"33:3"},{"src":"30:5","dst":"31:5"},{"src":"31:5","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"28:3","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"28:3","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"31:5","var":"item","prov":["reaching-defs"]},{"src":"30:5","dst":"31:5","var":"k","prov":["reaching-defs"]},{"src":"31:5","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"31:5","dst":"33:3","var":"out","prov":["reaching-defs"]}]}},"fields":{}}},"call_graph":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/external-calls.ts/readsConfig","dst":"can://typescript/sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesDriver","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","dst":"can://typescript/sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/extensionOf","dst":"can://typescript/sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/list","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/announce","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/models.ts/User/constructor","dst":"can://typescript/sample-app/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Robot/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/services.ts/nextId","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/makeGuestName","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/loginAll","dst":"can://typescript/sample-app/src/models.ts/User/recordLogin","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/src/util.ts/classify/keyOf","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/classify/keyOf","dst":"can://typescript/sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Param","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["jelly"],"weight":1}],"param_in":[],"param_out":[],"external_symbols":{"can://typescript/sample-app/@external/node:fs/readFileSync":{"id":"can://typescript/sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://typescript/sample-app/@external/commander/Command":{"id":"can://typescript/sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://typescript/sample-app/@external/commander/description":{"id":"can://typescript/sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://typescript/sample-app/@external/commander/name":{"id":"can://typescript/sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://typescript/sample-app/@external/commander/parse":{"id":"can://typescript/sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://typescript/sample-app/@external/neo4j-driver/driver":{"id":"can://typescript/sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://typescript/sample-app/@external/neo4j-driver/basic":{"id":"can://typescript/sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://typescript/sample-app/@external/neo4j-driver-core/session":{"id":"can://typescript/sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://typescript/sample-app/@external/neo4j-driver/rxSession":{"id":"can://typescript/sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://typescript/sample-app/@external/(builtin)/eval":{"id":"can://typescript/sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://typescript/sample-app/@external/node:crypto/randomUUID":{"id":"can://typescript/sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://typescript/sample-app/@external/node:crypto/createHash":{"id":"can://typescript/sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://typescript/sample-app/@external/node:path/extname":{"id":"can://typescript/sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://typescript/sample-app/@external/(builtin)/log":{"id":"can://typescript/sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/sample-app/@external/(builtin)/push":{"id":"can://typescript/sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/sample-app/@external/(builtin)/map":{"id":"can://typescript/sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/sample-app/@external/(builtin)/charAt":{"id":"can://typescript/sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/sample-app/@external/(builtin)/repeat":{"id":"can://typescript/sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/sample-app/@external/(builtin)/replace":{"id":"can://typescript/sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/sample-app/@external/(builtin)/toLowerCase":{"id":"can://typescript/sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/sample-app/@external/(builtin)/join":{"id":"can://typescript/sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/sample-app/src/controllers.ts/Controller@5:10":{"id":"can://typescript/sample-app/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Get@8:10":{"id":"can://typescript/sample-app/src/controllers.ts/Get/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Param@11:10":{"id":"can://typescript/sample-app/src/controllers.ts/Param/","kind":"callable"},"can://typescript/sample-app/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/sample-app-a4.json b/test/goldens/sample-app-a4.json new file mode 100644 index 0000000..b4aaff7 --- /dev/null +++ b/test/goldens/sample-app-a4.json @@ -0,0 +1 @@ +{"schema_version":"2.1.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"types":{"UserController":{"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","qualified_name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"callables":{"show":{"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","qualified_name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/show","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"body":{"20:18":{"method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"21:12":{"method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/sample-app/src/models.ts/User/describe"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]}},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]}},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]}},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]}},"@formal_in:0":{"kind":"formal_in","of":"id"},"@formal_out":{"kind":"formal_out","of":"$ret"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5"}},"cfg":[{"src":"@entry","dst":"20:5","kind":"fallthrough"},{"src":"20:5","dst":"@exit","kind":"exception"},{"src":"20:5","dst":"21:5","kind":"fallthrough"},{"src":"21:5","dst":"@exit","kind":"exception"},{"src":"21:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:5"},{"src":"20:5","dst":"21:5"}],"ddg":[{"src":"@entry","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"this.service.create","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"20:5","dst":"20:5","var":"src/services.nextId"},{"src":"20:5/actual_in:0","dst":"20:5/actual_out"}]},"list":{"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/list","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"body":{"26:12":{"method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/sample-app/src/services.ts/UserService/describeAll"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]}},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5"}},"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"this.service.describeAll","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]}},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]}},"@formal_in:0":{"kind":"formal_in","of":"service"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController/service","kind":"field"}}}},"functions":{"Controller":{"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]}},"@formal_in:0":{"kind":"formal_in","of":"prefix"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller/","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]}},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]}},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[{"src":"5:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Get":{"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]}},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]}},"@formal_in:0":{"kind":"formal_in","of":"path"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get/","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]}},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]}},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[{"src":"8:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Param":{"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]}},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]}},"@formal_in:0":{"kind":"formal_in","of":"name"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param/","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]}},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]}},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[{"src":"11:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"11:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/external-calls.ts":{"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3089]},"types":{},"functions":{"readsConfig":{"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/readsConfig","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]},"body":{"15:10":{"method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[938,973]},"callee":"can://typescript/sample-app/@external/node:fs/readFileSync"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,46],"bytes":[931,974]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3"},"15:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"15:3"}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"},{"src":"15:3/actual_in:1","dst":"15:3/actual_out"}]},"makesCommand":{"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesCommand","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]},"body":{"27:15":{"method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1617,1630]},"callee":"can://typescript/sample-app/@external/commander/Command"},"28:3":{"method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1634,1669]},"callee":"can://typescript/sample-app/@external/commander/description"},"28:3/2":{"method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1634,1649]},"callee":"can://typescript/sample-app/@external/commander/name"},"29:3":{"method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1673,1702]},"callee":"can://typescript/sample-app/@external/commander/parse"},"@entry":{"kind":"entry","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]}},"27:3":{"kind":"statement","span":{"start":[27,3],"end":[27,29],"bytes":[1605,1631]}},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,14],"bytes":[1706,1717]}},"@exit":{"kind":"exit","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"28:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"28:3"},"28:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"28:3"},"29:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"29:3"},"29:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"29:3"}},"cfg":[{"src":"@entry","dst":"27:3","kind":"fallthrough"},{"src":"27:3","dst":"@exit","kind":"exception"},{"src":"27:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"@exit","kind":"exception"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"27:3"},{"src":"27:3","dst":"28:3"},{"src":"28:3","dst":"29:3"},{"src":"29:3","dst":"30:3"}],"ddg":[{"src":"27:3","dst":"28:3","var":"cmd.name","prov":["reaching-defs"]},{"src":"27:3","dst":"29:3","var":"cmd.parse","prov":["reaching-defs"]},{"src":"27:3","dst":"30:3","var":"cmd","prov":["reaching-defs"]},{"src":"30:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"28:3/actual_in:0","dst":"28:3/actual_out"},{"src":"29:3/actual_in:0","dst":"29:3/actual_out"}]},"makesDriver":{"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesDriver","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]},"body":{"39:10":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2044,2076]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"@entry":{"kind":"entry","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]}},"39:3":{"kind":"statement","span":{"start":[39,3],"end":[39,43],"bytes":[2037,2077]}},"@exit":{"kind":"exit","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"39:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"39:3"},"39:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"39:3"}},"cfg":[{"src":"@entry","dst":"39:3","kind":"fallthrough"},{"src":"39:3","dst":"@exit","kind":"exception"},{"src":"39:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"39:3"}],"ddg":[{"src":"39:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"39:3/actual_in:0","dst":"39:3/actual_out"}]},"makesSession":{"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesSession","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]},"body":{"52:13":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2800,2866]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"52:46":{"method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2833,2865]},"callee":"can://typescript/sample-app/@external/neo4j-driver/basic"},"53:13":{"method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2880,2891]},"callee":"can://typescript/sample-app/@external/neo4j-driver-core/session"},"54:3":{"method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2895,2908]},"callee":"can://typescript/sample-app/@external/neo4j-driver/rxSession"},"@entry":{"kind":"entry","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]}},"52:3":{"kind":"statement","span":{"start":[52,3],"end":[52,80],"bytes":[2790,2867]}},"53:3":{"kind":"statement","span":{"start":[53,3],"end":[53,25],"bytes":[2870,2892]}},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[55,12],"bytes":[2912,2921]}},"@exit":{"kind":"exit","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"52:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"52:3"},"52:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"52:3"},"52:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"52:3"}},"cfg":[{"src":"@entry","dst":"52:3","kind":"fallthrough"},{"src":"52:3","dst":"@exit","kind":"exception"},{"src":"52:3","dst":"53:3","kind":"fallthrough"},{"src":"53:3","dst":"@exit","kind":"exception"},{"src":"53:3","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"@exit","kind":"exception"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"52:3"},{"src":"52:3","dst":"53:3"},{"src":"53:3","dst":"54:3"},{"src":"54:3","dst":"55:3"}],"ddg":[{"src":"52:3","dst":"53:3","var":"d.session","prov":["reaching-defs"]},{"src":"52:3","dst":"54:3","var":"d.rxSession","prov":["reaching-defs"]},{"src":"53:3","dst":"55:3","var":"s","prov":["reaching-defs"]},{"src":"55:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"52:3/actual_in:0","dst":"52:3/actual_out"},{"src":"52:3/actual_in:1","dst":"52:3/actual_out"}]},"unsafeEval":{"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]},"body":{"60:10":{"method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3076,3085]},"callee":"can://typescript/sample-app/@external/(builtin)/eval"},"@entry":{"kind":"entry","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]}},"60:3":{"kind":"statement","span":{"start":[60,3],"end":[60,20],"bytes":[3069,3086]}},"@exit":{"kind":"exit","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]}},"@formal_in:0":{"kind":"formal_in","of":"raw"},"@formal_out":{"kind":"formal_out","of":"$ret"},"60:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"60:3"},"60:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"60:3"}},"cfg":[{"src":"@entry","dst":"60:3","kind":"fallthrough"},{"src":"60:3","dst":"@exit","kind":"exception"},{"src":"60:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"60:3"}],"ddg":[{"src":"@entry","dst":"60:3","var":"raw","prov":["reaching-defs"]},{"src":"60:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"60:3/actual_in:0","dst":"60:3/actual_out"}]}},"fields":{}},"src/external.ts":{"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,578]},"types":{},"functions":{"fingerprint":{"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/fingerprint","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]},"body":{"7:14":{"method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[340,352]},"callee":"can://typescript/sample-app/@external/node:crypto/randomUUID"},"8:10":{"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[363,425]},"callee":null},"8:10/2":{"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[363,406]},"callee":null},"8:10/3":{"method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[363,383]},"callee":"can://typescript/sample-app/@external/node:crypto/createHash"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,27],"bytes":[329,353]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[10,20],"bytes":[356,426]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]}},"@formal_in:0":{"kind":"formal_in","of":"name"},"@formal_out":{"kind":"formal_out","of":"$ret"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3"}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"id","prov":["reaching-defs"]},{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:3/actual_in:0","dst":"8:3/actual_out"}]},"extensionOf":{"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/extensionOf","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]},"body":{"15:10":{"method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[556,574]},"callee":"can://typescript/sample-app/@external/node:path/extname"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,29],"bytes":[549,575]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]}},"@formal_in:0":{"kind":"formal_in","of":"file"},"@formal_out":{"kind":"formal_out","of":"$ret"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3"}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"file","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"}]}},"fields":{}},"src/index.ts":{"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37}],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"types":{},"functions":{"main":{"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/index.ts/main","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"body":{"7:19":{"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/sample-app/src/services.ts/UserService/constructor"},"8:3":{"method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"9:3":{"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/sample-app/src/services.ts/UserService/createGuest"},"11:22":{"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/constructor"},"12:3":{"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/list"},"13:3":{"method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/show"},"16:3":{"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"16:12":{"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"17:3":{"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"17:12":{"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/sample-app/src/models.ts/Robot/constructor"},"19:16":{"method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/repeat"},"20:19":{"method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor"},"21:3":{"method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build"},"21:3/2":{"method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"21:3/3":{"method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"22:3":{"method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/sample-app/@external/(builtin)/log"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]}},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3"}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"12:3","kind":"fallthrough"},{"src":"12:3","dst":"@exit","kind":"exception"},{"src":"12:3","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"exception"},{"src":"16:3","dst":"17:3","kind":"fallthrough"},{"src":"17:3","dst":"@exit","kind":"exception"},{"src":"17:3","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"21:3","kind":"fallthrough"},{"src":"21:3","dst":"@exit","kind":"exception"},{"src":"21:3","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"@exit","kind":"exception"},{"src":"22:3","dst":"@exit","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"11:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"11:3","dst":"12:3"},{"src":"12:3","dst":"13:3"},{"src":"13:3","dst":"16:3"},{"src":"16:3","dst":"17:3"},{"src":"17:3","dst":"19:3"},{"src":"19:3","dst":"20:3"},{"src":"20:3","dst":"21:3"},{"src":"21:3","dst":"22:3"},{"src":"7:3","dst":"8:3"},{"src":"8:3","dst":"9:3"},{"src":"9:3","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"8:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"9:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"11:3","dst":"12:3","var":"controller.list","prov":["reaching-defs"]},{"src":"11:3","dst":"13:3","var":"controller.show","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"service.create","prov":["reaching-defs"]},{"src":"7:3","dst":"9:3","var":"service.createGuest","prov":["reaching-defs"]}],"summary":[{"src":"13:3","dst":"13:3","var":"src/services.nextId"},{"src":"13:3/actual_in:0","dst":"13:3/actual_out"},{"src":"16:3/actual_in:0","dst":"16:3/actual_out"},{"src":"17:3/actual_in:0","dst":"17:3/actual_out"},{"src":"19:3/actual_in:0","dst":"19:3/actual_out"},{"src":"19:3/actual_in:1","dst":"19:3/actual_out"},{"src":"22:3/actual_in:0","dst":"22:3/actual_out"},{"src":"8:3","dst":"8:3","var":"src/services.nextId"},{"src":"8:3/actual_in:0","dst":"8:3/actual_out"},{"src":"8:3/actual_in:1","dst":"8:3/actual_out"},{"src":"9:3","dst":"9:3","var":"src/services.nextId"}]}},"fields":{}},"src/models.ts":{"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"types":{"Entity":{"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"is_abstract":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"callables":{"describe":{"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"id":"can://typescript/sample-app/src/models.ts/Entity/describe","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Entity/constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]}},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]}},"@formal_in:0":{"kind":"formal_in","of":"id"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Entity/id","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Identifiable"]},"User":{"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"callables":{"describe":{"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/describe","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]}},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]}},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"49:5","kind":"fallthrough"},{"src":"49:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"49:5"}],"ddg":[{"src":"@entry","dst":"49:5","var":"this.name","prov":["reaching-defs"]},{"src":"@entry","dst":"49:5","var":"this.role","prov":["reaching-defs"]},{"src":"49:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"recordLogin":{"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/recordLogin","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]}},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]}},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]}},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"53:5","kind":"fallthrough"},{"src":"53:5","dst":"54:5","kind":"fallthrough"},{"src":"54:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"53:5"},{"src":"@entry","dst":"54:5"}],"ddg":[{"src":"@entry","dst":"53:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"@entry","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"53:5","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"54:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"body":{"40:5":{"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/sample-app/src/models.ts/Entity/constructor"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]}},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]}},"@formal_in:0":{"kind":"formal_in","of":"id"},"@formal_in:1":{"kind":"formal_in","of":"name"},"@formal_in:2":{"kind":"formal_in","of":"role"},"@formal_out":{"kind":"formal_out","of":"$ret"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5"}},"cfg":[{"src":"@entry","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"@exit","kind":"exception"},{"src":"40:5","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"40:5"},{"src":"40:5","dst":"41:5"}],"ddg":[{"src":"@entry","dst":"40:5","var":"id","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"kind":"getter","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/isAdmin","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]}},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]}},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"45:5","kind":"fallthrough"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"45:5"}],"ddg":[{"src":"@entry","dst":"45:5","var":"this.role","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{"loginCount":{"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]}},"instances":{"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]}},"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/name","kind":"field"},"role":{"name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/role","kind":"field"}},"extends_ids":["can://typescript/sample-app/src/models.ts/Entity"],"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Robot":{"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"callables":{"describe":{"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/describe","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]}},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]}},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"62:5","kind":"fallthrough"},{"src":"62:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"62:5"}],"ddg":[{"src":"@entry","dst":"62:5","var":"this.name","prov":["reaching-defs"]},{"src":"62:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]}},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]}},"@formal_in:0":{"kind":"formal_in","of":"name"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Robot/name","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Identifiable":{"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"callables":{},"fields":{"id":{"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]}}}},"Named":{"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"callables":{"describe":{"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Named/describe","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]}}}},"Role":{"name":"Role","signature":"src/models.Role","comments":[],"is_const":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"fields":{"Admin":{"name":"Admin","value":"admin","id":"can://typescript/sample-app/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]}},"Member":{"name":"Member","value":"member","id":"can://typescript/sample-app/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]}},"Guest":{"name":"Guest","value":"guest","id":"can://typescript/sample-app/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]}}}},"Flag":{"name":"Flag","signature":"src/models.Flag","comments":[],"is_const":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"fields":{"None":{"name":"None","value":"0","id":"can://typescript/sample-app/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]}},"Active":{"name":"Active","value":"1","id":"can://typescript/sample-app/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]}}}},"UserId":{"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]}}},"functions":{},"fields":{}},"src/services.ts":{"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"types":{"UserService":{"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"callables":{"create":{"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/create","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"body":{"25:16":{"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/sample-app/src/services.ts/nextId"},"26:18":{"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"27:5":{"method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]}},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]}},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]}},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]}},"@formal_in:0":{"kind":"formal_in","of":"name"},"@formal_in:1":{"kind":"formal_in","of":"role"},"@formal_out":{"kind":"formal_out","of":"$ret"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5"}},"cfg":[{"src":"@entry","dst":"25:5","kind":"fallthrough"},{"src":"25:5","dst":"@exit","kind":"exception"},{"src":"25:5","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"27:5","kind":"fallthrough"},{"src":"27:5","dst":"@exit","kind":"exception"},{"src":"27:5","dst":"28:5","kind":"fallthrough"},{"src":"28:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:5"},{"src":"25:5","dst":"26:5"},{"src":"26:5","dst":"27:5"},{"src":"27:5","dst":"28:5"}],"ddg":[{"src":"@entry","dst":"25:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@entry","dst":"27:5","var":"this.users.push","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"26:5","dst":"27:5","var":"user","prov":["reaching-defs"]},{"src":"26:5","dst":"28:5","var":"user","prov":["reaching-defs"]},{"src":"28:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"25:5/actual_in:0","dst":"25:5/actual_out"},{"src":"27:5/actual_in:0","dst":"27:5/actual_out"}]},"createGuest":{"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/createGuest","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"body":{"32:18":{"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/sample-app/src/services.ts/makeGuestName"},"33:12":{"method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]}},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]}},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]}},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5"}},"cfg":[{"src":"@entry","dst":"32:5","kind":"fallthrough"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"32:5","dst":"33:5","kind":"fallthrough"},{"src":"33:5","dst":"@exit","kind":"exception"},{"src":"33:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"32:5"},{"src":"32:5","dst":"33:5"}],"ddg":[{"src":"@entry","dst":"32:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"this.create","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5","var":"name","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"32:5/actual_in:0","dst":"32:5/actual_out"},{"src":"33:5","dst":"33:5","var":"src/services.nextId"},{"src":"33:5/actual_in:0","dst":"33:5/actual_out"},{"src":"33:5/actual_in:1","dst":"33:5/actual_out"}]},"describeAll":{"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"body":{"37:12":{"method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/sample-app/@external/(builtin)/map"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]}},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]}},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5"}},"callables":{"":{"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"body":{"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]}},"37:34":{"kind":"statement","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]}},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]}},"@formal_in:0":{"kind":"formal_in","of":"u"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"37:34","kind":"fallthrough"},{"src":"37:34","dst":"@exit","kind":"exception"},{"src":"37:34","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:34"}],"ddg":[{"src":"@entry","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"37:5","kind":"fallthrough"},{"src":"37:5","dst":"@exit","kind":"exception"},{"src":"37:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:5"}],"ddg":[{"src":"@entry","dst":"37:5","var":"this.users.map","prov":["reaching-defs"]},{"src":"37:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"37:5/actual_in:0","dst":"37:5/actual_out"}]},"loginAll":{"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/loginAll","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"body":{"43:22":{"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/sample-app/src/models.ts/User/recordLogin"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]}},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]}},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]}},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]}},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7"}},"cfg":[{"src":"@entry","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"43:7","kind":"true"},{"src":"42:5","dst":"45:5","kind":"false"},{"src":"43:7","dst":"@exit","kind":"exception"},{"src":"43:7","dst":"42:5","kind":"loop_back"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"41:5"},{"src":"@entry","dst":"42:5"},{"src":"42:5","dst":"43:7"},{"src":"42:5","dst":"45:5"},{"src":"43:7","dst":"42:5"}],"ddg":[{"src":"@entry","dst":"42:5","var":"this.users","prov":["reaching-defs"]},{"src":"41:5","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"41:5","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"42:5","dst":"43:7","var":"u.recordLogin","prov":["reaching-defs"]},{"src":"43:7","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"43:7","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]}},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]}},"@formal_in:0":{"kind":"formal_in","of":"startId"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]}},"startId":{"name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/startId","kind":"field"}}}},"functions":{"makeGuestName":{"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/makeGuestName","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]}},"@formal_in:0":{"kind":"formal_in","of":"seed"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/announce","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"body":{"13:10":{"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/sample-app/src/models.ts/Named/describe"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]}},"@formal_in:0":{"kind":"formal_in","of":"thing"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/nextId","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]}},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]}},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"17:46","kind":"fallthrough"},{"src":"17:46","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:46"}],"ddg":[{"src":"@entry","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/util.ts":{"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"types":{"StringUtil":{"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"types":{"Builder":{"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"callables":{"add":{"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"body":{"14:7":{"method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"14:23":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]}},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]}},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]}},"@formal_in:0":{"kind":"formal_in","of":"part"},"@formal_out":{"kind":"formal_out","of":"$ret"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7"}},"cfg":[{"src":"@entry","dst":"14:7","kind":"fallthrough"},{"src":"14:7","dst":"@exit","kind":"exception"},{"src":"14:7","dst":"15:7","kind":"fallthrough"},{"src":"15:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:7"},{"src":"14:7","dst":"15:7"}],"ddg":[{"src":"@entry","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@entry","dst":"14:7","var":"this.parts.push","prov":["reaching-defs"]},{"src":"@entry","dst":"15:7","var":"this","prov":["reaching-defs"]},{"src":"15:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"14:7/actual_in:0","dst":"14:7/actual_out"}]},"build":{"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"body":{"18:14":{"method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/sample-app/@external/(builtin)/join"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]}},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]}},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7"}},"cfg":[{"src":"@entry","dst":"18:7","kind":"fallthrough"},{"src":"18:7","dst":"@exit","kind":"exception"},{"src":"18:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"18:7"}],"ddg":[{"src":"@entry","dst":"18:7","var":"this.parts.join","prov":["reaching-defs"]},{"src":"18:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"18:7/actual_in:0","dst":"18:7/actual_out"}]},"constructor":{"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"body":{}}},"fields":{"parts":{"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]}}}}},"functions":{"repeat":{"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"body":{"4:12":{"method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/sample-app/@external/(builtin)/repeat"},"4:12/2":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]}},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]}},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_in:1":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5"}},"cfg":[{"src":"@entry","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/slug","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"body":{"8:12":{"method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/sample-app/@external/(builtin)/replace"},"8:12/2":{"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/sample-app/@external/(builtin)/toLowerCase"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]}},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]}},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5"}},"cfg":[{"src":"@entry","dst":"8:5","kind":"fallthrough"},{"src":"8:5","dst":"@exit","kind":"exception"},{"src":"8:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]},{"src":"8:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:5/actual_in:0","dst":"8:5/actual_out"},{"src":"8:5/actual_in:1","dst":"8:5/actual_out"}]}},"fields":{}}},"functions":{"classify":{"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"body":{"30:15":{"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/sample-app/src/util.ts/classify/keyOf"},"31:5":{"method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]}},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]}},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]}},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]}},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]}},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]}},"@formal_in:0":{"kind":"formal_in","of":"items"},"@formal_out":{"kind":"formal_out","of":"$ret"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5"}},"callables":{"keyOf":{"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify/keyOf","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"body":{"26:12":{"method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/sample-app/@external/(builtin)/charAt"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]}},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"@formal_in:0":{"kind":"formal_in","of":"item"},"@formal_out":{"kind":"formal_out","of":"$ret"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5"}},"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"26:5/actual_in:0","dst":"26:5/actual_out"}]}},"cfg":[{"src":"@entry","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"30:5","kind":"true"},{"src":"29:3","dst":"33:3","kind":"false"},{"src":"30:5","dst":"@exit","kind":"exception"},{"src":"30:5","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"29:3","kind":"loop_back"},{"src":"33:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:3"},{"src":"25:3","dst":"28:3"},{"src":"25:3","dst":"29:3"},{"src":"29:3","dst":"30:5"},{"src":"29:3","dst":"33:3"},{"src":"30:5","dst":"31:5"},{"src":"31:5","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"28:3","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"28:3","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"31:5","var":"item","prov":["reaching-defs"]},{"src":"30:5","dst":"31:5","var":"k","prov":["reaching-defs"]},{"src":"31:5","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"31:5","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"33:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"30:5/actual_in:0","dst":"30:5/actual_out"},{"src":"31:5/actual_in:0","dst":"31:5/actual_out"}]}},"fields":{}}},"call_graph":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/external-calls.ts/readsConfig","dst":"can://typescript/sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesDriver","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","dst":"can://typescript/sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/extensionOf","dst":"can://typescript/sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/list","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/announce","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/models.ts/User/constructor","dst":"can://typescript/sample-app/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Robot/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/services.ts/nextId","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/makeGuestName","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/loginAll","dst":"can://typescript/sample-app/src/models.ts/User/recordLogin","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/src/util.ts/classify/keyOf","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/classify/keyOf","dst":"can://typescript/sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Param","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["jelly"],"weight":1}],"param_in":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show@20:5","dst":"can://typescript/sample-app/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0","dst":"can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@13:3","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1"},{"src":"can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@8:3","dst":"can://typescript/sample-app/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/sample-app/src/index.ts/main@9:3","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/nextId@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5","dst":"can://typescript/sample-app/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0"}],"param_out":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@11:3/actual_out"},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@12:3/actual_out"},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@13:3/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out","dst":"can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/User/constructor@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/User/constructor@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/User/describe@formal_out","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/announce@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/announce@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/makeGuestName@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/nextId@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@7:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@formal_out","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@8:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@9:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out","dst":"can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out","dst":"can://typescript/sample-app/src/util.ts/classify@30:5/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@19:3/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out"}],"external_symbols":{"can://typescript/sample-app/@external/node:fs/readFileSync":{"id":"can://typescript/sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://typescript/sample-app/@external/commander/Command":{"id":"can://typescript/sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://typescript/sample-app/@external/commander/description":{"id":"can://typescript/sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://typescript/sample-app/@external/commander/name":{"id":"can://typescript/sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://typescript/sample-app/@external/commander/parse":{"id":"can://typescript/sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://typescript/sample-app/@external/neo4j-driver/driver":{"id":"can://typescript/sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://typescript/sample-app/@external/neo4j-driver/basic":{"id":"can://typescript/sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://typescript/sample-app/@external/neo4j-driver-core/session":{"id":"can://typescript/sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://typescript/sample-app/@external/neo4j-driver/rxSession":{"id":"can://typescript/sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://typescript/sample-app/@external/(builtin)/eval":{"id":"can://typescript/sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://typescript/sample-app/@external/node:crypto/randomUUID":{"id":"can://typescript/sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://typescript/sample-app/@external/node:crypto/createHash":{"id":"can://typescript/sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://typescript/sample-app/@external/node:path/extname":{"id":"can://typescript/sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://typescript/sample-app/@external/(builtin)/log":{"id":"can://typescript/sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/sample-app/@external/(builtin)/push":{"id":"can://typescript/sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/sample-app/@external/(builtin)/map":{"id":"can://typescript/sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/sample-app/@external/(builtin)/charAt":{"id":"can://typescript/sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/sample-app/@external/(builtin)/repeat":{"id":"can://typescript/sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/sample-app/@external/(builtin)/replace":{"id":"can://typescript/sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/sample-app/@external/(builtin)/toLowerCase":{"id":"can://typescript/sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/sample-app/@external/(builtin)/join":{"id":"can://typescript/sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/sample-app/src/controllers.ts/Controller@5:10":{"id":"can://typescript/sample-app/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Get@8:10":{"id":"can://typescript/sample-app/src/controllers.ts/Get/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Param@11:10":{"id":"can://typescript/sample-app/src/controllers.ts/Param/","kind":"callable"},"can://typescript/sample-app/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/sample-app.cypher b/test/goldens/sample-app.cypher new file mode 100644 index 0000000..b93cc18 --- /dev/null +++ b/test/goldens/sample-app.cypher @@ -0,0 +1,1532 @@ + + + + + {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/controllers.ts', p: {}}, + {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/external-calls.ts', p: {}}, + {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/external.ts', p: {}}, + {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/index.ts', p: {}}, + {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/models.ts', p: {}}, + {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/services.ts', p: {}}, + {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/util.ts', p: {}} + {f: 'can://typescript/sample-app/src/controllers.ts', t: 'can://typescript/sample-app/src/controllers.ts/Controller', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts', t: 'can://typescript/sample-app/src/controllers.ts/Get', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts', t: 'can://typescript/sample-app/src/controllers.ts/Param', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts', t: 'can://typescript/sample-app/src/controllers.ts/UserController', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller/', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller/', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller/', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller/', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller/', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', t: 'can://typescript/sample-app/src/controllers.ts/Controller@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', t: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', t: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', t: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get/', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get/', t: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get/', t: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get/', t: 'can://typescript/sample-app/src/controllers.ts/Get/@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get/', t: 'can://typescript/sample-app/src/controllers.ts/Get/@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', t: 'can://typescript/sample-app/src/controllers.ts/Get/@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', t: 'can://typescript/sample-app/src/controllers.ts/Get/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', t: 'can://typescript/sample-app/src/controllers.ts/Get@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', t: 'can://typescript/sample-app/src/controllers.ts/Get@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get@entry', t: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Get@entry', t: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param/', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param/', t: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param/', t: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param/', t: 'can://typescript/sample-app/src/controllers.ts/Param/@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param/', t: 'can://typescript/sample-app/src/controllers.ts/Param/@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', t: 'can://typescript/sample-app/src/controllers.ts/Param/@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', t: 'can://typescript/sample-app/src/controllers.ts/Param/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', t: 'can://typescript/sample-app/src/controllers.ts/Param@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', t: 'can://typescript/sample-app/src/controllers.ts/Param@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param@entry', t: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/Param@entry', t: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController', t: 'can://typescript/sample-app/src/controllers.ts/UserController/service', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/Get', p: {weight: 1, prov: ['jelly']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:12', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:12', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', k: 'this.service.describeAll|reaching-defs', p: {var: 'this.service.describeAll', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@12:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/Get', p: {weight: 1, prov: ['jelly']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/Param', p: {weight: 1, prov: ['jelly']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:18', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:12', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:18', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', k: 'user.describe|reaching-defs', p: {var: 'user.describe', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:12', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', k: 'id|reaching-defs', p: {var: 'id', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', k: 'this.service.create|reaching-defs', p: {var: 'this.service.create', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', p: {}}, + {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/@external/commander/Command', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/@external/commander/description', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/@external/commander/name', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/@external/commander/parse', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:15', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/2', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:15', t: 'can://typescript/sample-app/@external/commander/Command', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', k: 'cmd.name|reaching-defs', p: {var: 'cmd.name', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', k: 'cmd.parse|reaching-defs', p: {var: 'cmd.parse', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', k: 'cmd|reaching-defs', p: {var: 'cmd', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', t: 'can://typescript/sample-app/@external/commander/description', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/2', t: 'can://typescript/sample-app/@external/commander/name', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', t: 'can://typescript/sample-app/@external/commander/parse', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:10', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:10', t: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/@external/neo4j-driver-core/session', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/@external/neo4j-driver/basic', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:13', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:46', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:13', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:13', t: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', k: 'd.session|reaching-defs', p: {var: 'd.session', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', k: 'd.rxSession|reaching-defs', p: {var: 'd.rxSession', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:1', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:46', t: 'can://typescript/sample-app/@external/neo4j-driver/basic', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:13', t: 'can://typescript/sample-app/@external/neo4j-driver-core/session', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', t: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/@external/node:fs/readFileSync', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:10', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:10', t: 'can://typescript/sample-app/@external/node:fs/readFileSync', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:1', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/@external/(builtin)/eval', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:10', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:10', t: 'can://typescript/sample-app/@external/(builtin)/eval', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', k: 'raw|reaching-defs', p: {var: 'raw', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts', t: 'can://typescript/sample-app/src/external.ts/extensionOf', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts', t: 'can://typescript/sample-app/src/external.ts/fingerprint', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/@external/node:path/extname', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:10', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:10', t: 'can://typescript/sample-app/@external/node:path/extname', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', t: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', t: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', t: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_in:0', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', k: 'file|reaching-defs', p: {var: 'file', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/@external/node:crypto/createHash', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/@external/node:crypto/randomUUID', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@7:14', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/2', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/3', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:14', t: 'can://typescript/sample-app/@external/node:crypto/randomUUID', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', k: 'id|reaching-defs', p: {var: 'id', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/3', t: 'can://typescript/sample-app/@external/node:crypto/createHash', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_in:0', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', t: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', t: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', p: {}}, + {f: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts', t: 'can://typescript/sample-app/src/index.ts/main', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/@external/(builtin)/log', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@11:22', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@11:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@12:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@12:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@13:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:12', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@17:12', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@17:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:16', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@20:19', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@20:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3/2', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3/3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@22:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@7:19', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@7:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@8:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@9:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@9:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@entry', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@exit', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/services.ts/announce', p: {weight: 3, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {weight: 3, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@11:22', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@12:3', k: 'controller.list|reaching-defs', p: {var: 'controller.list', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@12:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@12:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@13:3', k: 'controller.show|reaching-defs', p: {var: 'controller.show', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@12:3', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@12:3', t: 'can://typescript/sample-app/src/index.ts/main@13:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@12:3', t: 'can://typescript/sample-app/src/index.ts/main@13:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@12:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/index.ts/main@13:3', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/index.ts/main@16:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/index.ts/main@16:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:12', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3', t: 'can://typescript/sample-app/src/index.ts/main@17:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3', t: 'can://typescript/sample-app/src/index.ts/main@17:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3', t: 'can://typescript/sample-app/src/services.ts/announce', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@17:12', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@17:3', t: 'can://typescript/sample-app/src/index.ts/main@19:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@17:3', t: 'can://typescript/sample-app/src/index.ts/main@19:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@17:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@17:3', t: 'can://typescript/sample-app/src/services.ts/announce', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:16', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:3', t: 'can://typescript/sample-app/src/index.ts/main@20:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:3', t: 'can://typescript/sample-app/src/index.ts/main@20:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:3', t: 'can://typescript/sample-app/src/index.ts/main@22:3', k: 'slug|reaching-defs', p: {var: 'slug', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@20:19', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@20:3', t: 'can://typescript/sample-app/src/index.ts/main@21:3', k: 'builder.add|reaching-defs', p: {var: 'builder.add', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@20:3', t: 'can://typescript/sample-app/src/index.ts/main@21:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@20:3', t: 'can://typescript/sample-app/src/index.ts/main@21:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@20:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@21:3', t: 'can://typescript/sample-app/src/index.ts/main@22:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@21:3', t: 'can://typescript/sample-app/src/index.ts/main@22:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@21:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@21:3', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@21:3/2', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@21:3/3', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@22:3', t: 'can://typescript/sample-app/@external/(builtin)/log', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@22:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@22:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@7:19', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@11:3', k: 'service|reaching-defs', p: {var: 'service', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@8:3', k: 'service.create|reaching-defs', p: {var: 'service.create', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@8:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@9:3', k: 'service.createGuest|reaching-defs', p: {var: 'service.createGuest', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/index.ts/main@8:3', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/index.ts/main@9:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/index.ts/main@9:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/index.ts/main@11:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/index.ts/main@11:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/index.ts/main@9:3', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@13:3', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@7:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@7:3', p: {}}, + {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@8:3', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@9:3', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Entity', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Flag', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Identifiable', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Named', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Robot', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Role', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/User', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/UserId', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity', t: 'can://typescript/sample-app/src/models.ts/Entity/describe', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity', t: 'can://typescript/sample-app/src/models.ts/Entity/id', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity', t: 'can://typescript/sample-app/src/models.ts/Identifiable', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@entry', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@exit', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Flag', t: 'can://typescript/sample-app/src/models.ts/Flag/Active', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Flag', t: 'can://typescript/sample-app/src/models.ts/Flag/None', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Identifiable', t: 'can://typescript/sample-app/src/models.ts/Identifiable/id', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Named', t: 'can://typescript/sample-app/src/models.ts/Named/describe', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Named', t: 'can://typescript/sample-app/src/models.ts/Named/name', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot', t: 'can://typescript/sample-app/src/models.ts/Named', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot', t: 'can://typescript/sample-app/src/models.ts/Robot/describe', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot', t: 'can://typescript/sample-app/src/models.ts/Robot/name', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@entry', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@exit', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@exit', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', k: 'this.name|reaching-defs', p: {var: 'this.name', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Role', t: 'can://typescript/sample-app/src/models.ts/Role/Admin', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Role', t: 'can://typescript/sample-app/src/models.ts/Role/Guest', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/Role', t: 'can://typescript/sample-app/src/models.ts/Role/Member', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/Entity', p: {}} + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/Named', p: {}} + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/instances', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/loginCount', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/name', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/role', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', t: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', t: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', t: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', t: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', k: 'id|reaching-defs', p: {var: 'id', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe', t: 'can://typescript/sample-app/src/models.ts/User/describe@entry', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe', t: 'can://typescript/sample-app/src/models.ts/User/describe@exit', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe', t: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', t: 'can://typescript/sample-app/src/models.ts/User/describe@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', t: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe@entry', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe@entry', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', k: 'this.name|reaching-defs', p: {var: 'this.name', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe@entry', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', k: 'this.role|reaching-defs', p: {var: 'this.role', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe@entry', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@exit', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', k: 'this.role|reaching-defs', p: {var: 'this.role', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@exit', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', k: 'this.loginCount|reaching-defs', p: {var: 'this.loginCount', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', k: 'this.loginCount|reaching-defs', p: {var: 'this.loginCount', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', k: 'this.loginCount|reaching-defs', p: {var: 'this.loginCount', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', p: {}}, + {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts', t: 'can://typescript/sample-app/src/services.ts/UserService', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts', t: 'can://typescript/sample-app/src/services.ts/announce', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts', t: 'can://typescript/sample-app/src/services.ts/makeGuestName', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts', t: 'can://typescript/sample-app/src/services.ts/nextId', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/startId', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/users', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:16', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:18', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/nextId', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:16', t: 'can://typescript/sample-app/src/services.ts/nextId', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', k: 'id|reaching-defs', p: {var: 'id', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/nextId@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:18', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', k: 'user|reaching-defs', p: {var: 'user', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', k: 'user|reaching-defs', p: {var: 'user', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', k: 'this.startId|reaching-defs', p: {var: 'this.startId', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', k: 'this.users.length|reaching-defs', p: {var: 'this.users.length', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', k: 'role|reaching-defs', p: {var: 'role', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', k: 'this.users.push|reaching-defs', p: {var: 'this.users.push', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:18', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:12', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/makeGuestName', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:18', t: 'can://typescript/sample-app/src/services.ts/makeGuestName', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:12', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', p: {var: 'src/services.nextId'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', k: 'this.users.length|reaching-defs', p: {var: 'this.users.length', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', k: 'this.create|reaching-defs', p: {var: 'this.create', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@9:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/@external/(builtin)/map', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', p: {weight: 1, prov: ['jelly']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:12', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {weight: 1, prov: ['jelly']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', k: 'u.describe|reaching-defs', p: {var: 'u.describe', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:12', t: 'can://typescript/sample-app/@external/(builtin)/map', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', k: 'this.users.map|reaching-defs', p: {var: 'this.users.map', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:22', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', k: 'total|reaching-defs', p: {var: 'total', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', k: 'total|reaching-defs', p: {var: 'total', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', k: 'u.recordLogin|reaching-defs', p: {var: 'u.recordLogin', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:22', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', k: 'loop_back', p: {kind: 'loop_back'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', k: 'total|reaching-defs', p: {var: 'total', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', k: 'total|reaching-defs', p: {var: 'total', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', k: 'this.users|reaching-defs', p: {var: 'this.users', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/models.ts/Named/describe', p: {weight: 1, prov: ['tsc']}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/models.ts/Robot/describe', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@13:10', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@13:3', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@13:10', t: 'can://typescript/sample-app/src/models.ts/Named/describe', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@13:3', t: 'can://typescript/sample-app/src/services.ts/announce@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@13:3', t: 'can://typescript/sample-app/src/services.ts/announce@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@13:3', t: 'can://typescript/sample-app/src/services.ts/announce@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@entry', t: 'can://typescript/sample-app/src/services.ts/announce@13:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@entry', t: 'can://typescript/sample-app/src/services.ts/announce@13:3', k: 'thing.describe|reaching-defs', p: {var: 'thing.describe', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@entry', t: 'can://typescript/sample-app/src/services.ts/announce@13:3', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/announce@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', k: 'seed|reaching-defs', p: {var: 'seed', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@17:46', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@entry', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@exit', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId@17:46', t: 'can://typescript/sample-app/src/services.ts/nextId@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId@17:46', t: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId@entry', t: 'can://typescript/sample-app/src/services.ts/nextId@17:46', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId@entry', t: 'can://typescript/sample-app/src/services.ts/nextId@17:46', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId@entry', t: 'can://typescript/sample-app/src/services.ts/nextId@17:46', p: {}}, + {f: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts', t: 'can://typescript/sample-app/src/util.ts/StringUtil', p: {}} + {f: 'can://typescript/sample-app/src/util.ts', t: 'can://typescript/sample-app/src/util.ts/classify', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', p: {}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts', p: {}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:23', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:23', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', k: 'part|reaching-defs', p: {var: 'part', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', k: 'this.parts.push|reaching-defs', p: {var: 'this.parts.push', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', k: 'this|reaching-defs', p: {var: 'this', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/@external/(builtin)/join', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:14', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:14', t: 'can://typescript/sample-app/@external/(builtin)/join', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', k: 'this.parts.join|reaching-defs', p: {var: 'this.parts.join', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/@external/(builtin)/repeat', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12/2', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12', t: 'can://typescript/sample-app/@external/(builtin)/repeat', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12/2', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', p: {}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/@external/(builtin)/replace', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', p: {weight: 1, prov: ['import']}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12/2', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:1', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', p: {}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12', t: 'can://typescript/sample-app/@external/(builtin)/replace', p: {}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12/2', t: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:1', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', p: {}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', k: 'fallthrough', p: {kind: 'fallthrough'}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', k: 's.toLowerCase|reaching-defs', p: {var: 's.toLowerCase', prov: ['reaching-defs']}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', p: {}} + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', p: {}} + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf', p: {weight: 2, prov: ['tsc', 'jelly']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@25:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@28:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@30:15', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@30:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@entry', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@exit', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/@external/(builtin)/charAt', p: {weight: 1, prov: ['import']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:12', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:12', t: 'can://typescript/sample-app/@external/(builtin)/charAt', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', k: 'item.name.charAt|reaching-defs', p: {var: 'item.name.charAt', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', t: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@25:3', t: 'can://typescript/sample-app/src/util.ts/classify@28:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@25:3', t: 'can://typescript/sample-app/src/util.ts/classify@28:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@25:3', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@25:3', t: 'can://typescript/sample-app/src/util.ts/classify@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@28:3', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@28:3', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'out[*]|reaching-defs', p: {var: 'out[*]', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@28:3', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@30:5', k: 'item|reaching-defs', p: {var: 'item', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@30:5', k: 'true', p: {kind: 'true'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@30:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'item|reaching-defs', p: {var: 'item', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', k: 'false', p: {kind: 'false'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@30:15', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@30:5', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@30:5', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'k|reaching-defs', p: {var: 'k', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@30:5', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@30:5', t: 'can://typescript/sample-app/src/util.ts/classify@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', k: 'loop_back', p: {kind: 'loop_back'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'out[*]|reaching-defs', p: {var: 'out[*]', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@exit', k: 'exception', p: {kind: 'exception'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_out', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@33:3', t: 'can://typescript/sample-app/src/util.ts/classify@exit', k: 'return', p: {kind: 'return'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@33:3', t: 'can://typescript/sample-app/src/util.ts/classify@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@entry', t: 'can://typescript/sample-app/src/util.ts/classify@25:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@entry', t: 'can://typescript/sample-app/src/util.ts/classify@25:3', p: {}}, + {f: 'can://typescript/sample-app/src/util.ts/classify@entry', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', k: 'items|reaching-defs', p: {var: 'items', prov: ['reaching-defs']}}, + {k: 'can://typescript/sample-app', p: {id: 'can://typescript/sample-app', schema_version: '2.1.0', language: 'typescript', max_level: 4, k_limit: 3, analyzer_name: 'codeanalyzer-typescript', analyzer_version: '1.0.0'}} + {k: 'can://typescript/sample-app/@external/(builtin)/charAt', p: {id: 'can://typescript/sample-app/@external/(builtin)/charAt', kind: 'external', name: 'charAt', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/(builtin)/eval', p: {id: 'can://typescript/sample-app/@external/(builtin)/eval', kind: 'external', name: 'eval', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/(builtin)/join', p: {id: 'can://typescript/sample-app/@external/(builtin)/join', kind: 'external', name: 'join', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/(builtin)/log', p: {id: 'can://typescript/sample-app/@external/(builtin)/log', kind: 'external', name: 'log', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/(builtin)/map', p: {id: 'can://typescript/sample-app/@external/(builtin)/map', kind: 'external', name: 'map', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/(builtin)/push', p: {id: 'can://typescript/sample-app/@external/(builtin)/push', kind: 'external', name: 'push', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/(builtin)/repeat', p: {id: 'can://typescript/sample-app/@external/(builtin)/repeat', kind: 'external', name: 'repeat', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/(builtin)/replace', p: {id: 'can://typescript/sample-app/@external/(builtin)/replace', kind: 'external', name: 'replace', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', p: {id: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', kind: 'external', name: 'toLowerCase', module: '(builtin)'}}, + {k: 'can://typescript/sample-app/@external/commander/Command', p: {id: 'can://typescript/sample-app/@external/commander/Command', kind: 'external', name: 'Command', module: 'commander'}}, + {k: 'can://typescript/sample-app/@external/commander/description', p: {id: 'can://typescript/sample-app/@external/commander/description', kind: 'external', name: 'description', module: 'commander'}}, + {k: 'can://typescript/sample-app/@external/commander/name', p: {id: 'can://typescript/sample-app/@external/commander/name', kind: 'external', name: 'name', module: 'commander'}}, + {k: 'can://typescript/sample-app/@external/commander/parse', p: {id: 'can://typescript/sample-app/@external/commander/parse', kind: 'external', name: 'parse', module: 'commander'}}, + {k: 'can://typescript/sample-app/@external/neo4j-driver-core/session', p: {id: 'can://typescript/sample-app/@external/neo4j-driver-core/session', kind: 'external', name: 'session', module: 'neo4j-driver-core'}}, + {k: 'can://typescript/sample-app/@external/neo4j-driver/basic', p: {id: 'can://typescript/sample-app/@external/neo4j-driver/basic', kind: 'external', name: 'basic', module: 'neo4j-driver'}}, + {k: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {id: 'can://typescript/sample-app/@external/neo4j-driver/driver', kind: 'external', name: 'driver', module: 'neo4j-driver'}}, + {k: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', p: {id: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', kind: 'external', name: 'rxSession', module: 'neo4j-driver'}}, + {k: 'can://typescript/sample-app/@external/node:crypto/createHash', p: {id: 'can://typescript/sample-app/@external/node:crypto/createHash', kind: 'external', name: 'createHash', module: 'node:crypto'}}, + {k: 'can://typescript/sample-app/@external/node:crypto/randomUUID', p: {id: 'can://typescript/sample-app/@external/node:crypto/randomUUID', kind: 'external', name: 'randomUUID', module: 'node:crypto'}}, + {k: 'can://typescript/sample-app/@external/node:fs/readFileSync', p: {id: 'can://typescript/sample-app/@external/node:fs/readFileSync', kind: 'external', name: 'readFileSync', module: 'node:fs'}}, + {k: 'can://typescript/sample-app/@external/node:path/extname', p: {id: 'can://typescript/sample-app/@external/node:path/extname', kind: 'external', name: 'extname', module: 'node:path'}} + {k: 'can://typescript/sample-app/src/controllers.ts', p: {id: 'can://typescript/sample-app/src/controllers.ts', kind: 'module', name: 'src/controllers.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 29, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller', kind: 'function', signature: 'src/controllers.Controller', name: 'Controller', return_type: 'ClassDecorator', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 4, end_line: 6, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller/', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/', kind: 'arrow', signature: 'src/controllers.Controller.', name: '(anonymous)', return_type: 'undefined', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', kind: 'statement', start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', kind: 'entry', start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller/@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/@exit', kind: 'exit', start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller/@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', kind: 'statement', start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', kind: 'entry', start_line: 4, end_line: 6, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@exit', kind: 'exit', start_line: 4, end_line: 6, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_in:0', kind: 'formal_in', of: 'prefix', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get', kind: 'function', signature: 'src/controllers.Get', name: 'Get', return_type: 'MethodDecorator', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 7, end_line: 9, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get/', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/', kind: 'arrow', signature: 'src/controllers.Get.', name: '(anonymous)', return_type: 'undefined', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', kind: 'entry', start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get/@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/@exit', kind: 'exit', start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get/@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@entry', kind: 'entry', start_line: 7, end_line: 9, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@exit', kind: 'exit', start_line: 7, end_line: 9, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@formal_in:0', kind: 'formal_in', of: 'path', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Get@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param', kind: 'function', signature: 'src/controllers.Param', name: 'Param', return_type: 'ParameterDecorator', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 10, end_line: 12, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param/', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/', kind: 'arrow', signature: 'src/controllers.Param.', name: '(anonymous)', return_type: 'undefined', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', kind: 'statement', start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', kind: 'entry', start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param/@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/@exit', kind: 'exit', start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param/@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', kind: 'statement', start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@entry', kind: 'entry', start_line: 10, end_line: 12, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@exit', kind: 'exit', start_line: 10, end_line: 12, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@formal_in:0', kind: 'formal_in', of: 'name', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/Param@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController', kind: 'class', signature: 'src/controllers.UserController', name: 'UserController', is_abstract: false, is_exported: true, is_ambient: false, start_line: 14, end_line: 28}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', kind: 'constructor', signature: 'src/controllers.UserController.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 16, end_line: 16, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@entry', kind: 'entry', start_line: 16, end_line: 16, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@exit', kind: 'exit', start_line: 16, end_line: 16, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0', kind: 'formal_in', of: 'service', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list', kind: 'method', signature: 'src/controllers.UserController.list', name: 'list', return_type: 'string[]', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 24, end_line: 27, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:12', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:12', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', start_line: 26, end_line: 26, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', kind: 'statement', start_line: 26, end_line: 26, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out', kind: 'actual_out', of: '$ret', parent: '26:5', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', kind: 'entry', start_line: 24, end_line: 27, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', kind: 'exit', start_line: 24, end_line: 27, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/service', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/service', kind: 'field', name: 'service', type: 'UserService', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show', kind: 'method', signature: 'src/controllers.UserController.show', name: 'show', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 18, end_line: 22, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:18', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:18', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/create', start_line: 20, end_line: 20, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '20:5', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', kind: 'actual_out', of: '$ret', parent: '20:5', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:12', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:12', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/User/describe', start_line: 21, end_line: 21, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', kind: 'statement', start_line: 21, end_line: 21, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out', kind: 'actual_out', of: '$ret', parent: '21:5', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', kind: 'entry', start_line: 18, end_line: 22, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', kind: 'exit', start_line: 18, end_line: 22, _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0', kind: 'formal_in', of: 'id', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts', p: {id: 'can://typescript/sample-app/src/external-calls.ts', kind: 'module', name: 'src/external-calls.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 62, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', kind: 'function', signature: 'src/external-calls.makesCommand', name: 'makesCommand', return_type: 'Command', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 26, end_line: 31, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:15', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:15', kind: 'call', callee: 'can://typescript/sample-app/@external/commander/Command', start_line: 27, end_line: 27, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', kind: 'statement', start_line: 27, end_line: 27, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', kind: 'call', callee: 'can://typescript/sample-app/@external/commander/description', start_line: 28, end_line: 28, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/2', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/2', kind: 'call', callee: 'can://typescript/sample-app/@external/commander/name', start_line: 28, end_line: 28, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '28:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_out', kind: 'actual_out', of: '$ret', parent: '28:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', kind: 'call', callee: 'can://typescript/sample-app/@external/commander/parse', start_line: 29, end_line: 29, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '29:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_out', kind: 'actual_out', of: '$ret', parent: '29:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', kind: 'statement', start_line: 30, end_line: 30, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', kind: 'entry', start_line: 26, end_line: 31, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', kind: 'exit', start_line: 26, end_line: 31, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', kind: 'function', signature: 'src/external-calls.makesDriver', name: 'makesDriver', return_type: 'unknown', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 38, end_line: 40, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:10', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:10', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver/driver', start_line: 39, end_line: 39, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', kind: 'statement', start_line: 39, end_line: 39, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '39:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_out', kind: 'actual_out', of: '$ret', parent: '39:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', kind: 'entry', start_line: 38, end_line: 40, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', kind: 'exit', start_line: 38, end_line: 40, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession', kind: 'function', signature: 'src/external-calls.makesSession', name: 'makesSession', return_type: 'unknown', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 51, end_line: 56, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:13', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:13', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver/driver', start_line: 52, end_line: 52, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', kind: 'statement', start_line: 52, end_line: 52, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '52:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '52:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', kind: 'actual_out', of: '$ret', parent: '52:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:46', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:46', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver/basic', start_line: 52, end_line: 52, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:13', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:13', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver-core/session', start_line: 53, end_line: 53, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', kind: 'statement', start_line: 53, end_line: 53, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', start_line: 54, end_line: 54, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', kind: 'statement', start_line: 55, end_line: 55, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', kind: 'entry', start_line: 51, end_line: 56, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', kind: 'exit', start_line: 51, end_line: 56, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', kind: 'function', signature: 'src/external-calls.readsConfig', name: 'readsConfig', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 14, end_line: 16, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:10', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:10', kind: 'call', callee: 'can://typescript/sample-app/@external/node:fs/readFileSync', start_line: 15, end_line: 15, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '15:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '15:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', kind: 'actual_out', of: '$ret', parent: '15:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', kind: 'entry', start_line: 14, end_line: 16, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', kind: 'exit', start_line: 14, end_line: 16, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', kind: 'function', signature: 'src/external-calls.unsafeEval', name: 'unsafeEval', return_type: 'unknown', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 59, end_line: 61, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:10', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:10', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/eval', start_line: 60, end_line: 60, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', kind: 'statement', start_line: 60, end_line: 60, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '60:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_out', kind: 'actual_out', of: '$ret', parent: '60:3', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', kind: 'entry', start_line: 59, end_line: 61, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', kind: 'exit', start_line: 59, end_line: 61, _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_in:0', kind: 'formal_in', of: 'raw', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts', p: {id: 'can://typescript/sample-app/src/external.ts', kind: 'module', name: 'src/external.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 17, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf', kind: 'function', signature: 'src/external.extensionOf', name: 'extensionOf', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 14, end_line: 16, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf@15:10', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@15:10', kind: 'call', callee: 'can://typescript/sample-app/@external/node:path/extname', start_line: 15, end_line: 15, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '15:3', _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_out', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_out', kind: 'actual_out', of: '$ret', parent: '15:3', _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', kind: 'entry', start_line: 14, end_line: 16, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', kind: 'exit', start_line: 14, end_line: 16, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_in:0', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_in:0', kind: 'formal_in', of: 'file', _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_out', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint', kind: 'function', signature: 'src/external.fingerprint', name: 'fingerprint', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 6, end_line: 11, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@7:14', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@7:14', kind: 'call', callee: 'can://typescript/sample-app/@external/node:crypto/randomUUID', start_line: 7, end_line: 7, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10', kind: 'call', start_line: 8, end_line: 10, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/2', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/2', kind: 'call', start_line: 8, end_line: 9, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/3', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/3', kind: 'call', callee: 'can://typescript/sample-app/@external/node:crypto/createHash', start_line: 8, end_line: 8, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', kind: 'statement', start_line: 8, end_line: 10, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '8:3', _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_out', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_out', kind: 'actual_out', of: '$ret', parent: '8:3', _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', kind: 'entry', start_line: 6, end_line: 11, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', kind: 'exit', start_line: 6, end_line: 11, _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_in:0', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_in:0', kind: 'formal_in', of: 'name', _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_out', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts', p: {id: 'can://typescript/sample-app/src/index.ts', kind: 'module', name: 'src/index.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 26, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main', p: {id: 'can://typescript/sample-app/src/index.ts/main', kind: 'function', signature: 'src/index.main', name: 'main', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 6, end_line: 23, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@11:22', p: {id: 'can://typescript/sample-app/src/index.ts/main@11:22', kind: 'call', callee: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', start_line: 11, end_line: 11, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@11:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@11:3', kind: 'statement', start_line: 11, end_line: 11, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '11:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_out', kind: 'actual_out', of: '$ret', parent: '11:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@12:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@12:3', kind: 'call', callee: 'can://typescript/sample-app/src/controllers.ts/UserController/list', start_line: 12, end_line: 12, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@12:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@12:3/actual_out', kind: 'actual_out', of: '$ret', parent: '12:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@13:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@13:3', kind: 'call', callee: 'can://typescript/sample-app/src/controllers.ts/UserController/show', start_line: 13, end_line: 13, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '13:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', kind: 'actual_out', of: '$ret', parent: '13:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@16:12', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:12', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/User/constructor', start_line: 16, end_line: 16, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@16:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/announce', start_line: 16, end_line: 16, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '16:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '16:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2', kind: 'actual_in', of: 'arg2', parent: '16:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', kind: 'actual_out', of: '$ret', parent: '16:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@17:12', p: {id: 'can://typescript/sample-app/src/index.ts/main@17:12', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/Robot/constructor', start_line: 17, end_line: 17, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@17:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@17:3', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/announce', start_line: 17, end_line: 17, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '17:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', kind: 'actual_out', of: '$ret', parent: '17:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@19:16', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:16', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', start_line: 19, end_line: 19, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@19:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:3', kind: 'statement', start_line: 19, end_line: 19, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '19:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '19:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', kind: 'actual_out', of: '$ret', parent: '19:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@20:19', p: {id: 'can://typescript/sample-app/src/index.ts/main@20:19', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', start_line: 20, end_line: 20, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@20:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@20:3', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@21:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', start_line: 21, end_line: 21, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@21:3/2', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3/2', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', start_line: 21, end_line: 21, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@21:3/3', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3/3', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', start_line: 21, end_line: 21, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '21:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', kind: 'actual_out', of: '$ret', parent: '21:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@22:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@22:3', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/log', start_line: 22, end_line: 22, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '22:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_out', kind: 'actual_out', of: '$ret', parent: '22:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@7:19', p: {id: 'can://typescript/sample-app/src/index.ts/main@7:19', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/constructor', start_line: 7, end_line: 7, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@7:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@7:3', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '7:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_out', kind: 'actual_out', of: '$ret', parent: '7:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@8:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@8:3', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/create', start_line: 8, end_line: 8, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '8:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '8:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', kind: 'actual_out', of: '$ret', parent: '8:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@9:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@9:3', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', start_line: 9, end_line: 9, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@9:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@9:3/actual_out', kind: 'actual_out', of: '$ret', parent: '9:3', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@entry', p: {id: 'can://typescript/sample-app/src/index.ts/main@entry', kind: 'entry', start_line: 6, end_line: 23, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@exit', p: {id: 'can://typescript/sample-app/src/index.ts/main@exit', kind: 'exit', start_line: 6, end_line: 23, _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/index.ts/main@formal_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/index.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts', p: {id: 'can://typescript/sample-app/src/models.ts', kind: 'module', name: 'src/models.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 65, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Entity', p: {id: 'can://typescript/sample-app/src/models.ts/Entity', kind: 'class', signature: 'src/models.Entity', name: 'Entity', base_classes: ['src/models.Identifiable'], implements_types: ['src/models.Identifiable'], is_abstract: true, is_exported: true, is_ambient: false, start_line: 26, end_line: 29}}, + {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor', kind: 'constructor', signature: 'src/models.Entity.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 27, end_line: 27, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor@entry', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor@entry', kind: 'entry', start_line: 27, end_line: 27, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor@exit', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor@exit', kind: 'exit', start_line: 27, end_line: 27, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0', kind: 'formal_in', of: 'id', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Entity/describe', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/describe', kind: 'method', signature: 'src/models.Entity.describe', name: 'describe', return_type: 'string', cyclomatic_complexity: 0, is_static: false, is_abstract: true, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 28, end_line: 28, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Entity/id', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/id', kind: 'field', name: 'id', type: 'ID', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Flag', p: {id: 'can://typescript/sample-app/src/models.ts/Flag', kind: 'enum', signature: 'src/models.Flag', name: 'Flag', is_const: true, is_exported: true, is_ambient: false, start_line: 20, end_line: 23}}, + {k: 'can://typescript/sample-app/src/models.ts/Flag/Active', p: {id: 'can://typescript/sample-app/src/models.ts/Flag/Active', kind: 'field', name: 'Active', start_line: 22, end_line: 22, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Flag/None', p: {id: 'can://typescript/sample-app/src/models.ts/Flag/None', kind: 'field', name: 'None', start_line: 21, end_line: 21, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Identifiable', p: {id: 'can://typescript/sample-app/src/models.ts/Identifiable', kind: 'interface', signature: 'src/models.Identifiable', name: 'Identifiable', is_exported: true, is_ambient: false, start_line: 3, end_line: 5}}, + {k: 'can://typescript/sample-app/src/models.ts/Identifiable/id', p: {id: 'can://typescript/sample-app/src/models.ts/Identifiable/id', kind: 'field', name: 'id', type: 'T', start_line: 4, end_line: 4, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Named', p: {id: 'can://typescript/sample-app/src/models.ts/Named', kind: 'interface', signature: 'src/models.Named', name: 'Named', is_exported: true, is_ambient: false, start_line: 7, end_line: 10}} + {k: 'can://typescript/sample-app/src/models.ts/Named/describe', p: {id: 'can://typescript/sample-app/src/models.ts/Named/describe', kind: 'method', signature: 'src/models.Named.describe', name: 'describe', return_type: 'string', cyclomatic_complexity: 0, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 9, end_line: 9, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Named/name', p: {id: 'can://typescript/sample-app/src/models.ts/Named/name', kind: 'field', name: 'name', type: 'string', start_line: 8, end_line: 8, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot', p: {id: 'can://typescript/sample-app/src/models.ts/Robot', kind: 'class', signature: 'src/models.Robot', name: 'Robot', base_classes: ['src/models.Named'], implements_types: ['src/models.Named'], is_abstract: false, is_exported: true, is_ambient: false, start_line: 59, end_line: 64}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor', kind: 'constructor', signature: 'src/models.Robot.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 60, end_line: 60, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor@entry', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor@entry', kind: 'entry', start_line: 60, end_line: 60, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor@exit', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor@exit', kind: 'exit', start_line: 60, end_line: 60, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0', kind: 'formal_in', of: 'name', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/describe', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe', kind: 'method', signature: 'src/models.Robot.describe', name: 'describe', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 61, end_line: 63, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', kind: 'statement', start_line: 62, end_line: 62, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', kind: 'entry', start_line: 61, end_line: 63, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/describe@exit', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe@exit', kind: 'exit', start_line: 61, end_line: 63, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/describe@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Robot/name', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/name', kind: 'field', name: 'name', type: 'string', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Role', p: {id: 'can://typescript/sample-app/src/models.ts/Role', kind: 'enum', signature: 'src/models.Role', name: 'Role', is_const: false, is_exported: true, is_ambient: false, start_line: 14, end_line: 18}} + {k: 'can://typescript/sample-app/src/models.ts/Role/Admin', p: {id: 'can://typescript/sample-app/src/models.ts/Role/Admin', kind: 'field', name: 'Admin', start_line: 15, end_line: 15, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Role/Guest', p: {id: 'can://typescript/sample-app/src/models.ts/Role/Guest', kind: 'field', name: 'Guest', start_line: 17, end_line: 17, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/Role/Member', p: {id: 'can://typescript/sample-app/src/models.ts/Role/Member', kind: 'field', name: 'Member', start_line: 16, end_line: 16, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User', p: {id: 'can://typescript/sample-app/src/models.ts/User', kind: 'class', signature: 'src/models.User', name: 'User', base_classes: ['src/models.Entity', 'src/models.Named'], implements_types: ['src/models.Named'], is_abstract: false, is_exported: true, is_ambient: false, start_line: 31, end_line: 56}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor', kind: 'constructor', signature: 'src/models.User.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 35, end_line: 42, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/Entity/constructor', start_line: 40, end_line: 40, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '40:5', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out', kind: 'actual_out', of: '$ret', parent: '40:5', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', kind: 'statement', start_line: 41, end_line: 41, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', kind: 'entry', start_line: 35, end_line: 42, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', kind: 'exit', start_line: 35, end_line: 42, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', kind: 'formal_in', of: 'id', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', kind: 'formal_in', of: 'name', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', kind: 'formal_in', of: 'role', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/describe', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe', kind: 'method', signature: 'src/models.User.describe', name: 'describe', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 48, end_line: 50, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', kind: 'statement', start_line: 49, end_line: 49, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/describe@entry', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe@entry', kind: 'entry', start_line: 48, end_line: 50, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/describe@exit', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe@exit', kind: 'exit', start_line: 48, end_line: 50, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/instances', p: {id: 'can://typescript/sample-app/src/models.ts/User/instances', kind: 'field', name: 'instances', type: 'number', start_line: 33, end_line: 33, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin', kind: 'getter', signature: 'src/models.User.isAdmin', name: 'isAdmin', return_type: 'boolean', cyclomatic_complexity: 1, accessor_kind: 'getter', is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 44, end_line: 46, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', kind: 'statement', start_line: 45, end_line: 45, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', kind: 'entry', start_line: 44, end_line: 46, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin@exit', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin@exit', kind: 'exit', start_line: 44, end_line: 46, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/loginCount', p: {id: 'can://typescript/sample-app/src/models.ts/User/loginCount', kind: 'field', name: 'loginCount', type: 'number', start_line: 32, end_line: 32, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/name', p: {id: 'can://typescript/sample-app/src/models.ts/User/name', kind: 'field', name: 'name', type: 'string', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin', kind: 'method', signature: 'src/models.User.recordLogin', name: 'recordLogin', return_type: 'Promise', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: true, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 52, end_line: 55, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', kind: 'statement', start_line: 53, end_line: 53, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', kind: 'statement', start_line: 54, end_line: 54, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', kind: 'entry', start_line: 52, end_line: 55, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@exit', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@exit', kind: 'exit', start_line: 52, end_line: 55, _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/User/role', p: {id: 'can://typescript/sample-app/src/models.ts/User/role', kind: 'field', name: 'role', type: 'Role', _module: 'src/models.ts'}}, + {k: 'can://typescript/sample-app/src/models.ts/UserId', p: {id: 'can://typescript/sample-app/src/models.ts/UserId', kind: 'type_alias', signature: 'src/models.UserId', name: 'UserId', aliased_type: 'string | number', is_exported: true, is_ambient: false, start_line: 12, end_line: 12}} + {k: 'can://typescript/sample-app/src/services.ts', p: {id: 'can://typescript/sample-app/src/services.ts', kind: 'module', name: 'src/services.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 48, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService', p: {id: 'can://typescript/sample-app/src/services.ts/UserService', kind: 'class', signature: 'src/services.UserService', name: 'UserService', is_abstract: false, is_exported: true, is_ambient: false, start_line: 19, end_line: 47}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor', kind: 'constructor', signature: 'src/services.UserService.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 22, end_line: 22, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor@entry', kind: 'entry', start_line: 22, end_line: 22, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor@exit', kind: 'exit', start_line: 22, end_line: 22, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0', kind: 'formal_in', of: 'startId', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create', kind: 'method', signature: 'src/services.UserService.create', name: 'create', return_type: 'User', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 24, end_line: 29, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@25:16', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@25:16', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/nextId', start_line: 25, end_line: 25, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', kind: 'statement', start_line: 25, end_line: 25, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '25:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', kind: 'actual_out', of: '$ret', parent: '25:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:18', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:18', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/User/constructor', start_line: 26, end_line: 26, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', kind: 'statement', start_line: 26, end_line: 26, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '26:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '26:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2', kind: 'actual_in', of: 'arg2', parent: '26:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out', kind: 'actual_out', of: '$ret', parent: '26:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/push', start_line: 27, end_line: 27, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '27:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_out', kind: 'actual_out', of: '$ret', parent: '27:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', kind: 'statement', start_line: 28, end_line: 28, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', kind: 'entry', start_line: 24, end_line: 29, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', kind: 'exit', start_line: 24, end_line: 29, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', kind: 'formal_in', of: 'name', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', kind: 'formal_in', of: 'role', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', kind: 'method', signature: 'src/services.UserService.createGuest', name: 'createGuest', return_type: 'User', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 31, end_line: 34, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:18', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:18', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/makeGuestName', start_line: 32, end_line: 32, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', kind: 'statement', start_line: 32, end_line: 32, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '32:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', kind: 'actual_out', of: '$ret', parent: '32:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:12', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:12', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/create', start_line: 33, end_line: 33, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', kind: 'statement', start_line: 33, end_line: 33, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '33:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '33:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', kind: 'actual_out', of: '$ret', parent: '33:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', kind: 'entry', start_line: 31, end_line: 34, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', kind: 'exit', start_line: 31, end_line: 34, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', kind: 'method', signature: 'src/services.UserService.describeAll', name: 'describeAll', return_type: 'string[]', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 36, end_line: 38, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', kind: 'arrow', signature: 'src/services.UserService.describeAll.', name: '(anonymous)', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 37, end_line: 37, _module: 'src/services.ts'}} + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', kind: 'statement', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', kind: 'entry', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', kind: 'exit', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_in:0', kind: 'formal_in', of: 'u', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:12', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:12', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/map', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', kind: 'statement', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '37:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_out', kind: 'actual_out', of: '$ret', parent: '37:5', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', kind: 'entry', start_line: 36, end_line: 38, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', kind: 'exit', start_line: 36, end_line: 38, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', kind: 'method', signature: 'src/services.UserService.loginAll', name: 'loginAll', return_type: 'Promise', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: true, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 40, end_line: 46, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', kind: 'statement', start_line: 41, end_line: 41, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', kind: 'statement', start_line: 42, end_line: 44, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:22', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:22', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/User/recordLogin', start_line: 43, end_line: 43, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', kind: 'statement', start_line: 43, end_line: 43, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out', kind: 'actual_out', of: '$ret', parent: '43:7', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', kind: 'statement', start_line: 45, end_line: 45, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', kind: 'entry', start_line: 40, end_line: 46, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', kind: 'exit', start_line: 40, end_line: 46, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/startId', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/startId', kind: 'field', name: 'startId', type: 'number', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/UserService/users', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/users', kind: 'field', name: 'users', type: 'User[]', start_line: 20, end_line: 20, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/announce', p: {id: 'can://typescript/sample-app/src/services.ts/announce', kind: 'function', signature: 'src/services.announce', name: 'announce', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 12, end_line: 14, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/announce@13:10', p: {id: 'can://typescript/sample-app/src/services.ts/announce@13:10', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/Named/describe', start_line: 13, end_line: 13, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/announce@13:3', p: {id: 'can://typescript/sample-app/src/services.ts/announce@13:3', kind: 'statement', start_line: 13, end_line: 13, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/announce@entry', p: {id: 'can://typescript/sample-app/src/services.ts/announce@entry', kind: 'entry', start_line: 12, end_line: 14, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/announce@exit', p: {id: 'can://typescript/sample-app/src/services.ts/announce@exit', kind: 'exit', start_line: 12, end_line: 14, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', kind: 'formal_in', of: 'thing', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/announce@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/announce@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/makeGuestName', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName', kind: 'function', signature: 'src/services.makeGuestName', name: 'makeGuestName', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 4, end_line: 6, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', kind: 'statement', start_line: 5, end_line: 5, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', kind: 'entry', start_line: 4, end_line: 6, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@exit', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@exit', kind: 'exit', start_line: 4, end_line: 6, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0', kind: 'formal_in', of: 'seed', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/nextId', p: {id: 'can://typescript/sample-app/src/services.ts/nextId', kind: 'arrow', signature: 'src/services.nextId', name: 'nextId', return_type: 'UserId', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 17, end_line: 17, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/nextId@17:46', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@17:46', kind: 'statement', start_line: 17, end_line: 17, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/nextId@entry', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@entry', kind: 'entry', start_line: 17, end_line: 17, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/nextId@exit', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@exit', kind: 'exit', start_line: 17, end_line: 17, _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/nextId@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts', p: {id: 'can://typescript/sample-app/src/util.ts', kind: 'module', name: 'src/util.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 35, _module: 'src/util.ts'}} + {k: 'can://typescript/sample-app/src/util.ts/StringUtil', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil', kind: 'namespace', signature: 'src/util.StringUtil', name: 'StringUtil', is_exported: true, is_ambient: false, start_line: 2, end_line: 21}} + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', kind: 'class', signature: 'src/util.StringUtil.Builder', name: 'Builder', is_abstract: false, is_exported: true, is_ambient: false, start_line: 11, end_line: 20}} + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', kind: 'method', signature: 'src/util.StringUtil.Builder.add', name: 'add', return_type: 'this', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 13, end_line: 16, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:23', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:23', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', start_line: 14, end_line: 14, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/push', start_line: 14, end_line: 14, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '14:7', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', kind: 'actual_out', of: '$ret', parent: '14:7', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', kind: 'entry', start_line: 13, end_line: 16, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', kind: 'exit', start_line: 13, end_line: 16, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0', kind: 'formal_in', of: 'part', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', kind: 'method', signature: 'src/util.StringUtil.Builder.build', name: 'build', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 17, end_line: 19, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:14', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:14', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/join', start_line: 18, end_line: 18, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', kind: 'statement', start_line: 18, end_line: 18, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '18:7', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_out', kind: 'actual_out', of: '$ret', parent: '18:7', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', kind: 'entry', start_line: 17, end_line: 19, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', kind: 'exit', start_line: 17, end_line: 19, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', kind: 'constructor', signature: 'src/util.StringUtil.Builder.constructor', name: 'constructor', cyclomatic_complexity: 0, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: true, start_line: 0, end_line: 0, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts', kind: 'field', name: 'parts', type: 'string[]', start_line: 12, end_line: 12, _module: 'src/util.ts'}} + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', kind: 'function', signature: 'src/util.StringUtil.repeat', name: 'repeat', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 3, end_line: 5, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/repeat', start_line: 4, end_line: 4, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12/2', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12/2', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', start_line: 4, end_line: 4, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', kind: 'statement', start_line: 4, end_line: 4, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '4:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', kind: 'actual_out', of: '$ret', parent: '4:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', kind: 'entry', start_line: 3, end_line: 5, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', kind: 'exit', start_line: 3, end_line: 5, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1', kind: 'formal_in', of: 'n', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', kind: 'function', signature: 'src/util.StringUtil.slug', name: 'slug', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 7, end_line: 9, _module: 'src/util.ts'}} + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/replace', start_line: 8, end_line: 8, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12/2', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12/2', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', start_line: 8, end_line: 8, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '8:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:1', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '8:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', kind: 'actual_out', of: '$ret', parent: '8:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', kind: 'entry', start_line: 7, end_line: 9, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', kind: 'exit', start_line: 7, end_line: 9, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}} + {k: 'can://typescript/sample-app/src/util.ts/classify', p: {id: 'can://typescript/sample-app/src/util.ts/classify', kind: 'function', signature: 'src/util.classify', name: 'classify', return_type: 'Record', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 24, end_line: 34, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf', kind: 'function', signature: 'src/util.classify.keyOf', name: 'keyOf', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 25, end_line: 27, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:12', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:12', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/charAt', start_line: 26, end_line: 26, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', kind: 'statement', start_line: 26, end_line: 26, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '26:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_out', kind: 'actual_out', of: '$ret', parent: '26:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', kind: 'entry', start_line: 25, end_line: 27, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', kind: 'exit', start_line: 25, end_line: 27, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0', kind: 'formal_in', of: 'item', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@25:3', p: {id: 'can://typescript/sample-app/src/util.ts/classify@25:3', kind: 'statement', start_line: 25, end_line: 27, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@28:3', p: {id: 'can://typescript/sample-app/src/util.ts/classify@28:3', kind: 'statement', start_line: 28, end_line: 28, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@29:3', p: {id: 'can://typescript/sample-app/src/util.ts/classify@29:3', kind: 'statement', start_line: 29, end_line: 32, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@30:15', p: {id: 'can://typescript/sample-app/src/util.ts/classify@30:15', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/classify/keyOf', start_line: 30, end_line: 30, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@30:5', p: {id: 'can://typescript/sample-app/src/util.ts/classify@30:5', kind: 'statement', start_line: 30, end_line: 30, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '30:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', kind: 'actual_out', of: '$ret', parent: '30:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@31:5', p: {id: 'can://typescript/sample-app/src/util.ts/classify@31:5', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/push', start_line: 31, end_line: 31, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '31:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_out', kind: 'actual_out', of: '$ret', parent: '31:5', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@33:3', p: {id: 'can://typescript/sample-app/src/util.ts/classify@33:3', kind: 'statement', start_line: 33, end_line: 33, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@entry', p: {id: 'can://typescript/sample-app/src/util.ts/classify@entry', kind: 'entry', start_line: 24, end_line: 34, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@exit', p: {id: 'can://typescript/sample-app/src/util.ts/classify@exit', kind: 'exit', start_line: 24, end_line: 34, _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify@formal_in:0', kind: 'formal_in', of: 'items', _module: 'src/util.ts'}}, + {k: 'can://typescript/sample-app/src/util.ts/classify@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, +// ── constraints & indexes ── +// ── nodes ── +// ── relationships ── +// ── wipe this project's prior subgraph (external targets are shared) ── +CREATE CONSTRAINT application_id IF NOT EXISTS FOR (x:Application) REQUIRE x.id IS UNIQUE; +CREATE CONSTRAINT cannode_id IF NOT EXISTS FOR (x:CanNode) REQUIRE x.id IS UNIQUE; +CREATE INDEX callable_name IF NOT EXISTS FOR (c:TSCallable) ON (c.name); +CREATE INDEX cannode_kind IF NOT EXISTS FOR (n:CanNode) ON (n.kind); +CREATE INDEX cannode_module IF NOT EXISTS FOR (n:CanNode) ON (n._module); +DETACH DELETE x, m, a; +MATCH (a:Application {id: 'can://typescript/sample-app'}) +MATCH (a:Application {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (a:CanNode {id: row.f}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MATCH (b:CanNode {id: row.t}) +MERGE (a)-[r:TS_CALLS]->(b) +MERGE (a)-[r:TS_CDG]->(b) +MERGE (a)-[r:TS_CFG_NEXT {_k: row.k}]->(b) +MERGE (a)-[r:TS_DDG {_k: row.k}]->(b) +MERGE (a)-[r:TS_DECLARES]->(b) +MERGE (a)-[r:TS_EXTENDS]->(b) +MERGE (a)-[r:TS_HAS_BODY_NODE]->(b) +MERGE (a)-[r:TS_HAS_FIELD]->(b) +MERGE (a)-[r:TS_HAS_METHOD]->(b) +MERGE (a)-[r:TS_HAS_MODULE]->(b) +MERGE (a)-[r:TS_IMPLEMENTS]->(b) +MERGE (a)-[r:TS_PARAM_IN]->(b) +MERGE (a)-[r:TS_PARAM_OUT]->(b) +MERGE (a)-[r:TS_RESOLVES_TO]->(b) +MERGE (a)-[r:TS_SUMMARY]->(b) +MERGE (n:Application {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +MERGE (n:CanNode {id: row.k}) +OPTIONAL MATCH (a)-[:TS_HAS_MODULE]->(m:TSModule) +OPTIONAL MATCH (m)-[:TS_DECLARES|TS_HAS_METHOD|TS_HAS_FIELD|TS_HAS_BODY_NODE*1..]->(x) +SET n += row.p, n:TSApplication; +SET n += row.p, n:TSBodyNode; +SET n += row.p, n:TSCallable:TSAnonymousCallable; +SET n += row.p, n:TSCallable; +SET n += row.p, n:TSClass; +SET n += row.p, n:TSEnum; +SET n += row.p, n:TSExternal; +SET n += row.p, n:TSField; +SET n += row.p, n:TSInterface; +SET n += row.p, n:TSModule; +SET n += row.p, n:TSNamespace; +SET n += row.p, n:TSTypeAlias; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +SET r += row.p; +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +UNWIND [ +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row +] AS row \ No newline at end of file diff --git a/test/native-rewrite-goldens.test.ts b/test/native-rewrite-goldens.test.ts new file mode 100644 index 0000000..30dd0c9 --- /dev/null +++ b/test/native-rewrite-goldens.test.ts @@ -0,0 +1,101 @@ +/** + * Transition gate for the native-v2-model rewrite (#96, docs/design/specs/native-v2-model.md). + * + * Captured from the branch base (pre-rewrite `main` behavior), these goldens pin the wire — + * `analysis.json` at every level plus the Neo4j cypher projection — so each rewrite stage can + * prove itself wire-stable. Comparison is DEEP-EQUAL after parsing (JSON object key order is + * meaningless to consumers; the SDK parses, never diffs bytes); cypher is compared as a sorted + * line set (row emission order follows object iteration order, which re-bucketing legitimately + * changes; the graph is the set of rows). `analyzer.version` is normalized out. + * + * Regenerate (Stage 0 only): GOLDEN_REGEN=1 bun test test/native-rewrite-goldens.test.ts + * + * This file and test/goldens/ are TRANSITION-SCOPED: deleted at Stage 4 teardown, when the + * standing conformance + monotonicity gates take back over. + */ +import { describe, expect, test } from "bun:test"; +import * as fs from "node:fs"; +import * as os from "node:os"; +import * as path from "node:path"; +import { analyze } from "../src/core"; +import type { AnalysisOptions } from "../src/options"; +import { renderCypher, project } from "../src/build/neo4j"; +import { toV2Detailed } from "../src/schema/v2"; + +const GOLDEN_DIR = path.resolve(import.meta.dir, "goldens"); +const REGEN = !!process.env["GOLDEN_REGEN"]; +const FIXTURES = ["sample-app", "dataflow-app", "anon-app"] as const; +const LEVELS = [1, 2, 3, 4] as const; + +function options(fixture: string, level: number): AnalysisOptions { + return { + input: path.resolve(import.meta.dir, "fixtures", fixture), + output: null, + emit: "json", + appName: null, + neo4jUri: null, + neo4jUser: "neo4j", + neo4jPassword: "", + neo4jDatabase: null, + analysisLevel: level, + graphs: ["cfg", "dfg", "pdg", "sdg"], + graphFieldDepth: 3, + jobs: 1, + targetFiles: null, + skipTests: true, + eager: true, + noBuild: true, + phantoms: true, + callGraphProvider: "union", // the default provider — exercises tsc, jelly, and the merge + cacheDir: null, + verbosity: 0, + }; +} + +/** Parse-roundtrip (drops undefined exactly like the real emit) and pin the analyzer version. */ +function normalize(v2: unknown): Record { + const out = JSON.parse(JSON.stringify(v2)) as Record; + (out["analyzer"] as Record)["version"] = "GOLDEN"; + return out; +} + +interface Captured { + json: Record; + cypher: string[] | null; // sorted rows, level-4 runs only (--emit neo4j is always full-depth) +} + +async function capture(fixture: string, level: number): Promise { + const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-golden-")); + try { + const opts = { ...options(fixture, level), cacheDir }; + const app = await analyze(opts); + const { application } = toV2Detailed(app, opts); + const cypher = + level === 4 + ? renderCypher(project(application, application.application.id), application.application.id).split("\n").sort() + : null; + return { json: normalize(application), cypher }; + } finally { + fs.rmSync(cacheDir, { recursive: true, force: true }); + } +} + +for (const fixture of FIXTURES) { + describe(`goldens: ${fixture}`, () => { + for (const level of LEVELS) { + test(`analysis.json -a ${level}${level === 4 ? " + graph.cypher" : ""} matches the pre-rewrite wire`, async () => { + const got = await capture(fixture, level); + const jsonPath = path.join(GOLDEN_DIR, `${fixture}-a${level}.json`); + const cypherPath = path.join(GOLDEN_DIR, `${fixture}.cypher`); + if (REGEN) { + fs.mkdirSync(GOLDEN_DIR, { recursive: true }); + fs.writeFileSync(jsonPath, JSON.stringify(got.json)); + if (got.cypher) fs.writeFileSync(cypherPath, got.cypher.join("\n")); + return; + } + expect(got.json).toEqual(JSON.parse(fs.readFileSync(jsonPath, "utf-8"))); + if (got.cypher) expect(got.cypher).toEqual(fs.readFileSync(cypherPath, "utf-8").split("\n")); + }, 240_000); + } + }); +} From 8d10be46b1aefb8789e642e5b0abf4b42360566e Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 26 Aug 2026 18:21:53 -0400 Subject: [PATCH 3/8] =?UTF-8?q?refactor(schema):=20build=20the=20v2=20tree?= =?UTF-8?q?=20natively=20=E2=80=94=20one=20model=20+=20per-run=20passes=20?= =?UTF-8?q?(#96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stage 1 of the native-model rewrite (docs/design/specs/native-v2-model.md): - src/schema/schema.ts is now the native v2 shape: v2-bucketed, span-only containers (types{}/functions{}/fields{}, callables{}, body{}), omit- instead-of-null leaves, and the INTERNAL fields (call_sites, abs_path, cache trio) that never reach the wire. - builders.ts constructs that shape directly; the id-free tree is what the cache round-trips (ids embed --app-name, so they are per-run). - Python-parity passes: assignIds (can:// ids + sig→id map + collision gate), l1Body (call_sites → body{} call nodes, wholesale per-run rebuild that also makes repeated emission idempotent), heritage (extends_ids/ implements_ids), homing (externals + 2.1.0 synthesized index), l2Callees (callee null→id + call-graph re-identification + dangling gate). - emit.ts no longer reshapes anything: it runs the passes, assembles the envelope, and returns a deep internal-field-stripped wire copy. - callGraph.ts / dataflow readers walk the new buckets via the shared forEachCallable/forEachType walkers; RTA's class index keeps its historical module/namespace-scope reach. - Dead v1-only baggage deleted: per-node code, local_variables, value, container flat line/col ints, module_name/file_path. Wire-stable: all 12 pre-rewrite goldens (analysis.json -a 1..4 × 3 fixtures + cypher) deep-equal; full suite green. --- src/build/neo4j/project.ts | 32 +-- src/dataflow/index.ts | 42 +-- src/schema/assignIds.ts | 63 ++++ src/schema/heritage.ts | 37 +++ src/schema/homing.ts | 87 ++++++ src/schema/ids.ts | 38 +++ src/schema/l1Body.ts | 65 +++++ src/schema/l2Callees.ts | 51 ++++ src/schema/schema.ts | 448 +++++++++++++++-------------- src/schema/v2/emit.ts | 413 +++----------------------- src/schema/v2/model.ts | 109 ++----- src/semantic_analysis/callGraph.ts | 69 ++--- src/syntactic_analysis/builders.ts | 376 ++++++++++++------------ test/schema-v2.test.ts | 22 +- 14 files changed, 874 insertions(+), 978 deletions(-) create mode 100644 src/schema/assignIds.ts create mode 100644 src/schema/heritage.ts create mode 100644 src/schema/homing.ts create mode 100644 src/schema/ids.ts create mode 100644 src/schema/l1Body.ts create mode 100644 src/schema/l2Callees.ts diff --git a/src/build/neo4j/project.ts b/src/build/neo4j/project.ts index 0f2ab20..a51fb6f 100644 --- a/src/build/neo4j/project.ts +++ b/src/build/neo4j/project.ts @@ -154,7 +154,7 @@ function projectCallable(b: RowBuilder, c: V2Callable, owner: NodeRef, ownerRel: function projectField(b: RowBuilder, f: V2Field, owner: NodeRef, fileKey: string): void { const node = b.node([CAN, "TSField"], "id", f.id, prune({ - id: f.id, kind: "field", name: str(f.name), type: str((f as V2Node).type), ...span(f), _module: fileKey, + id: f.id, kind: "field", name: str(f.name), type: str((f as unknown as V2Node).type), ...span(f), _module: fileKey, })); b.edge("TS_HAS_FIELD", owner, node); } @@ -165,32 +165,32 @@ function projectField(b: RowBuilder, f: V2Field, owner: NodeRef, fileKey: string function moduleProps(mod: V2Module, fileKey: string): Props { return prune({ - id: mod.id, kind: "module", name: str((mod as V2Node).module_name) ?? fileKey, - is_tsx: bool((mod as V2Node).is_tsx), is_declaration_file: bool((mod as V2Node).is_declaration_file), - content_hash: str((mod as V2Node).content_hash), ...span(mod), _module: fileKey, + id: mod.id, kind: "module", name: str((mod as unknown as V2Node).module_name) ?? fileKey, + is_tsx: bool((mod as unknown as V2Node).is_tsx), is_declaration_file: bool((mod as unknown as V2Node).is_declaration_file), + content_hash: str((mod as unknown as V2Node).content_hash), ...span(mod), _module: fileKey, }); } function typeProps(t: V2Type, fileKey: string): Props { return prune({ - id: t.id, kind: t.kind, signature: str(t.signature), name: str((t as V2Node).name), - base_classes: strArr((t as V2Node).base_classes), implements_types: strArr((t as V2Node).implements_types), - aliased_type: str((t as V2Node).aliased_type), - is_abstract: bool((t as V2Node).is_abstract), is_const: bool((t as V2Node).is_const), - is_exported: bool((t as V2Node).is_exported), is_ambient: bool((t as V2Node).is_ambient), + id: t.id, kind: t.kind, signature: str(t.signature), name: str((t as unknown as V2Node).name), + base_classes: strArr((t as unknown as V2Node).base_classes), implements_types: strArr((t as unknown as V2Node).implements_types), + aliased_type: str((t as unknown as V2Node).aliased_type), + is_abstract: bool((t as unknown as V2Node).is_abstract), is_const: bool((t as unknown as V2Node).is_const), + is_exported: bool((t as unknown as V2Node).is_exported), is_ambient: bool((t as unknown as V2Node).is_ambient), ...span(t), }); } function callableProps(c: V2Callable, fileKey: string): Props { return prune({ - id: c.id, kind: c.kind, signature: str(c.signature), name: str((c as V2Node).name), - return_type: str((c as V2Node).return_type), cyclomatic_complexity: num((c as V2Node).cyclomatic_complexity), - accessibility: str((c as V2Node).accessibility), accessor_kind: str((c as V2Node).accessor_kind), - is_static: bool((c as V2Node).is_static), is_abstract: bool((c as V2Node).is_abstract), - is_async: bool((c as V2Node).is_async), is_generator: bool((c as V2Node).is_generator), - is_exported: bool((c as V2Node).is_exported), is_ambient: bool((c as V2Node).is_ambient), - is_implicit: bool((c as V2Node).is_implicit), ...span(c), _module: fileKey, + id: c.id, kind: c.kind, signature: str(c.signature), name: str((c as unknown as V2Node).name), + return_type: str((c as unknown as V2Node).return_type), cyclomatic_complexity: num((c as unknown as V2Node).cyclomatic_complexity), + accessibility: str((c as unknown as V2Node).accessibility), accessor_kind: str((c as unknown as V2Node).accessor_kind), + is_static: bool((c as unknown as V2Node).is_static), is_abstract: bool((c as unknown as V2Node).is_abstract), + is_async: bool((c as unknown as V2Node).is_async), is_generator: bool((c as unknown as V2Node).is_generator), + is_exported: bool((c as unknown as V2Node).is_exported), is_ambient: bool((c as unknown as V2Node).is_ambient), + is_implicit: bool((c as unknown as V2Node).is_implicit), ...span(c), _module: fileKey, }); } diff --git a/src/dataflow/index.ts b/src/dataflow/index.ts index 8993537..51ded96 100644 --- a/src/dataflow/index.ts +++ b/src/dataflow/index.ts @@ -37,9 +37,8 @@ import { type ProgramGraphs, type TSCallable, type TSCallsite, - type TSClass, type TSModule, - type TSNamespace, + forEachCallable, } from "../schema"; import type { Logger } from "../utils"; import { extractCallableData, indexCallableDecls } from "./extract"; @@ -76,11 +75,11 @@ export function startExtraction( const callables = collectCallables(symbol_table); // Partition callables by owning file (round-robin over the sorted file list) so each worker - // deeply visits only its share of the program. TSCallable.path is the declaration's ABSOLUTE + // deeply visits only its share of the program. TSCallable.abs_path is the declaration's ABSOLUTE // file path; the graph data carries the project-relative file key. const byFile = new Map>(); for (const [sig, c] of [...callables.entries()].sort(([a], [b]) => a.localeCompare(b))) { - const absPath = c.path; + const absPath = c.abs_path; const arr = byFile.get(absPath) ?? []; arr.push({ signature: sig, path: fileKeyOf(absPath, opts.input).fileKey, absPath }); byFile.set(absPath, arr); @@ -163,7 +162,7 @@ function extractSequential( for (const [sig, c] of [...callables.entries()].sort(([a], [b]) => a.localeCompare(b))) { const fn = astIndex.get(sig); if (!fn) continue; // bodiless (interface/abstract/ambient/implicit) or unmatchable - const data = extractCallableData(sig, fn, fileKeyOf(c.path, opts.input).fileKey, opts.input, opts.graphFieldDepth); + const data = extractCallableData(sig, fn, fileKeyOf(c.abs_path, opts.input).fileKey, opts.input, opts.graphFieldDepth); if (data) out.set(sig, data); } return out; @@ -195,7 +194,7 @@ export async function buildProgramGraphs( for (const site of (callables.get(sig) as TSCallable).call_sites) { const nodeId = containingNode(data, site); if (nodeId === null) continue; - refs.push({ nodeId, callee: site.callee_signature, argCount: site.argument_types.length }); + refs.push({ nodeId, callee: site.callee_signature ?? null, argCount: site.argument_types.length }); } refs.sort((a, b) => a.nodeId - b.nodeId || (a.callee ?? "").localeCompare(b.callee ?? "")); callSites.set(sig, refs); @@ -389,8 +388,8 @@ function persistSummaries( const entries: Record = {}; for (const sig of [...summaries.keys()].sort()) { const c = callables.get(sig); - // TSCallable.path is absolute; the symbol table is keyed by the project-relative file key. - const fileKey = c ? fileKeyOf(c.path, opts.input).fileKey : null; + // TSCallable.abs_path is absolute; the symbol table is keyed by the project-relative file key. + const fileKey = c ? fileKeyOf(c.abs_path, opts.input).fileKey : null; entries[sig] = { ...summaries.get(sig), content_hash: (fileKey && symbol_table[fileKey]?.content_hash) ?? null, @@ -404,34 +403,11 @@ function persistSummaries( } // ------------------------------------------------------------------------------------------------ -// Symbol-table collection (signature → callable), recursing through every container kind +// Symbol-table collection (signature → callable) — the shared containment walk (schema.ts) // ------------------------------------------------------------------------------------------------ function collectCallables(symbol_table: Record): Map { const out = new Map(); - for (const mod of Object.values(symbol_table)) collectModule(mod, out); + for (const mod of Object.values(symbol_table)) forEachCallable(mod, (c) => out.set(c.signature, c)); return out; } - -function collectModule(mod: TSModule, out: Map): void { - for (const f of Object.values(mod.functions)) collectCallable(f, out); - for (const c of Object.values(mod.classes)) collectClass(c, out); - for (const ns of Object.values(mod.namespaces)) collectNamespace(ns, out); -} - -function collectNamespace(ns: TSNamespace, out: Map): void { - for (const f of Object.values(ns.functions)) collectCallable(f, out); - for (const c of Object.values(ns.classes)) collectClass(c, out); - for (const n of Object.values(ns.namespaces)) collectNamespace(n, out); -} - -function collectClass(c: TSClass, out: Map): void { - for (const m of Object.values(c.methods)) collectCallable(m, out); - for (const ic of Object.values(c.inner_classes)) collectClass(ic, out); -} - -function collectCallable(c: TSCallable, out: Map): void { - out.set(c.signature, c); - for (const ic of Object.values(c.inner_callables)) collectCallable(ic, out); - for (const cl of Object.values(c.inner_classes)) collectClass(cl, out); -} diff --git a/src/schema/assignIds.ts b/src/schema/assignIds.ts new file mode 100644 index 0000000..a40a463 --- /dev/null +++ b/src/schema/assignIds.ts @@ -0,0 +1,63 @@ +/** + * Walk the symbol-table tree and stamp every node with its `can://` id — python's + * `assign_ids.py`. Runs once per analysis run (ids embed the per-invocation app name, so the + * cached tree is stored id-free and re-stamped on every run; stamping is overwrite-idempotent). + * + * Returns the `signature → id` map the later passes join on (callee backfill, call-graph + * re-identification, dataflow attach), the callable locator for the L3/L4 attach, and the + * id-uniqueness gate's collision list. + */ + +import { applicationIdOf, idFromSig, memberKey, moduleIdOf, modulePrefixOf } from "./ids"; +import type { TSApplication, TSCallable, TSField, TSType } from "./schema"; + +export interface AssignedIds { + appId: string; + idBySig: Map; // signature → can:// id (types + callables) + callableBySig: Map; // locates each callable's node for the L3/L4 attach + collisions: string[]; // signatures that mapped to two distinct ids (L1 id-uniqueness gate) +} + +export function assignIds(app: TSApplication, appName: string): AssignedIds { + const appId = applicationIdOf(appName); + const idBySig = new Map(); + const callableBySig = new Map(); + const collisions: string[] = []; + + const register = (sig: string, id: string): void => { + if (idBySig.has(sig) && idBySig.get(sig) !== id) collisions.push(sig); + idBySig.set(sig, id); + }; + + const doFields = (parentId: string, fields: Record | undefined): void => { + for (const [name, f] of Object.entries(fields ?? {})) f.id = `${parentId}/${name}`; + }; + + const doCallable = (moduleId: string, modulePrefix: string, c: TSCallable): void => { + c.id = idFromSig(moduleId, modulePrefix, c.signature); + register(c.signature, c.id); + callableBySig.set(c.signature, c); + for (const nested of Object.values(c.callables ?? {})) doCallable(moduleId, modulePrefix, nested); + for (const t of Object.values(c.types ?? {})) doType(moduleId, modulePrefix, t); + }; + + const doType = (moduleId: string, modulePrefix: string, t: TSType): void => { + t.id = idFromSig(moduleId, modulePrefix, t.signature); + register(t.signature, t.id); + doFields(t.id, t.fields); + for (const m of Object.values(t.callables ?? {})) doCallable(moduleId, modulePrefix, m); + for (const f of Object.values(t.functions ?? {})) doCallable(moduleId, modulePrefix, f); // namespace + for (const nt of Object.values(t.types ?? {})) doType(moduleId, modulePrefix, nt); // namespace + }; + + for (const [fileKey, mod] of Object.entries(app.symbol_table)) { + const moduleId = moduleIdOf(appId, fileKey); + const modulePrefix = modulePrefixOf(fileKey); + mod.id = moduleId; + doFields(moduleId, mod.fields); + for (const fn of Object.values(mod.functions ?? {})) doCallable(moduleId, modulePrefix, fn); + for (const t of Object.values(mod.types ?? {})) doType(moduleId, modulePrefix, t); + } + + return { appId, idBySig, callableBySig, collisions }; +} diff --git a/src/schema/heritage.ts b/src/schema/heritage.ts new file mode 100644 index 0000000..fc42b83 --- /dev/null +++ b/src/schema/heritage.ts @@ -0,0 +1,37 @@ +/** + * Heritage projection pass (TS-specific): resolve each type's heritage SIGNATURES + * (`base_classes`/`implements_types`, which stay on the wire as the human-readable spine) into + * `can://` ids for the Neo4j EXTENDS/IMPLEMENTS overlay. Resolved-only: an external/library + * supertype that never maps to a first-party id is dropped, never nulled. Runs at every level + * (types are homed by the unconditional L1 walk) and is overwrite-idempotent (stale ids from a + * previous run under another app name are recomputed; unresolvable sets are deleted). + */ + +import type { TSApplication, TSModule, TSType } from "./schema"; +import { forEachType } from "./schema"; + +function resolve(sigs: string[], idBySig: Map): string[] { + return sigs.map((s) => idBySig.get(s)).filter((x): x is string => x !== undefined); +} + +function doType(t: TSType, idBySig: Map): void { + delete t.extends_ids; + delete t.implements_ids; + const base = t.base_classes ?? []; + if (!base.length) return; + const impl = t.implements_types ?? []; + // A class's `base_classes` is the union of extends + implements; subtract `implements_types` + // to recover just the extended base class (0 or 1 — TS classes extend at most one class). + // Interfaces carry no `implements_types`, so their whole heritage is extends. + const extendsSigs = t.kind === "class" ? base.filter((s) => !impl.includes(s)) : base; + const extendsIds = resolve(extendsSigs, idBySig); + const implementsIds = resolve(impl, idBySig); + if (extendsIds.length) t.extends_ids = extendsIds; + if (implementsIds.length) t.implements_ids = implementsIds; +} + +export function resolveHeritageIds(app: TSApplication, idBySig: Map): void { + for (const mod of Object.values(app.symbol_table) as TSModule[]) { + forEachType(mod, (t) => doType(t, idBySig)); + } +} diff --git a/src/schema/homing.ts b/src/schema/homing.ts new file mode 100644 index 0000000..4ca88c1 --- /dev/null +++ b/src/schema/homing.ts @@ -0,0 +1,87 @@ +/** + * L2 endpoint homing (TS-specific): give every off-tree call-graph endpoint an id home on the + * application root, so the no-dangling rule holds. + * + * - `homeExternals`: external library call targets → `can://…/@external//` nodes. + * - `homeSynthesized`: the 2.1.0 anonymous-callable compatibility index (pre-2.1.0 id → the + * tree id that replaced it), plus residual fallback nodes for signatures no provider could + * name (recognizable because the map key equals the entry's own id). + * + * Both register their ids into `idBySig`, which is why they run BEFORE the callee backfill and + * the call-graph re-identification (l2Callees.ts). + */ + +import type { TSApplication, TSSpan } from "./schema"; + +/** A call target outside the project (an imported library member / builtin) — an edge endpoint, not a tree node. */ +export interface TSExternalNode { + id: string; + kind: "external"; + module: string; // the import/require specifier, e.g. "node:fs", "express" + name: string; // the called member, e.g. "readFileSync" +} + +/** A synthesized-callable index entry: a pointer node (id + kind) or a residual fallback node. */ +export interface TSSynthesizedNode { + id: string; + kind: string; + name?: string; + path?: string; + span?: TSSpan; +} + +/** External library call targets → `can://…/@external//` ids on the application root. */ +export function homeExternals(app: TSApplication, appId: string, idBySig: Map): Record { + const out: Record = {}; + for (const [sig, ext] of Object.entries(app.external_symbols ?? {})) { + const id = `${appId}/@external/${ext.module}/${ext.name}`; + idBySig.set(sig, id); + out[id] = { id, kind: "external", module: ext.module, name: ext.name }; + } + return out; +} + +/** + * The compatibility index for anonymous callables (schema 2.1.0). + * + * Anonymous callables are real nodes in the containment tree, signed positionally + * (`.`) and reachable by containment. This map is not a node + * registry: it maps the **pre-2.1.0 id** of each anonymous callable — `@:`, + * derived from the old `:` signature — onto the tree id that replaced it, + * so a consumer holding an old id can still resolve it. + * + * The old host was the nearest enclosing callable the old rules could name, which is recovered by + * stripping the trailing `` chain. An anonymous callable directly under a module had no + * resolvable old id (the old emitter fell back to an opaque `@synthetic/` key that encoded the + * ambiguous `:` signature, which was not unique across files) — those are + * skipped rather than reproduced. + * + * Any signature the call-graph provider still could not name is homed here too, unchanged, so the + * no-dangling rule holds even if a provider reports a function-like node the tree missed. + */ +export function homeSynthesized(app: TSApplication, appId: string, idBySig: Map): Record { + const out: Record = {}; + for (const [sig, id] of [...idBySig.entries()]) { + const m = /^(.*?)((?:\.)+)$/.exec(sig); + if (!m) continue; + const host = idBySig.get(m[1] as string); + if (!host) continue; // module-level anonymous callable — no resolvable pre-2.1.0 id + const last = /$/.exec(sig) as RegExpExecArray; + out[`${host}@${last[1]}:${last[2]}`] = { id, kind: "callable" }; + } + for (const [sig, sc] of Object.entries(app.synthesized_callables ?? {})) { + if (idBySig.has(sig)) continue; // the tree names it now + const m = /^(.*):?$/.exec(sig); + const enclosing = m ? idBySig.get(m[1] as string) : undefined; + const id = m && enclosing ? `${enclosing}@${m[2]}:${m[3]}` : `${appId}/@synthetic/${encodeURIComponent(sig)}`; + idBySig.set(sig, id); + out[id] = { + id, + kind: "callable", + name: sc.name, + path: sc.path, + span: { start: [sc.start_line, sc.start_column], end: [sc.start_line, sc.start_column], bytes: [0, 0] }, + }; + } + return out; +} diff --git a/src/schema/ids.ts b/src/schema/ids.ts new file mode 100644 index 0000000..860f0b5 --- /dev/null +++ b/src/schema/ids.ts @@ -0,0 +1,38 @@ +/** + * Canonical `can://` id construction for schema v2 (durable ids, ≥ callable depth) and the + * member-key rule for the tree's named maps. Pure functions, no runtime imports — mirrors + * python's `codeanalyzer/schema/ids.py`. + * + * Ids embed the app name (`--app-name`, per-invocation), while the symbol table round-trips the + * analysis cache across runs — so ids are NEVER baked at build time; `assignIds` stamps every + * node fresh each run (see assignIds.ts). + */ + +const LANGUAGE = "typescript"; + +export function applicationIdOf(appName: string): string { + return `can://${LANGUAGE}/${appName}`; +} + +export function moduleIdOf(appId: string, fileKey: string): string { + return `${appId}/${fileKey}`; +} + +/** The module/signature prefix: the file key without its TS/JS extension. */ +export function modulePrefixOf(fileKey: string): string { + return fileKey.replace(/\.d\.ts$/, "").replace(/\.(tsx|ts|jsx|js|mts|cts|mjs|cjs)$/, ""); +} + +/** The containment-path id of a descendant, derived from its dotted signature. */ +export function idFromSig(moduleId: string, modulePrefix: string, sig: string): string { + const tail = sig.startsWith(`${modulePrefix}.`) ? sig.slice(modulePrefix.length + 1) : sig; + return `${moduleId}/${tail.split(".").join("/")}`; +} + +/** The map key for a callable/type within its parent: the last signature segment (+ accessor tag). */ +export function memberKey(sig: string, accessorKind?: string | null): string { + const seg = sig.split(".").pop() ?? sig; + if (accessorKind === "getter") return `${seg}#get`; + if (accessorKind === "setter") return `${seg}#set`; + return seg; +} diff --git a/src/schema/l1Body.ts b/src/schema/l1Body.ts new file mode 100644 index 0000000..d46d453 --- /dev/null +++ b/src/schema/l1Body.ts @@ -0,0 +1,65 @@ +/** + * L1 body population — python's `l1_body.py`: materialize each callable's `body{}` `call` nodes + * from the INTERNAL `call_sites`, `callee: null` (the sanctioned null→id refinement happens at + * L2, l2Callees.ts). + * + * Rebuilds `body{}` WHOLESALE every run and deletes the derived edge lists — body, cfg/cdg/ddg/ + * summary, and callee resolution are per-run projections (they embed per-run ids and per-level + * depth), while `call_sites` are the cached source of truth. That wholesale rebuild is what makes + * the whole pass chain idempotent across repeated emissions at different levels. + */ + +import type { TSApplication, TSBodyNode, TSCallable, TSCallsite, TSModule } from "./schema"; +import { forEachCallable } from "./schema"; + +/** + * The body key of each call site, in recording order: `line:col`, disambiguated `/2`, `/3`, … + * when chained calls share a start position. The SINGLE definition of the key sequence — l1Body + * builds with it and l2Callees re-derives the same pairing from it. + */ +export function* callBodyKeys(sites: TSCallsite[]): Generator<[string, TSCallsite]> { + const used = new Set(); + for (const cs of sites) { + const base = `${cs.start_line}:${cs.start_column}`; + let key = base; + for (let k = 2; used.has(key); k++) key = `${base}/${k}`; + used.add(key); + yield [key, cs]; + } +} + +function callNodeOf(cs: TSCallsite): TSBodyNode { + return { + kind: "call", + span: { + start: [cs.start_line, cs.start_column], + end: [cs.end_line, cs.end_column], + bytes: cs.bytes ?? [0, 0], + }, + callee: null, + method_name: cs.method_name, + ...(cs.receiver_expr != null ? { receiver_expr: cs.receiver_expr } : {}), + ...(cs.receiver_type != null ? { receiver_type: cs.receiver_type } : {}), + argument_types: cs.argument_types, + type_arguments: cs.type_arguments, + ...(cs.return_type != null ? { return_type: cs.return_type } : {}), + is_constructor_call: cs.is_constructor_call, + is_optional_chain: cs.is_optional_chain, + }; +} + +function resetCallable(c: TSCallable): void { + const body: Record = {}; + for (const [key, cs] of callBodyKeys(c.call_sites)) body[key] = callNodeOf(cs); + c.body = body; + delete c.cfg; + delete c.cdg; + delete c.ddg; + delete c.summary; +} + +export function populateL1Body(app: TSApplication): void { + for (const mod of Object.values(app.symbol_table) as TSModule[]) { + forEachCallable(mod, resetCallable); + } +} diff --git a/src/schema/l2Callees.ts b/src/schema/l2Callees.ts new file mode 100644 index 0000000..d92a431 --- /dev/null +++ b/src/schema/l2Callees.ts @@ -0,0 +1,51 @@ +/** + * L2 refinement passes — python's `l2_callees.py` + `call_graph_ids.py`: + * + * - `backfillCallees`: fill each L1 `call` body node's `callee` (null → id) from the call + * site's resolver-backfilled `callee_signature`. A declared target becomes its can:// id via + * `idBySig` (which, run after the homing pass, also names external and synthesized targets); + * an unresolved call site keeps the sanctioned `callee: null`. + * - `reidentifyCallGraph`: rewrite the provider edge list onto can:// endpoints in the wire + * shape ({src, dst, prov, weight}); endpoints with no id home are collected as `dangling` + * (the L2 no-dangling gate; should be empty) and their edges dropped. + */ + +import type { TSApplication, TSCallEdge, TSModule } from "./schema"; +import { forEachCallable } from "./schema"; +import { callBodyKeys } from "./l1Body"; + +export function backfillCallees(app: TSApplication, idBySig: Map): void { + for (const mod of Object.values(app.symbol_table) as TSModule[]) { + forEachCallable(mod, (c) => { + for (const [key, cs] of callBodyKeys(c.call_sites)) { + if (!cs.callee_signature) continue; + const node = c.body[key]; + if (!node || node.kind !== "call") continue; + node.callee = idBySig.get(cs.callee_signature) ?? null; + } + }); + } +} + +export interface WireCallEdge { + src: string; + dst: string; + prov: string[]; + weight: number; +} + +export function reidentifyCallGraph( + edges: TSCallEdge[], + idBySig: Map, + dangling: string[], +): WireCallEdge[] { + const out: WireCallEdge[] = []; + for (const e of edges) { + const src = idBySig.get(e.source); + const dst = idBySig.get(e.target); + if (!src) dangling.push(e.source); + if (!dst) dangling.push(e.target); + if (src && dst) out.push({ src, dst, prov: e.provenance, weight: e.weight }); + } + return out; +} diff --git a/src/schema/schema.ts b/src/schema/schema.ts index df95f0f..c11bfc7 100644 --- a/src/schema/schema.ts +++ b/src/schema/schema.ts @@ -1,23 +1,33 @@ /** - * The canonical CLDK analysis schema for TypeScript. + * The canonical CLDK analysis schema for TypeScript — the NATIVE model. The stages build this + * shape directly (schema v2, canonical-schema.md): one additive containment tree of nodes + * (`id` / `kind` / `span` / named child maps) that `analysis.json` and the Neo4j projection both + * emit. There is no second model and no emit-time reshape: what the builders construct is what + * the wire carries, minus the INTERNAL fields listed below (stripped at serialization). * - * Mirrors the identity-only Python schema (codeanalyzer-python/.../py_schema.py) field for - * field on the invariant spine — `TSApplication { symbol_table, call_graph, external_symbols }`, - * `Module → Class/Callable` nesting, identity-only `TSCallEdge` whose `source`/`target` are - * bare signature strings — and extends it at the leaves with TypeScript-native node kinds - * (interface / type-alias / enum / namespace) and typed fields (generics, modifiers, ...). - * See SCHEMA_DECISIONS.md. + * Mirrors python's `codeanalyzer/schema/py_schema.py` field-for-field on the invariant spine — + * `symbol_table{module → types{}/functions{}/fields{}}`, `type → callables{}/fields{}`, + * `callable → body{}` — and extends it at the leaves with TypeScript-native node kinds + * (interface / type_alias / enum / namespace) and typed fields (generics, modifiers, ...). + * + * Conventions: + * - A fact is PRESENT or ABSENT; never `null`. Optional fields are omitted, not nulled. The one + * sanctioned null is a `call` body node's `callee` at L1 (refined null→id at L2). + * - `id` fields are stamped per-run by `assignIds` (ids embed `--app-name`; the cached tree must + * stay app-name-free). Builders initialize them to "". + * - INTERNAL fields (never on the wire; serialize.ts strips them by key): `call_sites`, + * `abs_path`, `content_hash`, `last_modified`, `file_size`. They exist for the call-graph + * resolver, the dataflow join, and the analysis cache. * * All field names are snake_case so `JSON.stringify` emits keys the SDK Pydantic models parse. - * The matching Pydantic models live in python-sdk/cldk/models/typescript/models.py and MUST be - * co-evolved with this file. */ +import { modulePrefixOf } from "./ids"; + // ---------------------------------------------------------------------------------------------- -// Span (schema-v2) — the one universal attribute. `bytes` are char offsets into the owning -// module's `source` blob, so `source.slice(bytes[0], bytes[1])` reproduces the node's text -// (what the per-node `code` field used to hold). `start`/`end` are [line, column], 1-based, for -// display and addressing. Captured on every container node during the AST walk (builders.ts). +// Span — the one universal attribute. `bytes` are char offsets into the owning module's `source` +// blob, so `source.slice(bytes[0], bytes[1])` reproduces the node's text. `start`/`end` are +// [line, column], 1-based. // ---------------------------------------------------------------------------------------------- export interface TSSpan { @@ -27,13 +37,13 @@ export interface TSSpan { } // ---------------------------------------------------------------------------------------------- -// Leaf models +// Leaf models (wire shapes — flat line/col ints are part of the wire here) // ---------------------------------------------------------------------------------------------- export interface TSImport { module: string; // the module specifier, e.g. "./user" or "@nestjs/common" name: string; // the imported binding (or "" for side-effect imports / "*" for namespace) - alias: string | null; + alias?: string; is_type_only: boolean; // `import type { X } ...` import_kind: "named" | "default" | "namespace" | "side_effect"; start_line: number; @@ -43,9 +53,9 @@ export interface TSImport { } export interface TSExport { - module: string | null; // re-export source, e.g. "./user"; null for `export { x }` + module?: string; // re-export source, e.g. "./user"; absent for `export { x }` name: string; // exported name ("*" for `export * from`) - alias: string | null; + alias?: string; is_type_only: boolean; export_kind: "named" | "default" | "namespace" | "re_export"; start_line: number; @@ -63,25 +73,9 @@ export interface TSComment { end_column: number; } -export interface TSVariableDeclaration { - span?: TSSpan; // schema-v2 precise span - name: string; - type: string | null; - initializer: string | null; - value: unknown | null; - scope: "module" | "namespace" | "class" | "function" | "block"; - declaration_kind: "const" | "let" | "var" | "using" | "unknown"; - is_readonly: boolean; - is_exported: boolean; - start_line: number; - end_line: number; - start_column: number; - end_column: number; -} - export interface TSDecorator { name: string; // locally written name, e.g. "Get" - qualified_name: string | null; // checker-resolved FQN when available + qualified_name?: string; // checker-resolved FQN when available positional_arguments: string[]; // raw source fragments keyword_arguments: Record; // object-literal args flattened to key→source start_line: number; @@ -92,18 +86,18 @@ export interface TSDecorator { export interface TSTypeParameter { name: string; - constraint: string | null; // the `extends ...` clause text - default: string | null; // the `= ...` clause text + constraint?: string; // the `extends ...` clause text + default?: string; // the `= ...` clause text } export interface TSCallableParameter { name: string; - type: string | null; - default_value: string | null; + type?: string; + default_value?: string; is_optional: boolean; is_rest: boolean; is_readonly: boolean; // parameter property `constructor(readonly x: T)` - accessibility: string | null; // parameter property visibility (NestJS DI / TS shorthand) + accessibility?: string; // parameter property visibility (NestJS DI / TS shorthand) decorators: TSDecorator[]; // param decorators (e.g. @Param('id')) start_line: number; end_line: number; @@ -111,25 +105,114 @@ export interface TSCallableParameter { end_column: number; } +export interface TSOverloadSignature { + parameters: TSCallableParameter[]; + return_type?: string; + type_parameters: TSTypeParameter[]; + start_line: number; + end_line: number; +} + +/** + * INTERNAL — a recorded call site. Never on the wire (the wire's view is the `call` node in the + * owning callable's `body{}`, built per-run by the l1Body pass). Kept on the callable because the + * call-graph resolver joins on it (span-matched to the AST) and the cache round-trips it. + * `callee_signature` is backfilled in place by the tsc resolver. + */ export interface TSCallsite { method_name: string; - receiver_expr: string | null; - receiver_type: string | null; + receiver_expr?: string; + receiver_type?: string; argument_types: string[]; type_arguments: string[]; // explicit call type args, foo() - return_type: string | null; - callee_signature: string | null; // null when recorded; backfilled by the resolver call graph + return_type?: string; + callee_signature?: string; // absent when recorded; backfilled by the resolver call graph is_constructor_call: boolean; // `new X()` is_optional_chain: boolean; // `a?.b()` start_line: number; start_column: number; end_line: number; end_column: number; - bytes?: [number, number]; // schema-v2: char offsets [start, end] into module.source + bytes: [number, number]; // char offsets [start, end] into module.source +} + +// ---------------------------------------------------------------------------------------------- +// Body nodes — a callable's `body{}` map, keyed by local id (`line:col`, or `@tag` synthetic). +// L1: `call` nodes; L3 adds statements + @entry/@exit; L4 adds formal/actual param vertices. +// ---------------------------------------------------------------------------------------------- + +export interface TSBodyNode { + kind: string; // "call" | "statement" | "entry" | "exit" | "formal_in" | "actual_in" | … + span?: TSSpan; + callee?: string | null; // `call` nodes: null at L1, refined to an id at L2 (the one sanctioned null) + of?: string; // synthetic param vertices: the flowed name ("arg0", "$ret", a global path) + parent?: string; // actual_in/actual_out: the anchoring call-site statement's local id + // call-node attributes (copied from the recorded call site by the l1Body pass) + method_name?: string; + receiver_expr?: string; + receiver_type?: string; + argument_types?: string[]; + type_arguments?: string[]; + return_type?: string; + is_constructor_call?: boolean; + is_optional_chain?: boolean; +} + +// ---------------------------------------------------------------------------------------------- +// Intra-callable edge lists (L3/L4), bare local-id endpoints +// ---------------------------------------------------------------------------------------------- + +export interface TSCfgEdge { + src: string; + dst: string; + kind: string; +} +export interface TSCdgEdge { + src: string; + dst: string; +} +export interface TSDdgEdge { + src: string; + dst: string; + var?: string; + prov: string[]; // "reaching-defs" (L3 syntactic; sanctioned additive token) / "points-to" (L4) +} +export interface TSSummaryEdge { + src: string; + dst: string; + var?: string; +} + +// ---------------------------------------------------------------------------------------------- +// Field — module-level binding, class attribute / interface property, or enum member. +// One open-ish shape: each origin sets its own subset (matching what the origin declares). +// ---------------------------------------------------------------------------------------------- + +export interface TSField { + id: string; // `${parentId}/${name}` — stamped per-run by assignIds + kind: "field"; + span?: TSSpan; // absent for constructor parameter properties + name: string; + type?: string; + // module/namespace variable + initializer?: string; + scope?: "module" | "namespace"; + declaration_kind?: "const" | "let" | "var" | "using" | "unknown"; + is_exported?: boolean; + // class attribute / interface property + comments?: TSComment[]; + decorators?: TSDecorator[]; + accessibility?: string; + is_static?: boolean; + is_readonly?: boolean; + is_optional?: boolean; + is_abstract?: boolean; + // enum member + value?: string; // initializer text or computed const value } // ---------------------------------------------------------------------------------------------- -// Callable (function / method / constructor / accessor / arrow) +// Callable (function / method / constructor / accessor / arrow / function expression) // ---------------------------------------------------------------------------------------------- export type TSCallableKind = @@ -141,36 +224,19 @@ export type TSCallableKind = | "arrow" | "function_expression"; -export interface TSOverloadSignature { - parameters: TSCallableParameter[]; - return_type: string | null; - type_parameters: TSTypeParameter[]; - start_line: number; - end_line: number; -} - export interface TSCallable { - span?: TSSpan; // schema-v2 precise span (line/col + char offsets into module.source) + id: string; // can:// containment id — stamped per-run by assignIds + kind: TSCallableKind; + span: TSSpan; name: string; - path: string; // file path of the declaration - signature: string; // e.g. src/user.UserService.getUser — the edge id + signature: string; // e.g. src/user.UserService.getUser — the internal join key comments: TSComment[]; decorators: TSDecorator[]; parameters: TSCallableParameter[]; type_parameters: TSTypeParameter[]; - return_type: string | null; - code: string | null; - start_line: number; - end_line: number; - code_start_line: number; - call_sites: TSCallsite[]; - inner_callables: Record; - inner_classes: Record; - local_variables: TSVariableDeclaration[]; + return_type?: string; cyclomatic_complexity: number; - // --- TypeScript-native typed fields --- - kind: TSCallableKind; - accessibility: string | null; // public | private | protected | null + accessibility?: string; // public | private | protected is_static: boolean; is_abstract: boolean; is_async: boolean; @@ -180,172 +246,87 @@ export interface TSCallable { is_exported: boolean; is_ambient: boolean; // `declare` is_implicit: boolean; // synthesized default constructor - accessor_kind: string | null; // getter | setter | null + accessor_kind?: string; // getter | setter overload_signatures: TSOverloadSignature[]; + body: Record; // L1: `call` nodes (l1Body pass); L3+: full statements + callables?: Record; // nested callables (closures) — present only when non-empty + types?: Record; // nested (local) classes — present only when non-empty + cfg?: TSCfgEdge[]; // L3 + cdg?: TSCdgEdge[]; // L3 + ddg?: TSDdgEdge[]; // L3→L4 + summary?: TSSummaryEdge[]; // L4 + // INTERNAL (stripped from the wire) + abs_path: string; // ABSOLUTE file path of the declaration — the resolver's AST-index key + call_sites: TSCallsite[]; } // ---------------------------------------------------------------------------------------------- -// Class attribute -// ---------------------------------------------------------------------------------------------- - -export interface TSClassAttribute { - span?: TSSpan; // schema-v2 precise span - name: string; - type: string | null; - comments: TSComment[]; - decorators: TSDecorator[]; - initializer: string | null; - accessibility: string | null; - is_static: boolean; - is_readonly: boolean; - is_optional: boolean; - is_abstract: boolean; - start_line: number; - end_line: number; -} - -// ---------------------------------------------------------------------------------------------- -// Class -// ---------------------------------------------------------------------------------------------- - -export interface TSClass { - span?: TSSpan; // schema-v2 precise span - name: string; - signature: string; // e.g. src/user.UserService - comments: TSComment[]; - code: string | null; - decorators: TSDecorator[]; - base_classes: string[]; // spine: union of extends + implements (signature strings) - implements_types: string[]; // typed split: just the implemented interfaces - type_parameters: TSTypeParameter[]; - methods: Record; - attributes: Record; - inner_classes: Record; - is_abstract: boolean; - is_exported: boolean; - is_ambient: boolean; - start_line: number; - end_line: number; -} - -// ---------------------------------------------------------------------------------------------- -// Interface (TS node kind) -// ---------------------------------------------------------------------------------------------- - -export interface TSInterface { - span?: TSSpan; // schema-v2 precise span - name: string; - signature: string; - comments: TSComment[]; - code: string | null; - base_classes: string[]; // extended interfaces (signature strings) - type_parameters: TSTypeParameter[]; - methods: Record; // bodiless - properties: Record; - call_signatures: string[]; // raw text of call/construct signatures - index_signatures: string[]; // raw text of `[key: string]: T` - is_exported: boolean; - is_ambient: boolean; - start_line: number; - end_line: number; -} - -// ---------------------------------------------------------------------------------------------- -// Enum (TS node kind) -// ---------------------------------------------------------------------------------------------- - -export interface TSEnumMember { - span?: TSSpan; // schema-v2 precise span - name: string; - value: string | null; // initializer text or computed const value - start_line: number; - end_line: number; -} - -export interface TSEnum { - span?: TSSpan; // schema-v2 precise span - name: string; - signature: string; - comments: TSComment[]; - code: string | null; - members: TSEnumMember[]; - is_const: boolean; - is_exported: boolean; - is_ambient: boolean; - start_line: number; - end_line: number; -} - -// ---------------------------------------------------------------------------------------------- -// Type alias (TS node kind) +// Type — one node with a single `kind`; the buckets it populates depend on that kind: +// class / interface → callables{} + fields{}; enum → fields{}; type_alias → (leaf); +// namespace → types{} + functions{} + fields{} (a sub-file scope, same buckets as a module). // ---------------------------------------------------------------------------------------------- -export interface TSTypeAlias { - span?: TSSpan; // schema-v2 precise span - name: string; - signature: string; - comments: TSComment[]; - code: string | null; - aliased_type: string; // the RHS type text - type_parameters: TSTypeParameter[]; - is_exported: boolean; - is_ambient: boolean; - start_line: number; - end_line: number; -} - -// ---------------------------------------------------------------------------------------------- -// Namespace (TS node kind) — recursive container, same shape as Module's declaration buckets -// ---------------------------------------------------------------------------------------------- +export type TSTypeKind = "class" | "interface" | "enum" | "type_alias" | "namespace"; -export interface TSNamespace { - span?: TSSpan; // schema-v2 precise span +export interface TSType { + id: string; // stamped per-run by assignIds + kind: TSTypeKind; + span: TSSpan; name: string; signature: string; comments: TSComment[]; - classes: Record; - interfaces: Record; - enums: Record; - type_aliases: Record; - functions: Record; - variables: TSVariableDeclaration[]; - namespaces: Record; is_exported: boolean; is_ambient: boolean; - start_line: number; - end_line: number; + // class / interface / enum / namespace members + callables?: Record; + fields?: Record; + types?: Record; // namespace only + functions?: Record; // namespace only + // class + decorators?: TSDecorator[]; + base_classes?: string[]; // spine: union of extends + implements (signature strings) + implements_types?: string[]; // typed split: just the implemented interfaces + is_abstract?: boolean; + // class / interface / type_alias generics + type_parameters?: TSTypeParameter[]; + // interface + call_signatures?: string[]; // raw text of call/construct signatures + index_signatures?: string[]; // raw text of `[key: string]: T` + // enum + is_const?: boolean; + // type_alias + aliased_type?: string; // the RHS type text + // Heritage projection (resolved-only), stamped per-run by the heritage pass: + extends_ids?: string[]; // resolved can:// id(s) of the extended class/interface(s) + implements_ids?: string[]; // resolved can:// id(s) of implemented interfaces (classes only) } // ---------------------------------------------------------------------------------------------- -// Module (compilation unit / file) +// Module (compilation unit / file) — a scope holding types, functions, and free bindings // ---------------------------------------------------------------------------------------------- export interface TSModule { - span?: TSSpan; // schema-v2 precise span (whole file) - source?: string | null; // schema-v2: full file text; every node's text slices off this - file_path: string; - module_name: string; // the file key minus extension (== signature prefix) + id: string; // can://// — stamped per-run by assignIds + kind: "module"; + span: TSSpan; // whole file + source: string; // full file text, once; every node's text slices off this imports: TSImport[]; exports: TSExport[]; comments: TSComment[]; - classes: Record; - interfaces: Record; - enums: Record; - type_aliases: Record; - functions: Record; - namespaces: Record; - variables: TSVariableDeclaration[]; - // TS file flags + types: Record; // classes/interfaces/enums/type-aliases/namespaces + functions: Record; // free functions + fields: Record; // module-level const/let/var is_tsx: boolean; is_declaration_file: boolean; - // caching metadata - content_hash: string | null; - last_modified: number | null; - file_size: number | null; + // INTERNAL — caching metadata (stripped from the wire) + content_hash?: string; + last_modified?: number; + file_size?: number; } // ---------------------------------------------------------------------------------------------- -// Call-graph edge (identity-only) +// Call-graph edge (identity-only, provider output; endpoints are signature strings until the +// call-graph-ids pass rewrites them onto can:// ids at L2) // ---------------------------------------------------------------------------------------------- export const CALL_DEP = "CALL_DEP" as const; @@ -359,10 +340,6 @@ export interface TSCallEdge { tags: Record; } -// ---------------------------------------------------------------------------------------------- -// Application (root) -// ---------------------------------------------------------------------------------------------- - // ---------------------------------------------------------------------------------------------- // External (phantom) symbol — a synthetic stub for a call target OUTSIDE the project (an imported // library / Node builtin). Lets the call graph point at external callees (WALA-style phantom @@ -397,6 +374,44 @@ export interface TSApplication { program_graphs?: import("./graphs").ProgramGraphs; } +// ---------------------------------------------------------------------------------------------- +// Tree walkers — the one place the containment reach is defined (shared by the id/body/callee +// passes, the call-graph resolver, and the dataflow join). +// ---------------------------------------------------------------------------------------------- + +/** Depth-first over every callable in a module: free functions, type members (class/interface + * accessors and methods, namespace functions), and everything nested inside callables. */ +export function forEachCallable(mod: TSModule, fn: (c: TSCallable) => void): void { + const visitCallable = (c: TSCallable): void => { + fn(c); + for (const nested of Object.values(c.callables ?? {})) visitCallable(nested); + for (const t of Object.values(c.types ?? {})) visitType(t); + }; + const visitType = (t: TSType): void => { + for (const m of Object.values(t.callables ?? {})) visitCallable(m); + for (const f of Object.values(t.functions ?? {})) visitCallable(f); // namespace + for (const nt of Object.values(t.types ?? {})) visitType(nt); // namespace + }; + for (const f of Object.values(mod.functions ?? {})) visitCallable(f); + for (const t of Object.values(mod.types ?? {})) visitType(t); +} + +/** Depth-first over every type node in a module, including types nested inside callables. */ +export function forEachType(mod: TSModule, fn: (t: TSType) => void): void { + const visitType = (t: TSType): void => { + fn(t); + for (const nt of Object.values(t.types ?? {})) visitType(nt); + for (const m of Object.values(t.callables ?? {})) visitCallable(m); + for (const f of Object.values(t.functions ?? {})) visitCallable(f); + }; + const visitCallable = (c: TSCallable): void => { + for (const nested of Object.values(c.callables ?? {})) visitCallable(nested); + for (const t of Object.values(c.types ?? {})) visitType(t); + }; + for (const t of Object.values(mod.types ?? {})) visitType(t); + for (const f of Object.values(mod.functions ?? {})) visitCallable(f); +} + // ============================================================================================== // signatureOf — THE linchpin. One canonicalizer, used caller- and callee-side, so ids byte-match. // ============================================================================================== @@ -407,8 +422,7 @@ export interface TSApplication { */ export function fileKeyOf(absPath: string, projectRoot: string): { fileKey: string; modulePrefix: string } { const rel = toPosix(relativePath(projectRoot, absPath)); - const modulePrefix = stripTsExtension(rel); - return { fileKey: rel, modulePrefix }; + return { fileKey: rel, modulePrefix: modulePrefixOf(rel) }; } /** @@ -424,16 +438,12 @@ export function constructorSignatureOf(classSignature: string): string { return `${classSignature}.constructor`; } -// --- small path helpers (kept dependency-free so schema.ts has no runtime imports) --- +// --- small path helpers (kept dependency-light so schema.ts has no runtime deps beyond ids) --- function toPosix(p: string): string { return p.replace(/\\/g, "/"); } -function stripTsExtension(relPosix: string): string { - return relPosix.replace(/\.d\.ts$/, "").replace(/\.(tsx|ts|jsx|js|mts|cts|mjs|cjs)$/, ""); -} - function relativePath(from: string, to: string): string { const a = toPosix(from).replace(/\/+$/, "").split("/"); const b = toPosix(to).split("/"); diff --git a/src/schema/v2/emit.ts b/src/schema/v2/emit.ts index 2d9c704..ffd817b 100644 --- a/src/schema/v2/emit.ts +++ b/src/schema/v2/emit.ts @@ -1,33 +1,31 @@ /** - * v1 in-memory model → schema-v2 `analysis.json`. A pure transform: it reshapes the tree, - * assigns `can://` ids, and renames edge fields — it never re-parses. The parsing/resolution - * guts (buildSymbolTable, call graph, dataflow) are untouched; only this serialization is new. + * Schema-v2 emission: run the per-run passes over the NATIVELY-built tree, assemble the envelope, + * and strip the INTERNAL fields. No reshaping happens here any more — the builders construct the + * wire shapes directly (src/syntactic_analysis/builders.ts) and the passes stamp the per-run + * layers (python-parity architecture, #96): * - * Level scope: this emits **L1** — the containment tree (modules → types/functions/fields → - * callables → `body` call nodes) with `can://` ids, precise spans, and per-module `source`. - * `call_graph`/`param_in`/`param_out` are emitted empty here and populated by later levels - * (`call_graph` at L2). The `idBySig` map built during the walk is what L2 will use to rewrite - * edges, and doubles as the L1 id-uniqueness gate. + * assignIds — can:// ids (per-run: ids embed --app-name; the cache stays id-free) + * populateL1Body — call_sites → body{} `call` nodes, callee: null + * resolveHeritage — extends_ids / implements_ids (resolved-only) + * [L2] homeExternals / homeSynthesized / backfillCallees / reidentifyCallGraph + * [L3/4] applyDataflow — program_graphs → body{} + cfg/cdg/ddg/summary + param_in/param_out + * + * The returned application is a DEEP, INTERNAL-FIELD-STRIPPED copy: the live tree keeps + * `call_sites`, `abs_path`, and the cache metadata for the resolver/dataflow/cache, while every + * consumer of the emission (JSON writer, Neo4j projection, tests) sees exactly the wire. */ import * as path from "node:path"; import type { AnalysisOptions } from "../../options"; import { ANALYZER_VERSION } from "../../utils/version"; -import type { - TSApplication, - TSCallable, - TSClass, - TSClassAttribute, - TSEnum, - TSInterface, - TSModule, - TSNamespace, - TSSpan, - TSTypeAlias, - TSVariableDeclaration, -} from "../schema"; +import type { TSApplication } from "../schema"; +import { assignIds } from "../assignIds"; +import { populateL1Body } from "../l1Body"; +import { resolveHeritageIds } from "../heritage"; +import { homeExternals, homeSynthesized } from "../homing"; +import { backfillCallees, reidentifyCallGraph } from "../l2Callees"; import { applyDataflow } from "./dataflow"; -import type { V2Application, V2BodyNode, V2CallEdge, V2Callable, V2External, V2Field, V2Module, V2Node, V2Root, V2Type } from "./model"; +import type { V2Application, V2Root } from "./model"; const LANGUAGE = "typescript"; const SCHEMA_VERSION = "2.1.0"; @@ -35,324 +33,8 @@ const ANALYZER_NAME = "codeanalyzer-typescript"; /** Highest analysis level this emitter populates today (L1 tree, L2 call graph, L3/L4 dataflow). */ const MAX_IMPLEMENTED = 4; -/** Structural / replaced / cache-metadata keys stripped before carrying language-native attrs. */ -const DROP = new Set([ - "code", - "span", - "path", - "file_path", - "module_name", - "start_line", - "end_line", - "start_column", - "end_column", - "code_start_line", - "bytes", - "methods", - "attributes", - "members", - "properties", - "classes", - "interfaces", - "enums", - "type_aliases", - "namespaces", - "functions", - "variables", - "call_sites", - "inner_callables", - "inner_classes", - "local_variables", - "content_hash", - "last_modified", - "file_size", - "callee_signature", -]); - -/** - * Recursively drop `null`/`undefined` — the canonical convention is "a fact is present or absent; - * there is no null" (the one exception, a call node's `callee: null`, is set explicitly outside - * carry()). Nested nulls (e.g. a parameter's `default_value`, an import's `alias`) go too. - */ -function pruneNulls(v: unknown): unknown { - if (Array.isArray(v)) return v.map(pruneNulls); - if (v && typeof v === "object") { - const out: Record = {}; - for (const [k, val] of Object.entries(v)) { - if (val === null || val === undefined) continue; - out[k] = pruneNulls(val); - } - return out; - } - return v; -} - -/** Copy a v1 node's language-native attributes (everything not structural/replaced), null-pruned. */ -function carry(node: Record): Record { - const out: Record = {}; - for (const [k, v] of Object.entries(node)) { - if (DROP.has(k) || v === null || v === undefined) continue; - out[k] = pruneNulls(v); - } - return out; -} - -/** The containment-path id of a descendant, derived from its dotted signature. */ -function idFromSig(moduleId: string, modulePrefix: string, sig: string): string { - const tail = sig.startsWith(`${modulePrefix}.`) ? sig.slice(modulePrefix.length + 1) : sig; - return `${moduleId}/${tail.split(".").join("/")}`; -} - -/** The map key for a callable/type within its parent: the last signature segment (+ accessor tag). */ -function memberKey(sig: string, accessorKind?: string | null): string { - const seg = sig.split(".").pop() ?? sig; - if (accessorKind === "getter") return `${seg}#get`; - if (accessorKind === "setter") return `${seg}#set`; - return seg; -} - -/** A type's heritage signatures, resolved to `can://` ids once the whole tree walk registers them. */ -interface PendingHeritage { - node: V2Type; - extendsSigs: string[]; // class: the extended base class; interface: extended interface(s) - implementsSigs: string[]; // class only: implemented interfaces -} - -/** State shared across the whole tree walk (edge-rewriting + gating). */ -interface SharedState { - idBySig: Map; - collisions: string[]; - pendingCallees: Array<{ node: V2BodyNode; calleeSig: string | null }>; // backfilled at L2 - pendingHeritage: PendingHeritage[]; // resolved sig→id once the whole tree walk completes - callableBySig: Map; // locates each callable's node for the L3/L4 dataflow pass - level: number; -} - -interface Ctx extends SharedState { - moduleId: string; - modulePrefix: string; -} - -function register(ctx: Ctx, sig: string, id: string): void { - if (ctx.idBySig.has(sig) && ctx.idBySig.get(sig) !== id) ctx.collisions.push(sig); - ctx.idBySig.set(sig, id); -} - -// ---------------------------------------------------------------------------------------------- -// body (L1: call sites → `call` nodes keyed by line:col) -// ---------------------------------------------------------------------------------------------- - -function toBody(c: TSCallable, ctx: Ctx): Record { - const body: Record = {}; - for (const cs of c.call_sites ?? []) { - const span: TSSpan = { - start: [cs.start_line, cs.start_column], - end: [cs.end_line, cs.end_column], - bytes: cs.bytes ?? [0, 0], - }; - let key = `${cs.start_line}:${cs.start_column}`; - for (let k = 2; key in body; k++) key = `${cs.start_line}:${cs.start_column}/${k}`; // chained calls share a start - const node: V2BodyNode = { ...carry(cs as unknown as Record), kind: "call", span, callee: null }; - body[key] = node; - // callee stays null at L1; backfilled to a can:// id at L2 once external/synth ids are homed. - ctx.pendingCallees.push({ node, calleeSig: cs.callee_signature ?? null }); - } - return body; -} - -// ---------------------------------------------------------------------------------------------- -// callable -// ---------------------------------------------------------------------------------------------- - -function toCallable(c: TSCallable, ctx: Ctx): V2Callable { - const id = idFromSig(ctx.moduleId, ctx.modulePrefix, c.signature); - register(ctx, c.signature, id); - const node: V2Callable = { - ...carry(c as unknown as Record), - id, - kind: c.kind, - signature: c.signature, - span: c.span, - body: toBody(c, ctx), - }; - ctx.callableBySig.set(c.signature, node); // for the L3/L4 dataflow pass - const nestedCallables = c.inner_callables ?? {}; - if (Object.keys(nestedCallables).length) { - node.callables = {}; - for (const inner of Object.values(nestedCallables)) node.callables[memberKey(inner.signature, inner.accessor_kind)] = toCallable(inner, ctx); - } - const nestedClasses = c.inner_classes ?? {}; - if (Object.keys(nestedClasses).length) { - node.types = {}; - for (const cls of Object.values(nestedClasses)) node.types[memberKey(cls.signature)] = toClass(cls, ctx); - } - return node; -} - -// ---------------------------------------------------------------------------------------------- -// fields (module vars, class attributes, interface properties, enum members) -// ---------------------------------------------------------------------------------------------- - -function fieldNode(parentId: string, name: string, span: TSSpan | undefined, src: Record): V2Field { - return { ...carry(src), id: `${parentId}/${name}`, kind: "field", span }; -} - -// ---------------------------------------------------------------------------------------------- -// type kinds -// ---------------------------------------------------------------------------------------------- - -function toClass(c: TSClass, ctx: Ctx): V2Type { - const id = idFromSig(ctx.moduleId, ctx.modulePrefix, c.signature); - register(ctx, c.signature, id); - const callables: Record = {}; - for (const m of Object.values(c.methods ?? {})) callables[memberKey(m.signature, m.accessor_kind)] = toCallable(m, ctx); - const fields: Record = {}; - for (const [name, a] of Object.entries(c.attributes ?? {})) - fields[name] = fieldNode(id, name, (a as TSClassAttribute).span, a as unknown as Record); - const node: V2Type = { ...carry(c as unknown as Record), id, kind: "class", signature: c.signature, span: c.span, callables, fields }; - // `base_classes` is the union of extends + implements (schema.ts:231); subtract implements_types - // to recover just the extended base class (0 or 1 — TS classes extend at most one class). - if (c.base_classes.length) { - const extendsSigs = c.base_classes.filter((s) => !c.implements_types.includes(s)); - ctx.pendingHeritage.push({ node, extendsSigs, implementsSigs: c.implements_types }); - } - return node; -} - -function toInterface(i: TSInterface, ctx: Ctx): V2Type { - const id = idFromSig(ctx.moduleId, ctx.modulePrefix, i.signature); - register(ctx, i.signature, id); - const callables: Record = {}; - for (const m of Object.values(i.methods ?? {})) callables[memberKey(m.signature, m.accessor_kind)] = toCallable(m, ctx); - const fields: Record = {}; - for (const [name, p] of Object.entries(i.properties ?? {})) - fields[name] = fieldNode(id, name, (p as TSClassAttribute).span, p as unknown as Record); - const node: V2Type = { ...carry(i as unknown as Record), id, kind: "interface", signature: i.signature, span: i.span, callables, fields }; - // Interface heritage is extends-only (schema.ts:255) — an interface can extend other interfaces - // (or, rarely, a class's instance type), but never "implements". - if (i.base_classes.length) ctx.pendingHeritage.push({ node, extendsSigs: i.base_classes, implementsSigs: [] }); - return node; -} - -function toEnum(e: TSEnum, ctx: Ctx): V2Type { - const id = idFromSig(ctx.moduleId, ctx.modulePrefix, e.signature); - register(ctx, e.signature, id); - const fields: Record = {}; - for (const m of e.members ?? []) fields[m.name] = fieldNode(id, m.name, m.span, m as unknown as Record); - return { ...carry(e as unknown as Record), id, kind: "enum", signature: e.signature, span: e.span, fields }; -} - -function toTypeAlias(t: TSTypeAlias, ctx: Ctx): V2Type { - const id = idFromSig(ctx.moduleId, ctx.modulePrefix, t.signature); - register(ctx, t.signature, id); - return { ...carry(t as unknown as Record), id, kind: "type_alias", signature: t.signature, span: t.span }; -} - -/** Gap A: a namespace is a nested *scope* — same buckets as a module (types/functions/fields). */ -function toNamespace(ns: TSNamespace, ctx: Ctx): V2Type { - const id = idFromSig(ctx.moduleId, ctx.modulePrefix, ns.signature); - register(ctx, ns.signature, id); - const types = collectTypes(ns, ctx); - const functions: Record = {}; - for (const fn of Object.values(ns.functions ?? {})) functions[memberKey(fn.signature, fn.accessor_kind)] = toCallable(fn, ctx); - const fields: Record = {}; - for (const v of ns.variables ?? []) fields[v.name] = fieldNode(id, v.name, v.span, v as unknown as Record); - return { ...carry(ns as unknown as Record), id, kind: "namespace", signature: ns.signature, span: ns.span, types, functions, fields }; -} - -/** Merge a scope's class/interface/enum/type-alias/namespace buckets into one `types{}` map. */ -function collectTypes(scope: { classes?: Record; interfaces?: Record; enums?: Record; type_aliases?: Record; namespaces?: Record }, ctx: Ctx): Record { - const types: Record = {}; - for (const c of Object.values(scope.classes ?? {})) types[memberKey(c.signature)] = toClass(c, ctx); - for (const i of Object.values(scope.interfaces ?? {})) types[memberKey(i.signature)] = toInterface(i, ctx); - for (const e of Object.values(scope.enums ?? {})) types[memberKey(e.signature)] = toEnum(e, ctx); - for (const t of Object.values(scope.type_aliases ?? {})) types[memberKey(t.signature)] = toTypeAlias(t, ctx); - for (const ns of Object.values(scope.namespaces ?? {})) types[memberKey(ns.signature)] = toNamespace(ns, ctx); - return types; -} - -// ---------------------------------------------------------------------------------------------- -// module -// ---------------------------------------------------------------------------------------------- - -function toModule(m: TSModule, moduleId: string, shared: SharedState): V2Module { - const ctx: Ctx = { moduleId, modulePrefix: m.module_name, ...shared }; - const types = collectTypes(m, ctx); - const functions: Record = {}; - for (const fn of Object.values(m.functions ?? {})) functions[memberKey(fn.signature, fn.accessor_kind)] = toCallable(fn, ctx); - const fields: Record = {}; - for (const v of m.variables ?? []) fields[(v as TSVariableDeclaration).name] = fieldNode(moduleId, v.name, v.span, v as unknown as Record); - return { - ...carry(m as unknown as Record), - id: moduleId, - kind: "module", - source: m.source ?? "", - span: m.span, - types, - functions, - fields, - }; -} - -// ---------------------------------------------------------------------------------------------- -// L2 — edge-endpoint id homes (external library targets + first-party anonymous callbacks) -// ---------------------------------------------------------------------------------------------- - -/** External library call targets → `can://…/@external//` ids on the application root. */ -function homeExternals(app: TSApplication, appId: string, idBySig: Map): Record { - const out: Record = {}; - for (const [sig, ext] of Object.entries(app.external_symbols ?? {})) { - const id = `${appId}/@external/${ext.module}/${ext.name}`; - idBySig.set(sig, id); - out[id] = { id, kind: "external", module: ext.module, name: ext.name }; - } - return out; -} - -/** - * The compatibility index for anonymous callables (schema 2.1.0). - * - * Anonymous callables are now real nodes in the containment tree, signed positionally - * (`.`) and reachable by containment. This map is no longer a node - * registry: it maps the **pre-2.1.0 id** of each anonymous callable — `@:`, - * derived from the old `:` signature — onto the tree id that replaced it, - * so a consumer holding an old id can still resolve it. - * - * The old host was the nearest enclosing callable the old rules could name, which is recovered by - * stripping the trailing `` chain. An anonymous callable directly under a module had no - * resolvable old id (the old emitter fell back to an opaque `@synthetic/` key that encoded the - * ambiguous `:` signature, which was not unique across files) — those are - * skipped rather than reproduced. - * - * Any signature the call-graph provider still could not name is homed here too, unchanged, so the - * no-dangling rule holds even if a provider reports a function-like node the tree missed. - */ -function homeSynthesized(app: TSApplication, appId: string, idBySig: Map): Record { - const out: Record = {}; - for (const [sig, id] of [...idBySig.entries()]) { - const m = /^(.*?)((?:\.)+)$/.exec(sig); - if (!m) continue; - const host = idBySig.get(m[1] as string); - if (!host) continue; // module-level anonymous callable — no resolvable pre-2.1.0 id - const last = /$/.exec(sig) as RegExpExecArray; - out[`${host}@${last[1]}:${last[2]}`] = { id, kind: "callable" }; - } - for (const [sig, sc] of Object.entries(app.synthesized_callables ?? {})) { - if (idBySig.has(sig)) continue; // the tree names it now - const m = /^(.*):?$/.exec(sig); - const enclosing = m ? idBySig.get(m[1] as string) : undefined; - const id = m && enclosing ? `${enclosing}@${m[2]}:${m[3]}` : `${appId}/@synthetic/${encodeURIComponent(sig)}`; - idBySig.set(sig, id); - out[id] = { - id, - kind: "callable", - name: sc.name, - path: sc.path, - span: { start: [sc.start_line, sc.start_column], end: [sc.start_line, sc.start_column], bytes: [0, 0] }, - }; - } - return out; -} +/** INTERNAL model fields — never on the wire (see schema.ts header). */ +const INTERNAL_KEYS = new Set(["call_sites", "abs_path", "content_hash", "last_modified", "file_size"]); // ---------------------------------------------------------------------------------------------- // entry point @@ -368,48 +50,21 @@ export interface ToV2Result { export function toV2Detailed(app: TSApplication, opts: AnalysisOptions): ToV2Result { const level = opts.analysisLevel; const appName = (opts.appName ?? (opts.input ? path.basename(opts.input) : "") ?? "").trim() || "app"; - const appId = `can://${LANGUAGE}/${appName}`; - const idBySig = new Map(); - const collisions: string[] = []; - const pendingCallees: Array<{ node: V2BodyNode; calleeSig: string | null }> = []; - const pendingHeritage: PendingHeritage[] = []; - const callableBySig = new Map(); - const shared: SharedState = { idBySig, collisions, pendingCallees, pendingHeritage, callableBySig, level }; - // L1 — the containment tree (registers every real callable/type id in idBySig). - const symbol_table: Record = {}; - for (const [fileKey, m] of Object.entries(app.symbol_table)) { - symbol_table[fileKey] = toModule(m, `${appId}/${fileKey}`, shared); - } - const root: V2Root = { id: appId, kind: "application", symbol_table, call_graph: [], param_in: [], param_out: [] }; + // L1 — stamp ids, derive body{}, project heritage (all overwrite-idempotent per-run passes). + const { appId, idBySig, callableBySig, collisions } = assignIds(app, appName); + populateL1Body(app); + resolveHeritageIds(app, idBySig); - // Resolve heritage sig → can:// id now that every first-party type is registered in idBySig - // (independent of level: types are homed during the unconditional L1 walk above). Unresolved - // (external/library) supertypes are dropped, never nulled — the "resolved-only" rule. - for (const { node, extendsSigs, implementsSigs } of pendingHeritage) { - const extendsIds = extendsSigs.map((s) => idBySig.get(s)).filter((x): x is string => x !== undefined); - const implementsIds = implementsSigs.map((s) => idBySig.get(s)).filter((x): x is string => x !== undefined); - if (extendsIds.length) node.extends_ids = extendsIds; - if (implementsIds.length) node.implements_ids = implementsIds; - } + const root: V2Root = { id: appId, kind: "application", symbol_table: app.symbol_table, call_graph: [], param_in: [], param_out: [] }; - // L2 — home the off-tree edge endpoints, backfill `callee`, rewrite the call graph. + // L2 — home the off-tree edge endpoints, backfill `callee`, re-identify the call graph. const dangling: string[] = []; if (level >= 2) { root.external_symbols = homeExternals(app, appId, idBySig); root.synthesized_callables = homeSynthesized(app, appId, idBySig); - for (const { node, calleeSig } of pendingCallees) { - if (calleeSig) node.callee = idBySig.get(calleeSig) ?? null; - } - root.call_graph = (app.call_graph ?? []) - .map((e): V2CallEdge | null => { - const src = idBySig.get(e.source); - const dst = idBySig.get(e.target); - if (!src) dangling.push(e.source); - if (!dst) dangling.push(e.target); - return src && dst ? { src, dst, prov: e.provenance, weight: e.weight } : null; - }) - .filter((e): e is V2CallEdge => e !== null); + backfillCallees(app, idBySig); + root.call_graph = reidentifyCallGraph(app.call_graph ?? [], idBySig, dangling); } // L3/L4 — grow body{} + cfg/cdg/ddg/summary on callables and param_in/param_out on the app. @@ -419,7 +74,7 @@ export function toV2Detailed(app: TSApplication, opts: AnalysisOptions): ToV2Res k_limit = app.program_graphs.k_limit; } - const application: V2Application = { + const envelope: V2Application = { schema_version: SCHEMA_VERSION, language: LANGUAGE, max_level: Math.min(level, MAX_IMPLEMENTED), @@ -427,10 +82,14 @@ export function toV2Detailed(app: TSApplication, opts: AnalysisOptions): ToV2Res analyzer: { name: ANALYZER_NAME, version: ANALYZER_VERSION }, application: root, }; + // The wire copy: deep, detached from the live tree, internal fields stripped by key. + const application = JSON.parse( + JSON.stringify(envelope, (key, value) => (INTERNAL_KEYS.has(key) ? undefined : value)), + ) as V2Application; return { application, idBySig, collisions, dangling }; } -/** The default L1 emitter surface: v1 app + options → schema-v2 Application. */ +/** The default emitter surface: native app + options → schema-v2 Application (the wire). */ export function toV2(app: TSApplication, opts: AnalysisOptions): V2Application { return toV2Detailed(app, opts).application; } diff --git a/src/schema/v2/model.ts b/src/schema/v2/model.ts index efd5e50..45d7f2c 100644 --- a/src/schema/v2/model.ts +++ b/src/schema/v2/model.ts @@ -1,17 +1,17 @@ /** - * Schema v2 — the canonical CLDK analysis shape (the "additive CPG"): one scale-free node - * (id / kind / span / children / typed-edge overlays), emitted as `analysis.json`. This file is - * the TypeScript projection of `codeanalyzer-backend/references/canonical-schema.md`; the SDK's - * Pydantic models mirror it. It is produced by `emit.ts` as a transform of the v1 in-memory - * model (`../schema.ts`) — the parsing/resolution guts are untouched; only serialization changes. + * Schema v2 — the wire envelope + application root, and the historical `V2*` names for the tree + * node types. The tree shapes themselves are the NATIVE model in `../schema.ts` (the stages + * build them directly); this file adds only what exists at serialization scope: the envelope, + * the assembled root, and the cross-callable edge shapes. * - * Levels are additive: L1 grows the tree to callable depth (+ `call` nodes in `body`); L2 adds - * `call_graph` and backfills `callee`; L3 grows the rest of `body` + `cfg`/`cdg`/`ddg`; L4 adds - * synthetic param vertices + `param_in`/`param_out`/`summary`. This file already declares the - * later-level slots (all optional) so the shape is stable as levels land. + * The `V2*` aliases keep the projection/tests compiling during the native-model transition + * (#96); the Stage-4 teardown folds this file into `../schema.ts` and retires the aliases. */ -import type { TSSpan } from "../schema"; +import type { TSCallable, TSField, TSModule, TSSpan, TSType } from "../schema"; +import type { TSBodyNode } from "../schema"; +import type { TSExternalNode, TSSynthesizedNode } from "../homing"; +import type { WireCallEdge } from "../l2Callees"; /** The one universal attribute. `bytes` are char offsets into the owning module's `source`. */ export type Span = TSSpan; @@ -21,7 +21,7 @@ export type Span = TSSpan; // ---------------------------------------------------------------------------------------------- export interface V2Application { - schema_version: string; // "2.0.0" + schema_version: string; // "2.1.0" language: string; // "typescript" max_level: number; // highest level populated; consumers read this, not key-sniffing k_limit?: number; // access-path depth bound for the L3/L4 dataflow (present at L3+) @@ -38,35 +38,23 @@ export interface V2Analyzer { export interface V2Root { id: string; // can:/// kind: "application"; - symbol_table: Record; // keyed by project-relative POSIX path (with extension) - call_graph: V2CallEdge[]; // L2 — callable → callable (empty at L1) + symbol_table: Record; // keyed by project-relative POSIX path (with extension) + call_graph: WireCallEdge[]; // L2 — callable → callable (empty at L1) param_in: V2ParamEdge[]; // L4 (empty until L4) param_out: V2ParamEdge[]; // L4 // TS-additive (parity): edge endpoints outside the containment tree need an id home. - external_symbols?: Record; // L2 — imported/library call targets, keyed by id + external_symbols?: Record; // L2 — imported/library call targets, keyed by id // L2 — 2.1.0 compatibility index: pre-2.1.0 anonymous-callable id → the tree id that replaced - // it. Anonymous callables are real nodes in the tree now; entries whose key equals their own - // `id` are the residual fallback nodes for signatures no provider could name. - synthesized_callables?: Record; -} - -/** A call target outside the project (an imported library member / builtin) — an edge endpoint, not a tree node. */ -export interface V2External extends V2Node { - kind: "external"; - module: string; // the import/require specifier, e.g. "node:fs", "express" - name: string; // the called member, e.g. "readFileSync" + // it. Anonymous callables are real nodes in the tree; entries whose key equals their own `id` + // are the residual fallback nodes for signatures no provider could name. + synthesized_callables?: Record; } // ---------------------------------------------------------------------------------------------- // Cross-callable edges (application scope) // ---------------------------------------------------------------------------------------------- -export interface V2CallEdge { - src: string; // caller callable id - dst: string; // callee callable (or external) id - prov: string[]; // provenance, e.g. ["tsc"], ["jelly"] - weight: number; -} +export type V2CallEdge = WireCallEdge; export interface V2ParamEdge { src: string; @@ -75,63 +63,20 @@ export interface V2ParamEdge { } // ---------------------------------------------------------------------------------------------- -// Nodes — one scale-free node; language-native attrs ride additively via the index signature. +// Historical names for the native tree types (transition aliases, retired at Stage 4) // ---------------------------------------------------------------------------------------------- +export type V2Module = TSModule; +export type V2Type = TSType; +export type V2Callable = TSCallable; +export type V2Field = TSField; +export type V2BodyNode = TSBodyNode; +export type V2External = TSExternalNode; + +/** A loosely-typed node view for consumers that probe optional attributes (the Neo4j projection). */ export interface V2Node { id: string; kind: string; span?: Span; - [attr: string]: unknown; // additive language-native attributes (decorators, is_*, type_parameters, …) -} - -/** A file / compilation unit — a *scope* holding types, functions, and free bindings. */ -export interface V2Module extends V2Node { - kind: "module"; - source: string; // whole file text, once; every node's text slices off this - types: Record; // classes/interfaces/enums/type-aliases/namespaces - functions: Record; // free functions - fields: Record; // module-level const/let/var (Gap B → fields on the scope) -} - -/** - * A type-or-scope node. Classes/interfaces/enums/type-aliases populate `callables`/`fields`; - * a `namespace` (a sub-file scope, Gap A) instead populates `types`/`functions`/`fields`. - */ -export interface V2Type extends V2Node { - kind: "class" | "interface" | "enum" | "type_alias" | "namespace"; - signature: string; // v1 human-readable id (kept; the durable id is `id`) - callables?: Record; // class/interface/enum members - fields?: Record; // class attributes / interface properties / enum members - types?: Record; // namespace: nested types - functions?: Record; // namespace: nested functions - // Heritage: `base_classes`/`implements_types` (carried from v1) stay signature strings — the - // resolved-id projection lives here, additively, for the Neo4j EXTENDS/IMPLEMENTS overlay. - // External/library supertypes that never resolve to a first-party id are dropped, not nulled. - extends_ids?: string[]; // resolved `can://` id(s) of the extended class/interface(s) - implements_ids?: string[]; // resolved `can://` id(s) of implemented interfaces (classes only) -} - -export interface V2Callable extends V2Node { - kind: "function" | "method" | "constructor" | "getter" | "setter" | "arrow" | "function_expression"; - signature: string; - body: Record; // L1: `call` nodes keyed by line:col; L3+: full statements - callables?: Record; // nested callables (closures) — syntactic containment - types?: Record; // nested (local) classes - cfg?: unknown[]; // L3 - cdg?: unknown[]; // L3 - ddg?: unknown[]; // L3→L4 - summary?: unknown[]; // L4 -} - -export interface V2Field extends V2Node { - kind: "field"; -} - -/** A node inside a callable `body` (L1: call sites; L3+: statements; L4: synthetic vertices). */ -export interface V2BodyNode { - kind: string; // "call" | "statement" | "return" | "entry" | "exit" | "formal_in" | … - span?: Span; - callee?: string | null; // on `call` nodes: null at L1, backfilled to a callable id at L2 [attr: string]: unknown; } diff --git a/src/semantic_analysis/callGraph.ts b/src/semantic_analysis/callGraph.ts index cb7c206..e20ea08 100644 --- a/src/semantic_analysis/callGraph.ts +++ b/src/semantic_analysis/callGraph.ts @@ -14,11 +14,11 @@ import { CALL_DEP, type TSCallEdge, type TSCallable, - type TSClass, type TSExternalSymbol, type TSModule, - type TSNamespace, type TSSynthesizedCallable, + type TSType, + forEachCallable, } from "../schema"; import { resolveCalleeSignature } from "../schema"; import type { Logger } from "../utils"; @@ -49,16 +49,14 @@ export function buildCallGraph( // these, and gating uses the full (merged) table so a cross-program in-project call resolves. const allSignatures = new Set(); for (const mod of Object.values(symbol_table)) { - const sigs: TSCallable[] = []; - collectModule(mod, sigs); - for (const c of sigs) allSignatures.add(c.signature); + forEachCallable(mod, (c) => allSignatures.add(c.signature)); } // Callables to ITERATE: only this program's modules (all modules when `only` is undefined), so a // multi-program build attributes each call site to the program whose options actually resolve it. const callables: TSCallable[] = []; for (const [key, mod] of Object.entries(symbol_table)) { if (only && !only.has(key)) continue; - collectModule(mod, callables); + forEachCallable(mod, (c) => callables.push(c)); } // 2. Index call/new expression AST nodes by full span so we can match recorded call sites. @@ -135,7 +133,7 @@ export function buildCallGraph( for (const caller of callables) { for (const site of caller.call_sites) { const node = callExprIndex.get( - `${caller.path}#${site.start_line}:${site.start_column}-${site.end_line}:${site.end_column}`, + `${caller.abs_path}#${site.start_line}:${site.start_column}-${site.end_line}:${site.end_column}`, ); if (!node) { unresolved++; @@ -233,24 +231,24 @@ function indexClasses( classMeta: Map, childrenOf: Map>, ): void { - const visitClass = (cl: TSClass): void => { - classMeta.set(cl.signature, { - is_abstract: cl.is_abstract, - methods: new Set(Object.values(cl.methods).map((m) => m.name)), - }); - for (const base of cl.base_classes) { - if (!childrenOf.has(base)) childrenOf.set(base, new Set()); - childrenOf.get(base)!.add(cl.signature); + // RTA reach: module- and namespace-scoped classes only — classes local to a callable body are + // deliberately outside the dispatch universe (the historical reach, kept bit-for-bit). + const visitType = (t: TSType): void => { + if (t.kind === "class") { + classMeta.set(t.signature, { + is_abstract: t.is_abstract ?? false, + methods: new Set(Object.values(t.callables ?? {}).map((m) => m.name)), + }); + for (const base of t.base_classes ?? []) { + if (!childrenOf.has(base)) childrenOf.set(base, new Set()); + childrenOf.get(base)!.add(t.signature); + } + } else if (t.kind === "namespace") { + for (const nt of Object.values(t.types ?? {})) visitType(nt); } - for (const ic of Object.values(cl.inner_classes)) visitClass(ic); - }; - const visitNs = (ns: TSNamespace): void => { - for (const cl of Object.values(ns.classes)) visitClass(cl); - for (const n of Object.values(ns.namespaces)) visitNs(n); }; for (const mod of Object.values(symbol_table)) { - for (const cl of Object.values(mod.classes)) visitClass(cl); - for (const n of Object.values(mod.namespaces)) visitNs(n); + for (const t of Object.values(mod.types)) visitType(t); } } @@ -271,30 +269,3 @@ function indexCallExpressions(project: Project): Map { } return idx; } - -// --- recursive collection of every callable signature in the symbol table --- - -function collectModule(mod: TSModule, out: TSCallable[]): void { - for (const f of Object.values(mod.functions)) collectCallable(f, out); - for (const c of Object.values(mod.classes)) collectClass(c, out); - for (const i of Object.values(mod.interfaces)) for (const m of Object.values(i.methods)) collectCallable(m, out); - for (const ns of Object.values(mod.namespaces)) collectNamespace(ns, out); -} - -function collectNamespace(ns: TSNamespace, out: TSCallable[]): void { - for (const f of Object.values(ns.functions)) collectCallable(f, out); - for (const c of Object.values(ns.classes)) collectClass(c, out); - for (const i of Object.values(ns.interfaces)) for (const m of Object.values(i.methods)) collectCallable(m, out); - for (const n of Object.values(ns.namespaces)) collectNamespace(n, out); -} - -function collectClass(c: TSClass, out: TSCallable[]): void { - for (const m of Object.values(c.methods)) collectCallable(m, out); - for (const ic of Object.values(c.inner_classes)) collectClass(ic, out); -} - -function collectCallable(c: TSCallable, out: TSCallable[]): void { - out.push(c); - for (const ic of Object.values(c.inner_callables)) collectCallable(ic, out); - for (const cl of Object.values(c.inner_classes)) collectClass(cl, out); -} diff --git a/src/syntactic_analysis/builders.ts b/src/syntactic_analysis/builders.ts index f856c13..e87bdd0 100644 --- a/src/syntactic_analysis/builders.ts +++ b/src/syntactic_analysis/builders.ts @@ -1,33 +1,35 @@ /** - * Per-file builders: turn a ts-morph SourceFile into a canonical TSModule. Mirrors the role of - * Python's `build_pymodule_from_file`. ts-morph nodes are accessed via dynamic getters (cast to - * `any`) for brevity and resilience across node kinds; the *returned* objects are strictly typed - * to the schema, which is what the output contract cares about. + * Per-file builders: turn a ts-morph SourceFile into a canonical TSModule — NATIVELY in the + * schema-v2 shape (types{}/functions{}/fields{} buckets, member-keyed maps, span-only containers, + * omit-instead-of-null leaves). Mirrors the role of python's module builder. ts-morph nodes are + * accessed via dynamic getters (cast to `any`) for brevity and resilience across node kinds; the + * *returned* objects are strictly typed to the schema, which is what the output contract cares + * about. + * + * Builders do NOT stamp `can://` ids (ids embed the per-invocation app name; the cached tree must + * stay app-name-free — assignIds.ts stamps them per run) and do NOT build `body{}` (the l1Body + * pass derives it per run from the INTERNAL `call_sites`). */ import { Node, SyntaxKind } from "ts-morph"; import { type TSCallable, type TSCallableKind, type TSCallsite, - type TSClass, - type TSClassAttribute, type TSComment, type TSDecorator, - type TSEnum, type TSExport, + type TSField, type TSImport, - type TSInterface, type TSModule, - type TSNamespace, type TSOverloadSignature, type TSSpan, - type TSTypeAlias, + type TSType, type TSTypeParameter, - type TSVariableDeclaration, constructorSignatureOf, fileKeyOf, } from "../schema"; import { computeSignatureForDecl } from "../schema"; +import { memberKey } from "../schema/ids"; // ---------------------------------------------------------------------------------------------- // dynamic-getter helpers @@ -49,22 +51,22 @@ function isRedundantOverload(node: Node): boolean { return typeof n.getImplementation === "function" ? n.getImplementation() !== undefined : false; } -function clamp(s: string | undefined | null, max = 400): string | null { - if (s == null) return null; +function clamp(s: string | undefined | null, max = 400): string | undefined { + if (s == null) return undefined; return s.length > max ? s.slice(0, max) : s; } -function inferredType(valueNode: Node): string | null { +function inferredType(valueNode: Node): string | undefined { try { const t = (valueNode as unknown as { getType?: () => { getText: (n?: Node) => string } }).getType?.(); - if (!t) return null; + if (!t) return undefined; return clamp(t.getText(valueNode)); } catch { - return null; + return undefined; } } -function returnTypeText(fnNode: Node): string | null { +function returnTypeText(fnNode: Node): string | undefined { const n = fnNode as unknown as { getReturnTypeNode?: () => { getText: () => string } | undefined; getReturnType?: () => { getText: (n?: Node) => string }; @@ -77,7 +79,7 @@ function returnTypeText(fnNode: Node): string | null { } catch { /* unresolved */ } - return null; + return undefined; } function span(node: Node): { start_line: number; end_line: number; start_column: number; end_column: number } { @@ -90,7 +92,7 @@ function span(node: Node): { start_line: number; end_line: number; start_column: /** * schema-v2 precise span: [line, column] endpoints + char offsets into the module source. * `bytes = [getStart(), getEnd()]` are exactly the offsets `Node.getText()` slices, so - * `module.source.slice(bytes[0], bytes[1])` reproduces the node's text (the old `code` field). + * `module.source.slice(bytes[0], bytes[1])` reproduces the node's text. */ function richSpan(node: Node): TSSpan { const sf = node.getSourceFile(); @@ -101,15 +103,7 @@ function richSpan(node: Node): TSSpan { return { start: [sl.line, sl.column], end: [el.line, el.column], bytes: [s, e] }; } -function declLines(node: Node): { start_line: number; end_line: number; code_start_line: number } { - return { - start_line: node.getStartLineNumber(true), - end_line: node.getEndLineNumber(), - code_start_line: node.getStartLineNumber(false), - }; -} - -function accessibilityOf(node: Node): string | null { +function accessibilityOf(node: Node): string | undefined { const mods = (node as unknown as { getModifiers?: () => Node[] }).getModifiers?.() ?? []; for (const m of mods) { const k = m.getKind(); @@ -117,7 +111,7 @@ function accessibilityOf(node: Node): string | null { if (k === SyntaxKind.ProtectedKeyword) return "protected"; if (k === SyntaxKind.PublicKeyword) return "public"; } - return null; + return undefined; } function isExportedDecl(node: Node): boolean { @@ -180,9 +174,10 @@ function decoratorsOf(node: Node): TSDecorator[] { } } } + const qualified = dec.getFullName(); return { name: dec.getName(), - qualified_name: dec.getFullName() ?? null, + ...(qualified != null ? { qualified_name: qualified } : {}), positional_arguments: positional, keyword_arguments: keyword, ...span(d), @@ -199,10 +194,12 @@ function typeParamsOf(node: Node): TSTypeParameter[] { getConstraint?: () => { getText: () => string } | undefined; getDefault?: () => { getText: () => string } | undefined; }; + const constraint = t.getConstraint?.()?.getText(); + const dflt = t.getDefault?.()?.getText(); return { name: t.getName(), - constraint: t.getConstraint?.()?.getText() ?? null, - default: t.getDefault?.()?.getText() ?? null, + ...(constraint != null ? { constraint } : {}), + ...(dflt != null ? { default: dflt } : {}), }; }); } @@ -217,20 +214,24 @@ function buildParam(param: Node): import("../schema").TSCallableParameter { getTypeNode?: () => { getText: () => string } | undefined; getInitializer?: () => { getText: () => string } | undefined; }; + const type = p.getTypeNode?.()?.getText() ?? inferredType(param); + const dflt = p.getInitializer?.()?.getText(); + const accessibility = accessibilityOf(param); return { name: p.getName(), - type: p.getTypeNode?.()?.getText() ?? inferredType(param), - default_value: p.getInitializer?.()?.getText() ?? null, + ...(type != null ? { type } : {}), + ...(dflt != null ? { default_value: dflt } : {}), is_optional: boolOf(param, "isOptional"), is_rest: boolOf(param, "isRestParameter"), is_readonly: boolOf(param, "isReadonly"), - accessibility: accessibilityOf(param), + ...(accessibility != null ? { accessibility } : {}), decorators: decoratorsOf(param), ...span(param), }; } -function buildVariable(vd: Node, scope: TSVariableDeclaration["scope"]): TSVariableDeclaration { +/** A module/namespace `const`/`let`/`var` binding as a `field` node. */ +function buildVariableField(vd: Node, scope: "module" | "namespace"): TSField { const v = vd as unknown as { getName: () => string; getTypeNode?: () => { getText: () => string } | undefined; @@ -239,7 +240,7 @@ function buildVariable(vd: Node, scope: TSVariableDeclaration["scope"]): TSVaria }; const vs = v.getVariableStatement?.(); const kindRaw = String(vs?.getDeclarationKind?.() ?? ""); - const declaration_kind: TSVariableDeclaration["declaration_kind"] = kindRaw.includes("const") + const declaration_kind: TSField["declaration_kind"] = kindRaw.includes("const") ? "const" : kindRaw.includes("let") ? "let" @@ -248,40 +249,46 @@ function buildVariable(vd: Node, scope: TSVariableDeclaration["scope"]): TSVaria : kindRaw.includes("using") ? "using" : "unknown"; + const type = v.getTypeNode?.()?.getText() ?? inferredType(vd); + const initializer = v.getInitializer?.()?.getText(); return { + id: "", + kind: "field", + span: richSpan(vd), name: v.getName(), - type: v.getTypeNode?.()?.getText() ?? inferredType(vd), - initializer: v.getInitializer?.()?.getText() ?? null, - value: null, + ...(type != null ? { type } : {}), + ...(initializer != null ? { initializer } : {}), scope, declaration_kind, is_readonly: declaration_kind === "const", is_exported: vs?.isExported?.() ?? false, - ...span(vd), - span: richSpan(vd), }; } -function buildAttribute(prop: Node): TSClassAttribute { +/** A class property / interface property as a `field` node. */ +function buildAttributeField(prop: Node): TSField { const p = prop as unknown as { getName: () => string; getTypeNode?: () => { getText: () => string } | undefined; getInitializer?: () => { getText: () => string } | undefined; }; + const type = p.getTypeNode?.()?.getText() ?? inferredType(prop); + const initializer = p.getInitializer?.()?.getText(); + const accessibility = accessibilityOf(prop); return { + id: "", + kind: "field", span: richSpan(prop), name: p.getName(), - type: p.getTypeNode?.()?.getText() ?? inferredType(prop), + ...(type != null ? { type } : {}), comments: jsDocsOf(prop), decorators: decoratorsOf(prop), - initializer: p.getInitializer?.()?.getText() ?? null, - accessibility: accessibilityOf(prop), + ...(initializer != null ? { initializer } : {}), + ...(accessibility != null ? { accessibility } : {}), is_static: boolOf(prop, "isStatic"), is_readonly: boolOf(prop, "isReadonly"), is_optional: boolOf(prop, "hasQuestionToken"), is_abstract: boolOf(prop, "isAbstract"), - start_line: prop.getStartLineNumber(true), - end_line: prop.getEndLineNumber(), }; } @@ -289,8 +296,8 @@ function buildCallsite(call: Node): TSCallsite { const isNew = Node.isNewExpression(call); const expr = (call as unknown as { getExpression: () => Node }).getExpression(); let method_name = expr.getText(); - let receiver_expr: string | null = null; - let receiver_type: string | null = null; + let receiver_expr: string | undefined; + let receiver_type: string | undefined; let is_optional_chain = false; if (Node.isPropertyAccessExpression(expr)) { method_name = expr.getName(); @@ -302,14 +309,14 @@ function buildCallsite(call: Node): TSCallsite { const argument_types = args.map((a) => inferredType(a) ?? "unknown"); const typeArgs = (call as unknown as { getTypeArguments?: () => Node[] }).getTypeArguments?.() ?? []; const type_arguments = typeArgs.map((t) => t.getText()); + const return_type = inferredType(call); return { method_name, - receiver_expr, - receiver_type, + ...(receiver_expr != null ? { receiver_expr } : {}), + ...(receiver_type != null ? { receiver_type } : {}), argument_types, type_arguments, - return_type: inferredType(call), - callee_signature: null, + ...(return_type != null ? { return_type } : {}), is_constructor_call: isNew, is_optional_chain, ...span(call), @@ -339,7 +346,6 @@ function namedBoundary(node: Node): Boundary { interface BodyHandlers { onCall: (n: Node) => void; - onLocal: (vd: Node) => void; onNestedCallable: (n: Node) => void; onNestedClass: (n: Node) => void; } @@ -357,7 +363,6 @@ function walkBody(body: Node, h: BodyHandlers): void { } if (b === "skip") return; if (Node.isCallExpression(node) || Node.isNewExpression(node)) h.onCall(node); - if (Node.isVariableDeclaration(node)) h.onLocal(node); node.forEachChild(visit); }; // A concise arrow body can *be* a callable (`() => () => x`). Visiting only the body's children @@ -409,13 +414,16 @@ function computeCC(body: Node): number { function overloadsOf(fnNode: Node): TSOverloadSignature[] { const ovs = (fnNode as unknown as { getOverloads?: () => Node[] }).getOverloads?.(); if (!ovs || !ovs.length) return []; - return ovs.map((o) => ({ - parameters: ((o as unknown as { getParameters?: () => Node[] }).getParameters?.() ?? []).map(buildParam), - return_type: returnTypeText(o), - type_parameters: typeParamsOf(o), - start_line: o.getStartLineNumber(true), - end_line: o.getEndLineNumber(), - })); + return ovs.map((o) => { + const return_type = returnTypeText(o); + return { + parameters: ((o as unknown as { getParameters?: () => Node[] }).getParameters?.() ?? []).map(buildParam), + ...(return_type != null ? { return_type } : {}), + type_parameters: typeParamsOf(o), + start_line: o.getStartLineNumber(true), + end_line: o.getEndLineNumber(), + }; + }); } /** @@ -446,22 +454,20 @@ export function buildCallable( if (!sig) return null; const call_sites: TSCallsite[] = []; - const local_variables: TSVariableDeclaration[] = []; - const inner_callables: Record = {}; - const inner_classes: Record = {}; + const callables: Record = {}; + const types: Record = {}; const body = (fnNode as unknown as { getBody?: () => Node | undefined }).getBody?.(); if (body) { walkBody(body, { onCall: (n) => call_sites.push(buildCallsite(n)), - onLocal: (vd) => local_variables.push(buildVariable(vd, "function")), onNestedCallable: (n) => { const r = buildNestedCallable(n, root); - if (r) inner_callables[r.sig] = r.callable; + if (r) callables[memberKey(r.sig, r.callable.accessor_kind)] = r.callable; }, onNestedClass: (n) => { const r = buildClass(n, root); - inner_classes[r.sig] = r.cls; + types[memberKey(r.sig)] = r.cls; }, }); } @@ -469,26 +475,23 @@ export function buildCallable( const nameNode = sigNode as unknown as { getName?: () => string | undefined }; const name = Node.isConstructorDeclaration(fnNode) ? "constructor" : (nameNode.getName?.() ?? "(anonymous)"); + const return_type = kind === "constructor" || kind === "setter" ? undefined : returnTypeText(fnNode); + const accessibility = accessibilityOf(fnNode); + const accessor_kind = kind === "getter" ? "getter" : kind === "setter" ? "setter" : undefined; const callable: TSCallable = { + id: "", + kind, span: richSpan(sigNode), name, - path: sigNode.getSourceFile().getFilePath(), signature: sig, comments: jsDocsOf(sigNode), decorators: decoratorsOf(fnNode), parameters: ((fnNode as unknown as { getParameters?: () => Node[] }).getParameters?.() ?? []).map(buildParam), type_parameters: typeParamsOf(fnNode), - return_type: kind === "constructor" || kind === "setter" ? null : returnTypeText(fnNode), - code: clamp(sigNode.getText(), 20000), - ...declLines(sigNode), - call_sites, - inner_callables, - inner_classes, - local_variables, + ...(return_type != null ? { return_type } : {}), cyclomatic_complexity: body ? computeCC(body) : 0, - kind, - accessibility: accessibilityOf(fnNode), + ...(accessibility != null ? { accessibility } : {}), is_static: boolOf(fnNode, "isStatic"), is_abstract: boolOf(fnNode, "isAbstract"), is_async: boolOf(fnNode, "isAsync"), @@ -498,9 +501,14 @@ export function buildCallable( is_exported: isExportedDecl(sigNode), is_ambient: isAmbientDecl(sigNode), is_implicit: false, - accessor_kind: kind === "getter" ? "getter" : kind === "setter" ? "setter" : null, + ...(accessor_kind != null ? { accessor_kind } : {}), overload_signatures: overloadsOf(fnNode), + body: {}, + abs_path: sigNode.getSourceFile().getFilePath(), + call_sites, }; + if (Object.keys(callables).length) callable.callables = callables; + if (Object.keys(types).length) callable.types = types; return { sig, callable }; } @@ -509,26 +517,16 @@ function implicitConstructor(classSig: string, filePath: string): { sig: string; return { sig, callable: { + id: "", + kind: "constructor", span: { start: [0, 0], end: [0, 0], bytes: [0, 0] }, // synthetic: no source name: "constructor", - path: filePath, signature: sig, comments: [], decorators: [], parameters: [], type_parameters: [], - return_type: null, - code: null, - start_line: -1, - end_line: -1, - code_start_line: -1, - call_sites: [], - inner_callables: {}, - inner_classes: {}, - local_variables: [], cyclomatic_complexity: 0, - kind: "constructor", - accessibility: null, is_static: false, is_abstract: false, is_async: false, @@ -538,8 +536,10 @@ function implicitConstructor(classSig: string, filePath: string): { sig: string; is_exported: false, is_ambient: false, is_implicit: true, - accessor_kind: null, overload_signatures: [], + body: {}, + abs_path: filePath, + call_sites: [], }, }; } @@ -577,7 +577,7 @@ function resolveHeritage(expr: Node, root: string): string { // type-kind builders // ---------------------------------------------------------------------------------------------- -export function buildClass(cls: Node, root: string): { sig: string; cls: TSClass } { +export function buildClass(cls: Node, root: string): { sig: string; cls: TSType } { const sig = computeSignatureForDecl(cls, root) ?? `${fileKeyOf(cls.getSourceFile().getFilePath(), root).modulePrefix}.(anonymous)`; const filePath = cls.getSourceFile().getFilePath(); const c = cls as unknown as { @@ -591,55 +591,55 @@ export function buildClass(cls: Node, root: string): { sig: string; cls: TSClass getImplements?: () => Node[]; }; - const methods: Record = {}; + const callables: Record = {}; for (const m of c.getMethods()) { if (isRedundantOverload(m)) continue; const r = buildCallable(m, m, "method", root); - if (r) methods[r.sig] = r.callable; + if (r) callables[memberKey(r.sig)] = r.callable; } const ctors = c.getConstructors(); if (ctors.length === 0) { const imp = implicitConstructor(sig, filePath); - methods[imp.sig] = imp.callable; + callables[memberKey(imp.sig)] = imp.callable; } else { for (const ctor of ctors) { if (isRedundantOverload(ctor)) continue; const r = buildCallable(ctor, ctor, "constructor", root); - if (r) methods[r.sig] = r.callable; + if (r) callables[memberKey(r.sig)] = r.callable; } } for (const g of c.getGetAccessors()) { const r = buildCallable(g, g, "getter", root); - if (r) methods[`${r.sig}#get`] = r.callable; + if (r) callables[memberKey(r.sig, "getter")] = r.callable; } for (const s of c.getSetAccessors()) { const r = buildCallable(s, s, "setter", root); - if (r) methods[`${r.sig}#set`] = r.callable; + if (r) callables[memberKey(r.sig, "setter")] = r.callable; } - const attributes: Record = {}; + const fields: Record = {}; for (const p of c.getProperties()) { - attributes[(p as unknown as { getName: () => string }).getName()] = buildAttribute(p); + fields[(p as unknown as { getName: () => string }).getName()] = buildAttributeField(p); } - // parameter properties (constructor(private x: T)) are class fields too + // parameter properties (constructor(private x: T)) are class fields too — spanless on the wire. for (const ctor of ctors) { for (const p of (ctor as unknown as { getParameters: () => Node[] }).getParameters()) { const acc = accessibilityOf(p); if (acc || boolOf(p, "isReadonly")) { const pn = p as unknown as { getName: () => string; getTypeNode?: () => { getText: () => string } | undefined }; - attributes[pn.getName()] = { + const type = pn.getTypeNode?.()?.getText() ?? inferredType(p); + fields[pn.getName()] = { + id: "", + kind: "field", name: pn.getName(), - type: pn.getTypeNode?.()?.getText() ?? inferredType(p), + ...(type != null ? { type } : {}), comments: [], decorators: decoratorsOf(p), - initializer: null, - accessibility: acc, + ...(acc != null ? { accessibility: acc } : {}), is_static: false, is_readonly: boolOf(p, "isReadonly"), is_optional: boolOf(p, "isOptional"), is_abstract: false, - start_line: p.getStartLineNumber(true), - end_line: p.getEndLineNumber(), }; } } @@ -658,28 +658,26 @@ export function buildClass(cls: Node, root: string): { sig: string; cls: TSClass return { sig, cls: { + id: "", + kind: "class", span: richSpan(cls), name: c.getName?.() ?? "(anonymous)", signature: sig, comments: jsDocsOf(cls), - code: clamp(cls.getText(), 20000), decorators: decoratorsOf(cls), base_classes, implements_types, type_parameters: typeParamsOf(cls), - methods, - attributes, - inner_classes: {}, + callables, + fields, is_abstract: boolOf(cls, "isAbstract"), is_exported: isExportedDecl(cls), is_ambient: isAmbientDecl(cls), - start_line: cls.getStartLineNumber(true), - end_line: cls.getEndLineNumber(), }, }; } -export function buildInterface(intf: Node, root: string): { sig: string; intf: TSInterface } { +export function buildInterface(intf: Node, root: string): { sig: string; intf: TSType } { const sig = computeSignatureForDecl(intf, root) ?? `${fileKeyOf(intf.getSourceFile().getFilePath(), root).modulePrefix}.(anonymous)`; const i = intf as unknown as { getName: () => string; @@ -690,14 +688,14 @@ export function buildInterface(intf: Node, root: string): { sig: string; intf: T getConstructSignatures?: () => Node[]; getIndexSignatures?: () => Node[]; }; - const methods: Record = {}; + const callables: Record = {}; for (const m of i.getMethods()) { const r = buildCallable(m, m, "method", root); - if (r) methods[r.sig] = r.callable; + if (r) callables[memberKey(r.sig)] = r.callable; } - const properties: Record = {}; + const fields: Record = {}; for (const p of i.getProperties()) { - properties[(p as unknown as { getName: () => string }).getName()] = buildAttribute(p); + fields[(p as unknown as { getName: () => string }).getName()] = buildAttributeField(p); } const base_classes = (i.getExtends?.() ?? []).map((e) => resolveHeritage(e, root)); const call_signatures = [ @@ -708,78 +706,77 @@ export function buildInterface(intf: Node, root: string): { sig: string; intf: T return { sig, intf: { + id: "", + kind: "interface", span: richSpan(intf), name: i.getName(), signature: sig, comments: jsDocsOf(intf), - code: clamp(intf.getText(), 20000), base_classes, type_parameters: typeParamsOf(intf), - methods, - properties, + callables, + fields, call_signatures, index_signatures, is_exported: isExportedDecl(intf), is_ambient: isAmbientDecl(intf), - start_line: intf.getStartLineNumber(true), - end_line: intf.getEndLineNumber(), }, }; } -export function buildEnum(en: Node, root: string): { sig: string; en: TSEnum } { +export function buildEnum(en: Node, root: string): { sig: string; en: TSType } { const sig = computeSignatureForDecl(en, root) ?? `${fileKeyOf(en.getSourceFile().getFilePath(), root).modulePrefix}.(anonymous)`; const e = en as unknown as { getName: () => string; getMembers: () => Node[]; isConstEnum?: () => boolean }; - const members = e.getMembers().map((m) => { + const fields: Record = {}; + for (const m of e.getMembers()) { const mm = m as unknown as { getName: () => string; getValue?: () => string | number | undefined; getInitializer?: () => { getText: () => string } | undefined; }; const v = mm.getValue?.(); - return { + const value = v !== undefined && v !== null ? String(v) : mm.getInitializer?.()?.getText(); + fields[mm.getName()] = { + id: "", + kind: "field", span: richSpan(m), name: mm.getName(), - value: v !== undefined && v !== null ? String(v) : (mm.getInitializer?.()?.getText() ?? null), - start_line: m.getStartLineNumber(true), - end_line: m.getEndLineNumber(), + ...(value != null ? { value } : {}), }; - }); + } return { sig, en: { + id: "", + kind: "enum", span: richSpan(en), name: e.getName(), signature: sig, comments: jsDocsOf(en), - code: clamp(en.getText(), 20000), - members, + fields, is_const: e.isConstEnum?.() ?? false, is_exported: isExportedDecl(en), is_ambient: isAmbientDecl(en), - start_line: en.getStartLineNumber(true), - end_line: en.getEndLineNumber(), }, }; } -export function buildTypeAlias(ta: Node, root: string): { sig: string; ta: TSTypeAlias } { +export function buildTypeAlias(ta: Node, root: string): { sig: string; ta: TSType } { const sig = computeSignatureForDecl(ta, root) ?? `${fileKeyOf(ta.getSourceFile().getFilePath(), root).modulePrefix}.(anonymous)`; const t = ta as unknown as { getName: () => string; getTypeNode?: () => { getText: () => string } | undefined }; return { sig, ta: { + id: "", + kind: "type_alias", span: richSpan(ta), name: t.getName(), signature: sig, comments: jsDocsOf(ta), - code: clamp(ta.getText(), 20000), aliased_type: t.getTypeNode?.()?.getText() ?? "", type_parameters: typeParamsOf(ta), is_exported: isExportedDecl(ta), is_ambient: isAmbientDecl(ta), - start_line: ta.getStartLineNumber(true), - end_line: ta.getEndLineNumber(), }, }; } @@ -788,17 +785,13 @@ export function buildTypeAlias(ta: Node, root: string): { sig: string; ta: TSTyp // statemented container (Module + Namespace share this) // ---------------------------------------------------------------------------------------------- -interface Buckets { - classes: Record; - interfaces: Record; - enums: Record; - type_aliases: Record; +interface ScopeBuckets { + types: Record; functions: Record; - namespaces: Record; - variables: TSVariableDeclaration[]; + fields: Record; } -function buildStatemented(container: Node, root: string, varScope: TSVariableDeclaration["scope"]): Buckets { +function buildStatemented(container: Node, root: string, varScope: "module" | "namespace"): ScopeBuckets { const c = container as unknown as { getClasses: () => Node[]; getInterfaces: () => Node[]; @@ -808,42 +801,43 @@ function buildStatemented(container: Node, root: string, varScope: TSVariableDec getModules: () => Node[]; getVariableStatements: () => Node[]; }; - const classes: Record = {}; + // One types{} map. Fill order (classes → interfaces → enums → aliases → namespaces) is the + // canonical precedence: on a member-key collision (e.g. class/interface declaration merging) + // the later kind wins, exactly as the historical per-kind bucket merge did. + const types: Record = {}; for (const cl of c.getClasses()) { const r = buildClass(cl, root); - classes[r.sig] = r.cls; + types[memberKey(r.sig)] = r.cls; } - const interfaces: Record = {}; for (const it of c.getInterfaces()) { const r = buildInterface(it, root); - interfaces[r.sig] = r.intf; + types[memberKey(r.sig)] = r.intf; } - const enums: Record = {}; for (const en of c.getEnums()) { const r = buildEnum(en, root); - enums[r.sig] = r.en; + types[memberKey(r.sig)] = r.en; } - const type_aliases: Record = {}; for (const ta of c.getTypeAliases()) { const r = buildTypeAlias(ta, root); - type_aliases[r.sig] = r.ta; + types[memberKey(r.sig)] = r.ta; } const functions: Record = {}; for (const fn of c.getFunctions()) { if (isRedundantOverload(fn)) continue; const r = buildCallable(fn, fn, "function", root); - if (r) functions[r.sig] = r.callable; + if (r) functions[memberKey(r.sig, r.callable.accessor_kind)] = r.callable; } - const variables: TSVariableDeclaration[] = []; + const fields: Record = {}; for (const vs of c.getVariableStatements()) { for (const vd of (vs as unknown as { getDeclarations: () => Node[] }).getDeclarations()) { const init = (vd as unknown as { getInitializer?: () => Node | undefined }).getInitializer?.(); if (init && (Node.isArrowFunction(init) || Node.isFunctionExpression(init))) { const k: TSCallableKind = Node.isArrowFunction(init) ? "arrow" : "function_expression"; const r = buildCallable(vd, init, k, root); - if (r) functions[r.sig] = r.callable; + if (r) functions[memberKey(r.sig)] = r.callable; } else { - variables.push(buildVariable(vd, varScope)); + const f = buildVariableField(vd, varScope); + fields[f.name] = f; } } } @@ -853,28 +847,29 @@ function buildStatemented(container: Node, root: string, varScope: TSVariableDec // loops above already claimed, so nothing is collected twice. walkBody(container, { onCall: () => {}, - onLocal: () => {}, onNestedCallable: (n) => { if (!Node.isArrowFunction(n) && !Node.isFunctionExpression(n)) return; // already bucketed const r = buildCallable(n, n, Node.isArrowFunction(n) ? "arrow" : "function_expression", root); - if (r) functions[r.sig] = r.callable; + if (r) functions[memberKey(r.sig)] = r.callable; }, onNestedClass: () => {}, }); - const namespaces: Record = {}; for (const ns of c.getModules()) { const r = buildNamespace(ns, root); - namespaces[r.sig] = r.ns; + types[memberKey(r.sig)] = r.ns; } - return { classes, interfaces, enums, type_aliases, functions, namespaces, variables }; + return { types, functions, fields }; } -export function buildNamespace(ns: Node, root: string): { sig: string; ns: TSNamespace } { +/** Gap A: a namespace is a nested *scope* — same buckets as a module (types/functions/fields). */ +export function buildNamespace(ns: Node, root: string): { sig: string; ns: TSType } { const sig = computeSignatureForDecl(ns, root) ?? `${fileKeyOf(ns.getSourceFile().getFilePath(), root).modulePrefix}.(anonymous)`; const buckets = buildStatemented(ns, root, "namespace"); return { sig, ns: { + id: "", + kind: "namespace", span: richSpan(ns), name: (ns as unknown as { getName: () => string }).getName(), signature: sig, @@ -882,8 +877,6 @@ export function buildNamespace(ns: Node, root: string): { sig: string; ns: TSNam ...buckets, is_exported: isExportedDecl(ns), is_ambient: isAmbientDecl(ns), - start_line: ns.getStartLineNumber(true), - end_line: ns.getEndLineNumber(), }, }; } @@ -909,21 +902,22 @@ function buildImports(sf: Node): TSImport[] { const def = i.getDefaultImport?.(); const ns = i.getNamespaceImport?.(); const named = i.getNamedImports?.() ?? []; - if (def) out.push({ module, name: def.getText(), alias: null, is_type_only: typeOnly, import_kind: "default", ...s }); + if (def) out.push({ module, name: def.getText(), is_type_only: typeOnly, import_kind: "default", ...s }); if (ns) out.push({ module, name: "*", alias: ns.getText(), is_type_only: typeOnly, import_kind: "namespace", ...s }); for (const ni of named) { const n = ni as unknown as { getName: () => string; getAliasNode?: () => { getText: () => string } | undefined; isTypeOnly?: () => boolean }; + const alias = n.getAliasNode?.()?.getText(); out.push({ module, name: n.getName(), - alias: n.getAliasNode?.()?.getText() ?? null, + ...(alias != null ? { alias } : {}), is_type_only: typeOnly || (n.isTypeOnly?.() ?? false), import_kind: "named", ...s, }); } if (!def && !ns && named.length === 0) { - out.push({ module, name: "", alias: null, is_type_only: typeOnly, import_kind: "side_effect", ...s }); + out.push({ module, name: "", is_type_only: typeOnly, import_kind: "side_effect", ...s }); } } return out; @@ -939,21 +933,37 @@ function buildExports(sf: Node): TSExport[] { getNamespaceExport?: () => { getNameNode?: () => { getText: () => string } } | undefined; getNamedExports?: () => Node[]; }; - const module = e.getModuleSpecifierValue?.() ?? null; + const module = e.getModuleSpecifierValue?.(); const typeOnly = e.isTypeOnly(); const s = span(exp); const nsExp = e.getNamespaceExport?.(); const named = e.getNamedExports?.() ?? []; if (nsExp) { - out.push({ module, name: "*", alias: nsExp.getNameNode?.()?.getText() ?? null, is_type_only: typeOnly, export_kind: module ? "re_export" : "namespace", ...s }); + const alias = nsExp.getNameNode?.()?.getText(); + out.push({ + ...(module != null ? { module } : {}), + name: "*", + ...(alias != null ? { alias } : {}), + is_type_only: typeOnly, + export_kind: module ? "re_export" : "namespace", + ...s, + }); } for (const ne of named) { const n = ne as unknown as { getName: () => string; getAliasNode?: () => { getText: () => string } | undefined }; - out.push({ module, name: n.getName(), alias: n.getAliasNode?.()?.getText() ?? null, is_type_only: typeOnly, export_kind: module ? "re_export" : "named", ...s }); + const alias = n.getAliasNode?.()?.getText(); + out.push({ + ...(module != null ? { module } : {}), + name: n.getName(), + ...(alias != null ? { alias } : {}), + is_type_only: typeOnly, + export_kind: module ? "re_export" : "named", + ...s, + }); } if (!nsExp && named.length === 0 && module) { // `export * from "m"` with no namespace binding - out.push({ module, name: "*", alias: null, is_type_only: typeOnly, export_kind: "re_export", ...s }); + out.push({ module, name: "*", is_type_only: typeOnly, export_kind: "re_export", ...s }); } } return out; @@ -997,30 +1007,20 @@ function collectComments(sf: Node): TSComment[] { export function buildModule(sf: Node, root: string): TSModule { const filePath = sf.getSourceFile().getFilePath(); - const { fileKey, modulePrefix } = fileKeyOf(filePath, root); const buckets = buildStatemented(sf, root, "module"); // schema-v2: retain the whole file text once on the module; every node's text slices off it. const source = (sf as unknown as { getFullText: () => string }).getFullText(); const endLc = sf.getSourceFile().getLineAndColumnAtPos(source.length); return { + id: "", + kind: "module", span: { start: [1, 1], end: [endLc.line, endLc.column], bytes: [0, source.length] }, source, - file_path: fileKey, - module_name: modulePrefix, imports: buildImports(sf), exports: buildExports(sf), comments: collectComments(sf), - classes: buckets.classes, - interfaces: buckets.interfaces, - enums: buckets.enums, - type_aliases: buckets.type_aliases, - functions: buckets.functions, - namespaces: buckets.namespaces, - variables: buckets.variables, + ...buckets, is_tsx: filePath.endsWith(".tsx"), is_declaration_file: (sf as unknown as { isDeclarationFile: () => boolean }).isDeclarationFile(), - content_hash: null, - last_modified: null, - file_size: null, }; } diff --git a/test/schema-v2.test.ts b/test/schema-v2.test.ts index aef3522..35ddc1d 100644 --- a/test/schema-v2.test.ts +++ b/test/schema-v2.test.ts @@ -12,7 +12,7 @@ import * as path from "node:path"; import pkg from "../package.json"; import { analyze } from "../src/core"; import type { AnalysisOptions } from "../src/options"; -import type { GraphSelector, TSApplication } from "../src/schema"; +import { forEachCallable, forEachType, type GraphSelector, type TSApplication } from "../src/schema"; import { type V2Application, type V2Callable, type V2Module, type V2Type, toV2Detailed } from "../src/schema/v2"; import { type GraphRows, project } from "../src/build/neo4j"; import { tscProvider } from "../src/semantic_analysis"; @@ -222,21 +222,15 @@ describe("schema v2 — inheritance resolves heritage signatures to can:// ids ( }); }); -describe("schema v2 — L1 superset", () => { - test("every v1 callable/type signature has a v2 id", () => { - const v1sigs = new Set(); - const addType = (t: { signature: string; methods?: Record }): void => { - v1sigs.add(t.signature); - for (const m of Object.values(t.methods ?? {})) v1sigs.add(m.signature); - }; +describe("schema v2 — L1 id registration", () => { + test("every tree callable/type signature has a v2 id", () => { + const sigs = new Set(); for (const m of Object.values(v1.symbol_table)) { - for (const t of Object.values(m.classes)) addType(t); - for (const t of Object.values(m.interfaces)) addType(t); - for (const t of Object.values(m.enums)) v1sigs.add(t.signature); - for (const t of Object.values(m.type_aliases)) v1sigs.add(t.signature); - for (const fn of Object.values(m.functions)) v1sigs.add(fn.signature); + forEachCallable(m, (c) => sigs.add(c.signature)); + forEachType(m, (t) => sigs.add(t.signature)); } - const missing = [...v1sigs].filter((s) => !idBySig.has(s)); + expect(sigs.size).toBeGreaterThan(0); + const missing = [...sigs].filter((s) => !idBySig.has(s)); expect(missing).toEqual([]); }); }); From 66626f9d76413f0a6e66e29f0cae8d8d79c094d3 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 26 Aug 2026 18:29:55 -0400 Subject: [PATCH 4/8] refactor(core): analyze() owns the pass spine; emission is dumb (#96) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stages 2+3 of the native-model rewrite, landed together because the pass chain is order-coupled (l2 passes join on assignIds output, the attach on both) — relocating it piecemeal would have made two incoherent halves: - finalizeAnalysis (src/schema/emit.ts) is the per-run pass spine — ids, body, heritage, homing, callee backfill, call-graph re-identification, dataflow attach, envelope, internal-field strip — and analyze() runs it (python-parity: core.py owns the passes). It returns both views: {application (wire), internal (live tree), idBySig, collisions, dangling}. - The L3/L4 tree-attach moves to src/dataflow/attach.ts and takes the program-graph IR directly — the stage that computes the graphs also writes them onto the tree. - serialize.ts no longer reshapes anything: JSON path writes the envelope, Neo4j path projects it. src/schema/v2/ is now model types + a transition shim (toV2/toV2Detailed → finalizeAnalysis) that Stage 4 retires. - saveCache stays ahead of the passes: the cached tree is id-free (--app-name is per-invocation) and holds only source-of-truth layers. Wire-stable: 12 goldens deep-equal; full suite + typecheck green. --- src/core.ts | 15 +++++-- .../v2/dataflow.ts => dataflow/attach.ts} | 16 +++---- src/index.ts | 4 +- src/schema/{v2 => }/emit.ts | 44 +++++++++---------- src/schema/index.ts | 1 + src/schema/v2/index.ts | 21 +++++++-- src/utils/serialize.ts | 21 ++++----- test/anonymous-callables.test.ts | 4 +- test/dataflow.test.ts | 2 +- test/external-resolution.test.ts | 2 +- test/multi-tsconfig.test.ts | 2 +- test/native-rewrite-goldens.test.ts | 4 +- test/neo4j-bolt.test.ts | 8 ++-- test/neo4j-schema.test.ts | 3 +- test/schema-v2.test.ts | 13 +++--- 15 files changed, 86 insertions(+), 74 deletions(-) rename src/{schema/v2/dataflow.ts => dataflow/attach.ts} (96%) rename src/schema/{v2 => }/emit.ts (71%) diff --git a/src/core.ts b/src/core.ts index 6aeda80..2031863 100644 --- a/src/core.ts +++ b/src/core.ts @@ -5,14 +5,19 @@ import { loadCache, saveCache } from "./utils"; import { materialize } from "./build"; import type { AnalysisOptions } from "./options"; import type { TSApplication } from "./schema"; +import { type AnalysisResult, finalizeAnalysis } from "./schema/emit"; import { buildSymbolTable } from "./syntactic_analysis"; import { Logger } from "./utils"; +export type { AnalysisResult } from "./schema/emit"; + /** - * The orchestrator. Order mirrors the reference analyzers: materialize deps → build the symbol - * table → build the resolver call graph → cache the base → return the Application. + * The orchestrator. Order mirrors the reference analyzers (python core.py): materialize deps → + * build the symbol table → call-graph providers → program graphs → cache the id-free base → + * run the per-run pass spine (ids / body / heritage / homing / callees / attach) and assemble + * the wire envelope. Returns BOTH views: the wire `application` and the live `internal` tree. */ -export async function analyze(opts: AnalysisOptions): Promise { +export async function analyze(opts: AnalysisOptions): Promise { const log = new Logger(opts.verbosity); log.info(`analyzing ${opts.input} (level ${opts.analysisLevel})`); const cacheDir = opts.cacheDir ?? path.join(opts.input, ".codeanalyzer"); @@ -79,6 +84,8 @@ export async function analyze(opts: AnalysisOptions): Promise { app.program_graphs = await buildProgramGraphs(extraction, symbol_table, opts, log); } + // Cache the id-free base (ids/body/heritage are per-run layers stamped by finalizeAnalysis; + // the cached tree must stay --app-name-free). saveCache(cacheDir, { symbol_table, call_graph }); - return app; + return finalizeAnalysis(app, opts); } diff --git a/src/schema/v2/dataflow.ts b/src/dataflow/attach.ts similarity index 96% rename from src/schema/v2/dataflow.ts rename to src/dataflow/attach.ts index 72121cd..4a7978d 100644 --- a/src/schema/v2/dataflow.ts +++ b/src/dataflow/attach.ts @@ -1,6 +1,8 @@ /** - * L3/L4 dataflow → the v2 tree. Transforms the v1 `program_graphs` (CFG / PDG[=CDG+DDG] / SDG, - * keyed by (signature, integer node_id)) into the additive-CPG placement: + * L3/L4 dataflow → the v2 tree (the ATTACH step): the stage that computes the program graphs also + * writes them onto the tree (python parity). Transforms the internal `program_graphs` compute IR + * (CFG / PDG[=CDG+DDG] / SDG, keyed by (signature, integer node_id)) into the additive-CPG + * placement: * * L3 (-a 3): grow each callable's `body{}` with statement nodes (+ `@entry`/`@exit`), and hang * the intra-callable edge lists `cfg`/`cdg`/`ddg` (bare local ids) on the callable. @@ -15,9 +17,8 @@ * param→contracted out of the L3 CFG; '@formal_in:N' at L4, statement→'line:col'. */ -import type { CfgEdge, GraphNode, PdgEdge, ProgramGraphs } from "../graphs"; -import type { TSApplication } from "../schema"; -import type { V2Callable, V2ParamEdge, V2Root } from "./model"; +import type { CfgEdge, GraphNode, PdgEdge, ProgramGraphs } from "../schema/graphs"; +import type { V2Callable, V2ParamEdge, V2Root } from "../schema/v2/model"; interface LocalIds { canId: string; @@ -227,13 +228,12 @@ function emitL4(root: V2Root, pg: ProgramGraphs, info: Map): v */ export function applyDataflow( root: V2Root, - app: TSApplication, + pg: ProgramGraphs, idBySig: Map, callableBySig: Map, level: number, ): void { - const pg = app.program_graphs; - if (!pg || level < 3) return; + if (level < 3) return; const info = new Map(); for (const [sig, fg] of Object.entries(pg.functions)) { diff --git a/src/index.ts b/src/index.ts index 0d4a836..3b6de23 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,8 +11,8 @@ async function main(): Promise { emitSchema(opts); return; } - const app = await analyze(opts); - await emit(app, opts); + const result = await analyze(opts); + await emit(result.application, opts); } catch (e) { const err = e as Error; process.stderr.write(`[codeanalyzer-ts] FATAL ${err.stack ?? err.message}\n`); diff --git a/src/schema/v2/emit.ts b/src/schema/emit.ts similarity index 71% rename from src/schema/v2/emit.ts rename to src/schema/emit.ts index ffd817b..5f7d9ad 100644 --- a/src/schema/v2/emit.ts +++ b/src/schema/emit.ts @@ -1,8 +1,8 @@ /** - * Schema-v2 emission: run the per-run passes over the NATIVELY-built tree, assemble the envelope, - * and strip the INTERNAL fields. No reshaping happens here any more — the builders construct the - * wire shapes directly (src/syntactic_analysis/builders.ts) and the passes stamp the per-run - * layers (python-parity architecture, #96): + * finalizeAnalysis — the per-run pass spine (invoked by `analyze()`, python-parity: core runs the + * passes; serialization is dumb): stamp the per-run layers onto the NATIVELY-built tree, assemble + * the envelope, and strip the INTERNAL fields. No reshaping happens anywhere — the builders + * construct the wire shapes directly (src/syntactic_analysis/builders.ts): * * assignIds — can:// ids (per-run: ids embed --app-name; the cache stays id-free) * populateL1Body — call_sites → body{} `call` nodes, callee: null @@ -16,16 +16,16 @@ */ import * as path from "node:path"; -import type { AnalysisOptions } from "../../options"; -import { ANALYZER_VERSION } from "../../utils/version"; -import type { TSApplication } from "../schema"; -import { assignIds } from "../assignIds"; -import { populateL1Body } from "../l1Body"; -import { resolveHeritageIds } from "../heritage"; -import { homeExternals, homeSynthesized } from "../homing"; -import { backfillCallees, reidentifyCallGraph } from "../l2Callees"; -import { applyDataflow } from "./dataflow"; -import type { V2Application, V2Root } from "./model"; +import type { AnalysisOptions } from "../options"; +import { ANALYZER_VERSION } from "../utils/version"; +import type { TSApplication } from "./schema"; +import { assignIds } from "./assignIds"; +import { populateL1Body } from "./l1Body"; +import { resolveHeritageIds } from "./heritage"; +import { homeExternals, homeSynthesized } from "./homing"; +import { backfillCallees, reidentifyCallGraph } from "./l2Callees"; +import { applyDataflow } from "../dataflow/attach"; +import type { V2Application, V2Root } from "./v2/model"; const LANGUAGE = "typescript"; const SCHEMA_VERSION = "2.1.0"; @@ -40,14 +40,15 @@ const INTERNAL_KEYS = new Set(["call_sites", "abs_path", "content_hash", // entry point // ---------------------------------------------------------------------------------------------- -export interface ToV2Result { - application: V2Application; +export interface AnalysisResult { + application: V2Application; // the wire: deep, internal-field-stripped envelope + internal: TSApplication; // the live internal aggregate (tree + sig-keyed provider outputs + program_graphs) idBySig: Map; // signature → can:// id (real callables + externals + synthesized) collisions: string[]; // signatures that mapped to two distinct ids (L1 id-uniqueness gate) dangling: string[]; // call-graph endpoints with no id home (L2 no-dangling gate; should be empty) } -export function toV2Detailed(app: TSApplication, opts: AnalysisOptions): ToV2Result { +export function finalizeAnalysis(app: TSApplication, opts: AnalysisOptions): AnalysisResult { const level = opts.analysisLevel; const appName = (opts.appName ?? (opts.input ? path.basename(opts.input) : "") ?? "").trim() || "app"; @@ -70,7 +71,7 @@ export function toV2Detailed(app: TSApplication, opts: AnalysisOptions): ToV2Res // L3/L4 — grow body{} + cfg/cdg/ddg/summary on callables and param_in/param_out on the app. let k_limit: number | undefined; if (level >= 3 && app.program_graphs) { - applyDataflow(root, app, idBySig, callableBySig, level); + applyDataflow(root, app.program_graphs, idBySig, callableBySig, level); k_limit = app.program_graphs.k_limit; } @@ -86,10 +87,5 @@ export function toV2Detailed(app: TSApplication, opts: AnalysisOptions): ToV2Res const application = JSON.parse( JSON.stringify(envelope, (key, value) => (INTERNAL_KEYS.has(key) ? undefined : value)), ) as V2Application; - return { application, idBySig, collisions, dangling }; -} - -/** The default emitter surface: native app + options → schema-v2 Application (the wire). */ -export function toV2(app: TSApplication, opts: AnalysisOptions): V2Application { - return toV2Detailed(app, opts).application; + return { application, internal: app, idBySig, collisions, dangling }; } diff --git a/src/schema/index.ts b/src/schema/index.ts index fde1c87..828c38b 100644 --- a/src/schema/index.ts +++ b/src/schema/index.ts @@ -3,3 +3,4 @@ export * from "./schema"; export * from "./signatures"; export * from "./graphs"; +export * from "./emit"; diff --git a/src/schema/v2/index.ts b/src/schema/v2/index.ts index 645e29b..dec4ca7 100644 --- a/src/schema/v2/index.ts +++ b/src/schema/v2/index.ts @@ -1,4 +1,19 @@ -// Schema v2 — the canonical additive-CPG shape and the v1→v2 emitter (see canonical-schema.md). +// Transition shim (#96): the emitter moved to src/schema/emit.ts (finalizeAnalysis, run by +// analyze()) and the L3/L4 attach to src/dataflow/attach.ts. These re-exports keep the historical +// v2 import paths and names alive until the Stage-4 teardown retires them. export * from "./model"; -export * from "./emit"; -export * from "./dataflow"; +export { finalizeAnalysis, type AnalysisResult, type AnalysisResult as ToV2Result } from "../emit"; +import type { AnalysisOptions } from "../../options"; +import type { TSApplication } from "../schema"; +import { finalizeAnalysis } from "../emit"; +import type { V2Application } from "./model"; + +/** Historical name for the pass-runner (idempotent — safe to re-run on an analyzed tree). */ +export function toV2Detailed(app: TSApplication, opts: AnalysisOptions): ReturnType { + return finalizeAnalysis(app, opts); +} + +/** Historical name: native app + options → schema-v2 Application (the wire). */ +export function toV2(app: TSApplication, opts: AnalysisOptions): V2Application { + return finalizeAnalysis(app, opts).application; +} diff --git a/src/utils/serialize.ts b/src/utils/serialize.ts index 0a68546..577a3df 100644 --- a/src/utils/serialize.ts +++ b/src/utils/serialize.ts @@ -2,8 +2,7 @@ import * as fs from "node:fs"; import * as path from "node:path"; import { boltWriter, buildSchemaDocument, project, renderCypher } from "../build/neo4j"; import type { AnalysisOptions } from "../options"; -import type { TSApplication } from "../schema"; -import { toV2, toV2Detailed } from "../schema/v2"; +import type { V2Application } from "../schema/v2"; import { Logger } from "./logging"; /** @@ -13,19 +12,18 @@ import { Logger } from "./logging"; * - neo4j: project the IR to a graph. With --neo4j-uri, push incrementally to a live DB over * Bolt; otherwise write a self-contained `/graph.cypher` snapshot. */ -export async function emit(app: TSApplication, opts: AnalysisOptions): Promise { +export async function emit(application: V2Application, opts: AnalysisOptions): Promise { if (opts.emit === "neo4j") { - await emitNeo4j(app, opts); + await emitNeo4j(application, opts); return; } - // schema v2: reshape the v1 model into the canonical additive-CPG tree before serializing. - const out = toV2(app, opts); + // The envelope IS the wire (finalizeAnalysis already stripped the internal fields) — write it. if (opts.output === null) { - process.stdout.write(JSON.stringify(out)); + process.stdout.write(JSON.stringify(application)); return; } fs.mkdirSync(opts.output, { recursive: true }); - fs.writeFileSync(path.join(opts.output, "analysis.json"), JSON.stringify(out)); + fs.writeFileSync(path.join(opts.output, "analysis.json"), JSON.stringify(application)); } /** @@ -42,10 +40,9 @@ export function emitSchema(opts: AnalysisOptions): void { fs.writeFileSync(path.join(opts.output, "schema.json"), doc); } -async function emitNeo4j(app: TSApplication, opts: AnalysisOptions): Promise { - // Second projection of the SAME v2 tree the JSON path emits. --emit neo4j forces full depth - // (cli.ts), so `app` carries the L4 dataflow and the projected graph is the complete CPG. - const { application } = toV2Detailed(app, opts); +async function emitNeo4j(application: V2Application, opts: AnalysisOptions): Promise { + // Second projection of the SAME v2 envelope the JSON path emits. --emit neo4j forces full depth + // (cli.ts), so the envelope carries the L4 dataflow and the projected graph is the complete CPG. const appId = application.application.id; const rows = project(application, appId); diff --git a/test/anonymous-callables.test.ts b/test/anonymous-callables.test.ts index e1a677c..4423cd6 100644 --- a/test/anonymous-callables.test.ts +++ b/test/anonymous-callables.test.ts @@ -13,7 +13,7 @@ import { describe, expect, test } from "bun:test"; import * as path from "node:path"; import { analyze } from "../src/core"; import type { AnalysisOptions } from "../src/options"; -import { type V2Callable, type V2Module, type V2Node, toV2Detailed } from "../src/schema/v2"; +import type { V2Callable, V2Module, V2Node } from "../src/schema/v2"; import { project } from "../src/build/neo4j"; const FIXTURE = path.resolve(import.meta.dir, "fixtures/anon-app"); @@ -44,7 +44,7 @@ function options(level: number): AnalysisOptions { } const opts = options(4); -const { application, idBySig, collisions, dangling } = toV2Detailed(await analyze(opts), opts); +const { application, idBySig, collisions, dangling } = await analyze(opts); const root = application.application; const mod = root.symbol_table["src/routes.ts"] as V2Module; const fns = mod.functions as Record; diff --git a/test/dataflow.test.ts b/test/dataflow.test.ts index 155c23a..dacbdf1 100644 --- a/test/dataflow.test.ts +++ b/test/dataflow.test.ts @@ -43,7 +43,7 @@ function options(level: 1 | 2 | 3, cacheDir: string, jobs: number): AnalysisOpti async function run(level: 1 | 2 | 3, jobs = 1): Promise>> { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-dataflow-test-")); try { - return await analyze(options(level, cacheDir, jobs)); + return (await analyze(options(level, cacheDir, jobs))).internal; } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } diff --git a/test/external-resolution.test.ts b/test/external-resolution.test.ts index 180915d..86a957e 100644 --- a/test/external-resolution.test.ts +++ b/test/external-resolution.test.ts @@ -48,7 +48,7 @@ function options(): AnalysisOptions { async function run(): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-ext-test-")); try { - return await analyze({ ...options(), cacheDir }); + return (await analyze({ ...options(), cacheDir })).internal; } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } diff --git a/test/multi-tsconfig.test.ts b/test/multi-tsconfig.test.ts index bc73fdd..7084748 100644 --- a/test/multi-tsconfig.test.ts +++ b/test/multi-tsconfig.test.ts @@ -51,7 +51,7 @@ function options(): AnalysisOptions { async function run(): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-multitsconfig-test-")); try { - return await analyze({ ...options(), cacheDir }); + return (await analyze({ ...options(), cacheDir })).internal; } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } diff --git a/test/native-rewrite-goldens.test.ts b/test/native-rewrite-goldens.test.ts index 30dd0c9..5d941b1 100644 --- a/test/native-rewrite-goldens.test.ts +++ b/test/native-rewrite-goldens.test.ts @@ -20,7 +20,6 @@ import * as path from "node:path"; import { analyze } from "../src/core"; import type { AnalysisOptions } from "../src/options"; import { renderCypher, project } from "../src/build/neo4j"; -import { toV2Detailed } from "../src/schema/v2"; const GOLDEN_DIR = path.resolve(import.meta.dir, "goldens"); const REGEN = !!process.env["GOLDEN_REGEN"]; @@ -68,8 +67,7 @@ async function capture(fixture: string, level: number): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-golden-")); try { const opts = { ...options(fixture, level), cacheDir }; - const app = await analyze(opts); - const { application } = toV2Detailed(app, opts); + const { application } = await analyze(opts); const cypher = level === 4 ? renderCypher(project(application, application.application.id), application.application.id).split("\n").sort() diff --git a/test/neo4j-bolt.test.ts b/test/neo4j-bolt.test.ts index dfbdce0..177cee7 100644 --- a/test/neo4j-bolt.test.ts +++ b/test/neo4j-bolt.test.ts @@ -93,7 +93,7 @@ containerSuite("neo4j bolt writer", () => { "full push materializes the whole graph + schema", async () => { const opts = optsFor(); - const rows = project(toV2(await analyze(opts), opts)); + const rows = project((await analyze(opts)).application); await boltWriter(rows, cfg, log, true); // Every projected node/edge lands (the fixture has no library deps, so endpoints all resolve). @@ -133,7 +133,7 @@ containerSuite("neo4j bolt writer", () => { "re-pushing identical analysis is idempotent", async () => { const opts = optsFor(); - const rows = project(toV2(await analyze(opts), opts)); + const rows = project((await analyze(opts)).application); await boltWriter(rows, cfg, log, true); expect(await num("MATCH (n) RETURN count(n)")).toBe(rows.nodes.length); expect(await num("MATCH ()-[r]->() RETURN count(r)")).toBe(rows.edges.length); @@ -145,7 +145,7 @@ containerSuite("neo4j bolt writer", () => { "a full run prunes a module whose source vanished", async () => { const opts = optsFor(); - const app = await analyze(opts); + const app = (await analyze(opts)).internal; const victim = Object.keys(app.symbol_table).sort()[0]; delete app.symbol_table[victim]; @@ -182,7 +182,7 @@ containerSuite("neo4j bolt writer", () => { // A full current-version push against the same DB must detect the mismatch and wipe the residue. const opts = optsFor(); - const rows = project(toV2(await analyze(opts), opts)); + const rows = project((await analyze(opts)).application); await boltWriter(rows, cfg, log, true); // Exactly one :Application survives — the fresh v2 one (id set, version bumped). The 1.x app, diff --git a/test/neo4j-schema.test.ts b/test/neo4j-schema.test.ts index 9192a76..02417b7 100644 --- a/test/neo4j-schema.test.ts +++ b/test/neo4j-schema.test.ts @@ -19,7 +19,6 @@ import { } from "../src/build/neo4j"; import { analyze } from "../src/core"; import type { AnalysisOptions } from "../src/options"; -import { toV2Detailed } from "../src/schema/v2"; const FIXTURE = path.resolve(import.meta.dir, "fixtures/dataflow-app"); @@ -34,7 +33,7 @@ async function fixtureRows() { noBuild: true, phantoms: true, callGraphProvider: "union", cacheDir, verbosity: 0, }; try { - return project(toV2Detailed(await analyze(opts), opts).application); + return project((await analyze(opts)).application); } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } diff --git a/test/schema-v2.test.ts b/test/schema-v2.test.ts index 35ddc1d..25d8320 100644 --- a/test/schema-v2.test.ts +++ b/test/schema-v2.test.ts @@ -47,7 +47,7 @@ function options(): AnalysisOptions { async function run(): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-v2-test-")); try { - return await analyze({ ...options(), cacheDir }); + return (await analyze({ ...options(), cacheDir })).internal; } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } @@ -245,7 +245,7 @@ describe("schema v2 — L1 skips the call-graph solve (issue #31)", () => { const spy = spyOn(tscProvider, "build"); const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-v2-l1-guard-")); try { - const v1L1 = await analyze({ ...options(), analysisLevel: 1, callGraphProvider: "tsc", cacheDir }); + const v1L1 = (await analyze({ ...options(), analysisLevel: 1, callGraphProvider: "tsc", cacheDir })).internal; expect(spy).not.toHaveBeenCalled(); expect(v1L1.call_graph).toEqual([]); expect(Object.keys(v1L1.external_symbols)).toEqual([]); @@ -260,7 +260,7 @@ describe("schema v2 — L1 skips the call-graph solve (issue #31)", () => { const spy = spyOn(tscProvider, "build"); const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-v2-l1-guard-l2-")); try { - const v1L2guard = await analyze({ ...options(), analysisLevel: 2, callGraphProvider: "tsc", cacheDir }); + const v1L2guard = (await analyze({ ...options(), analysisLevel: 2, callGraphProvider: "tsc", cacheDir })).internal; expect(spy).toHaveBeenCalledTimes(1); expect(v1L2guard.call_graph.length).toBeGreaterThan(0); } finally { @@ -274,7 +274,7 @@ describe("schema v2 — L1 skips the call-graph solve (issue #31)", () => { async function runL2(): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-v2-l2-")); try { - return await analyze({ ...options(), analysisLevel: 2, cacheDir }); + return (await analyze({ ...options(), analysisLevel: 2, cacheDir })).internal; } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } @@ -338,7 +338,7 @@ function dfOptions(level: 3 | 4): AnalysisOptions { async function runDF(level: 3 | 4): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), `cants-v2-l${level}-`)); try { - return await analyze({ ...dfOptions(level), cacheDir }); + return (await analyze({ ...dfOptions(level), cacheDir })).internal; } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } @@ -563,8 +563,7 @@ function optsAt(level: 1 | 2 | 3 | 4): AnalysisOptions { async function appAt(level: 1 | 2 | 3 | 4): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-mono-")); try { - const v1run = await analyze({ ...optsAt(level), cacheDir }); - return toV2Detailed(v1run, optsAt(level)).application; + return (await analyze({ ...optsAt(level), cacheDir })).application; } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } From de01d464fa98c8ac195b21a2599d6e88f687ec16 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 26 Aug 2026 18:36:03 -0400 Subject: [PATCH 5/8] =?UTF-8?q?refactor(schema)!:=20teardown=20=E2=80=94?= =?UTF-8?q?=20one=20model=20family,=20terminal=20TS*=20names=20(#96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stage 4 (internal-only breaking surface; the wire is unchanged): - src/schema/v2/ is gone. schema.ts now also holds the wire envelope (TSAnalysis), the application root (TSApplication — python's PyApplication analog), and the wire edge shapes (TSCallGraphEdge, TSParamEdge). The internal working set is AnalysisInternal. - toV2/toV2Detailed shims retired; finalizeAnalysis(app, pg, opts) is the one pass-runner, and the program-graph IR rides AnalysisResult instead of the application aggregate. - The Neo4j projection reads typed fields (no more V2Node attribute probing); prop semantics preserved bit-for-bit (goldens). - The analysis cache stores only the id-free tree (the write-only cached call_graph is dropped). - CLAUDE.md architecture/dir-map rewritten for the native model (also carries the pending caveman-compression of the guide); the local SCHEMA_DECISIONS.md gains the native-model decision table. Wire-stable: 12 goldens deep-equal; full suite + typecheck green. --- CLAUDE.md | 212 +++++++++++++++++++------------------ src/build/neo4j/project.ts | 90 +++++++--------- src/build/neo4j/schema.ts | 2 +- src/core.ts | 16 ++- src/dataflow/attach.ts | 16 +-- src/schema/assignIds.ts | 4 +- src/schema/emit.ts | 25 ++--- src/schema/heritage.ts | 4 +- src/schema/homing.ts | 6 +- src/schema/l1Body.ts | 4 +- src/schema/l2Callees.ts | 15 +-- src/schema/schema.ts | 59 ++++++++++- src/schema/v2/index.ts | 19 ---- src/schema/v2/model.ts | 82 -------------- src/utils/cache.ts | 3 +- src/utils/serialize.ts | 6 +- 16 files changed, 251 insertions(+), 312 deletions(-) delete mode 100644 src/schema/v2/index.ts delete mode 100644 src/schema/v2/model.ts diff --git a/CLAUDE.md b/CLAUDE.md index ce21910..6565c84 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,82 +4,89 @@ Agent guidance for `codellm-devkit/codeanalyzer-typescript` (`cants`). ## What this project is -`cants` is a TypeScript/JavaScript static analyzer built on the TypeScript compiler -(via [ts-morph](https://ts-morph.com/)). It is the CLDK TypeScript backend: it emits -the **canonical schema v2** — one additive Code Property Graph — in **two projections**, -`analysis.json` and a **Neo4j** property graph. It mirrors its +`cants` = TypeScript/JavaScript static analyzer built on TypeScript compiler +(via [ts-morph](https://ts-morph.com/)). CLDK TypeScript backend: emits +**canonical schema v2** — one additive Code Property Graph — in **two projections**, +`analysis.json` and **Neo4j** property graph. Mirrors [Python](https://github.com/codellm-devkit/codeanalyzer-python) and [Java](https://github.com/codellm-devkit/codeanalyzer-java) sibling analyzers, so -output-shape parity with them is a first-class concern. +output-shape parity with them first-class concern. ## Schema v2 — the additive CPG (read this before touching output) -The output is **one scale-free structure**: a containment tree of nodes (id / kind / -`span` / children) with **typed edge overlays** (a CPG). Every classic artifact — symbol -table, call graph, CFG, PDG, SDG — is a *projection* of that one structure, and analysis -**levels** are how deeply it is populated (each level only ever *adds*, never rewrites): +Output = **one scale-free structure**: containment tree of nodes (id / kind / +`span` / children) with **typed edge overlays** (CPG). Every classic artifact — symbol +table, call graph, CFG, PDG, SDG — is *projection* of that one structure. Analysis +**levels** = how deep it populated (each level only *adds*, never rewrites): -- **L1** (`-a 1`): the tree to callable depth — `application → symbol_table{module} → +- **L1** (`-a 1`): tree to callable depth — `application → symbol_table{module} → types{}/functions{}/fields{} → callables{}` — plus `call` nodes in each callable's - `body{}` (with `callee` unresolved). `source` is stored once per module; every node's + `body{}` (`callee` unresolved). `source` stored once per module; every node's text slices off it via `span.bytes`. -- **L2** (`-a 2`): the `call_graph` edge list (callable→callable) at the application scope, - and the `callee` slot on each call node refined `null → id` (the one sanctioned mutation). -- **L3** (`-a 3`): the rest of `body{}` (statements + `@entry`/`@exit`) and the intra-callable +- **L2** (`-a 2`): `call_graph` edge list (callable→callable) at application scope, + and `callee` slot on each call node refined `null → id` (only sanctioned mutation). +- **L3** (`-a 3`): rest of `body{}` (statements + `@entry`/`@exit`) and intra-callable edge lists `cfg`/`cdg`/`ddg` (reaching-definitions, `prov:["reaching-defs"]`) hung on each callable. -- **L4** (`-a 4`): the synthetic `@formal_in:N`/`@formal_out`/`/actual_in:N`/`/actual_out` - vertices, the intra-caller `summary` edges, and the application-scope `param_in`/`param_out` - lists (the interprocedural SDG). +- **L4** (`-a 4`): synthetic `@formal_in:N`/`@formal_out`/`/actual_in:N`/`/actual_out` + vertices, intra-caller `summary` edges, and application-scope `param_in`/`param_out` + lists (interprocedural SDG). -**Identity is two-tier**: durable `can://////` ids at callable +**Identity two-tier**: durable `can://////` ids at callable depth and above; ordinal `@:` (or `@`) below. Intra-callable edge lists use **bare local ids**; cross-callable lists use **fully-qualified `can://…@local`** -ids. `L1 ⊆ L2 ⊆ L3 ⊆ L4` is a CI-checkable monotonicity gate (`test/schema-v2.test.ts`). The -model + every decision live in `.claude/SCHEMA_DECISIONS.md` (§ "Schema v2 migration") and the +ids. `L1 ⊆ L2 ⊆ L3 ⊆ L4` = CI-checkable monotonicity gate (`test/schema-v2.test.ts`). +Model + every decision live in `.claude/SCHEMA_DECISIONS.md` (§ "Schema v2 migration") and skillset's `canonical-schema.md`. -**Provider/client boundary:** the analyzer is a *pure graph provider* — it emits the graph -substrate (CFG/PDG/SDG + `summary` edges) and stops. Slicing and taint are reachability -*queries* over it and belong to the frontend SDK; never add a `taint_flows` section here. - -The v1→v2 emitter is a pure transform in **`src/schema/v2/`** (`emit.ts` reshapes the v1 -in-memory model, `dataflow.ts` maps `program_graphs` into the tree) — the parse/resolve/ -dataflow *compute* is untouched; only serialization is v2. - -The call graph defaults to the **union** of two backends: the TS compiler's resolver -and the embedded [Jelly](https://github.com/cs-au-dk/jelly) flow analyzer (which -recovers higher-order/callback edges the resolver misses). Merged edges keep a +**Provider/client boundary:** analyzer = *pure graph provider* — emits graph +substrate (CFG/PDG/SDG + `summary` edges) and stops. Slicing and taint = reachability +*queries* over it, belong to frontend SDK; never add `taint_flows` section here. + +Schema v2 = **native model** (#96): stages build v2 tree directly (`src/schema/schema.ts`, +one model family — no v1 model, no emit-time reshape). Per-run passes stamp derived +layers (python parity): `assignIds` (can:// ids — per-run because ids embed `--app-name` +while cache round-trips tree), `l1Body` (`call_sites` → `body{}`), `heritage`, +`homing` + `l2Callees` (L2), `dataflow/attach` (L3/L4). `finalizeAnalysis` +(`src/schema/emit.ts`) runs them + assembles envelope + strips INTERNAL fields +(`call_sites`, `abs_path`, cache trio). + +Call graph defaults to **union** of two backends: TS compiler resolver +and embedded [Jelly](https://github.com/cs-au-dk/jelly) flow analyzer (recovers +higher-order/callback edges resolver misses). Merged edges keep `provenance` tag (`tsc` / `jelly`); `--tsc-only` or `--call-graph-provider jelly` -selects one alone. +picks one alone. ## Architecture — follow the pipeline -The whole analyzer is one orchestration function: `analyze()` in `src/core.ts`. Read -it first; everything else is a stage it calls, in order: +Whole analyzer = one orchestration function: `analyze()` in `src/core.ts`. Read +it first; everything else is stage it calls, in order: -1. **materialize** (`src/build`) — resolve/prepare the target project's deps. +1. **materialize** (`src/build`) — resolve/prepare target project deps. 2. **buildSymbolTable** (`src/syntactic_analysis`) — modules, classes, interfaces, - enums, type aliases, namespaces, functions, methods, variables, decorators, and + enums, type aliases, namespaces, functions, methods, variables, decorators, JSDoc, with precise source spans. 3. **call graph** (`src/semantic_analysis`) — `selectProvider()` picks tsc / jelly / union; each provider returns edges + external (phantom) symbols. 4. **program graphs** (`src/dataflow`) — levels 3–4 (`-a 3`/`-a 4`): CFG → post-dominance/CDG → - access-path def-use → PDG → SCC-condensed bottom-up summaries → SDG. This is the *compute*; - it produces the internal `program_graphs` model, which `src/schema/v2/dataflow.ts` then maps - **into the v2 tree** (`body{}` + `cfg`/`cdg`/`ddg`/`summary` per callable + `param_in`/ - `param_out`). Decisions: `.claude/SCHEMA_DECISIONS.md`; contract + staged follow-ups: issue #2. -5. **cache** (`src/utils/cache.ts`) — content-hash cache under `.codeanalyzer/`, so - re-analysis only touches what changed (levels 3–4 also record summaries + - dependency edges in `graphs_summaries.json`). -6. **output** (`src/schema/v2`, `src/build/neo4j`) — `src/schema/v2/emit.ts` reshapes the v1 - compute model into the schema-v2 `analysis.json`; `src/build/neo4j` projects the *same* v2 - tree into a `graph.cypher` snapshot or an incremental Bolt push. `--emit neo4j` is always - **full-depth** (levels gate the JSON path only; combining `-a`/`--graphs` with it is an error). - -The **output** shape is schema v2 (`src/schema/v2/model.ts`, `V2Application` the top type); the -types in `src/schema` (`TSApplication`) are the *internal compute model* the emitter transforms. -The Neo4j schema (`src/build/neo4j/schema.ts`, v2.0.0) is versioned and enforced by a conformance -test — treat both as contracts and keep them in lockstep with the JSON. + access-path def-use → PDG → SCC-condensed bottom-up summaries → SDG. This is *compute* + (IR in `src/schema/graphs.ts`); `src/dataflow/attach.ts` writes it **onto tree** + (`body{}` + `cfg`/`cdg`/`ddg`/`summary` per callable + `param_in`/`param_out`). + Decisions: `.claude/SCHEMA_DECISIONS.md`; contract + staged follow-ups: issue #2. +5. **cache** (`src/utils/cache.ts`) — content-hash cache under `.codeanalyzer/`; stores + **id-free** builder tree only (ids/body/heritage = per-run layers; levels 3–4 also + record summaries + dependency edges in `graphs_summaries.json`). +6. **finalize + output** — `finalizeAnalysis` (`src/schema/emit.ts`, called by `analyze()`) + runs pass spine, returns `AnalysisResult` {`application` (wire `TSAnalysis` envelope), + `internal`, `program_graphs`, gates}; `src/utils/serialize.ts` writes envelope verbatim; + `src/build/neo4j` projects *same* envelope into `graph.cypher` snapshot or incremental + Bolt push. `--emit neo4j` always **full-depth** (levels gate JSON path only; combining + `-a`/`--graphs` with it = error). + +**Output** shape = schema v2 (`src/schema/schema.ts`: `TSAnalysis` envelope → +`TSApplication` root → `TSModule`/`TSType`/`TSCallable`/`TSField`/`TSBodyNode`). +Same types = the model stages build; INTERNAL fields never reach wire. +Neo4j schema (`src/build/neo4j/schema.ts`) versioned and enforced by conformance +test — treat both as contracts, keep in lockstep with JSON. ## Directory map @@ -90,36 +97,35 @@ test — treat both as contracts and keep them in lockstep with the JSON. | `src/options` | Parsed CLI options / `AnalysisOptions` | | `src/syntactic_analysis` | Symbol table (ts-morph traversal) | | `src/semantic_analysis` | Call-graph providers (tsc, jelly, union), phantoms | -| `src/dataflow` | L3/L4 program-graph **compute**: CFG, dominance/CDG, def-use, summaries, SDG | -| `src/schema` | `TSApplication` — the internal compute model + `signatureOf` + `program_graphs` | -| `src/schema/v2` | **the schema-v2 emitter**: `model.ts` (target shape) + `emit.ts` (tree/L1/L2) + `dataflow.ts` (L3/L4) | +| `src/dataflow` | L3/L4 program-graph **compute** (CFG, dominance/CDG, def-use, summaries, SDG) + `attach.ts` (IR → tree) | +| `src/schema` | **the native v2 model** (`schema.ts`) + per-run passes (`assignIds`/`l1Body`/`heritage`/`homing`/`l2Callees`) + `emit.ts` (`finalizeAnalysis`) + `signatureOf` + graphs IR | | `src/build` | Dep materialization; `build/neo4j` = the v2 graph projection (project/rows/cypher/bolt/schema) | -| `src/utils` | fs, caching, logging, serialization (`serialize.ts` → `toV2`), version | +| `src/utils` | fs, caching, logging, serialization (`serialize.ts` writes the envelope), version | | `test` | Bun tests + `fixtures/sample-app` + `fixtures/dataflow-app`; `schema-v2.test.ts` = the L1–L4 gates | ## Commands -- `bun run start -- --input /path/to/project` — run the analyzer from source. -- `bun run build` — compile the standalone `dist/cants` binary. +- `bun run start -- --input /path/to/project` — run analyzer from source. +- `bun run build` — compile standalone `dist/cants` binary. - `bun test` — run tests. Container tests: `bun run test:container` (needs Docker). - `bun run typecheck` — `tsc --noEmit`. - `bun run gen:schema` — regenerate `schema.neo4j.json`. -- `bun run gen:readme` — regenerate the README's `cants --help` block. +- `bun run gen:readme` — regenerate README's `cants --help` block. ## I implement features myself — you assist For feature work, **I write the implementation** to stay fluent in my own analyzer. -Act as a helper, not the author: +Act as helper, not author: -- **Don't write the feature code** or apply edits to implement it unless I explicitly +- **Don't write feature code** or apply edits to implement it unless I explicitly ask ("write this", "implement X", "apply it"). Default to guiding, not doing. -- **Do** move me fast: explain the relevant stage, point at prior art (e.g. an existing - call-graph provider in `src/semantic_analysis` as the template for a new one), sketch - signatures/types, outline an approach, and answer questions about the codebase. -- **Review on request:** when I share a diff or push, critique it — correctness, - **parity with the Python/Java backends**, schema conformance, missing tests, edge +- **Do** move me fast: explain relevant stage, point at prior art (e.g. existing + call-graph provider in `src/semantic_analysis` as template for new one), sketch + signatures/types, outline approach, answer questions about codebase. +- **Review on request:** when I share diff or push, critique it — correctness, + **parity with Python/Java backends**, schema conformance, missing tests, edge cases — and suggest concrete improvements. -- Scaffolding like tests or boilerplate is fine **when I ask**; otherwise leave the +- Scaffolding like tests or boilerplate fine **when I ask**; otherwise leave keyboard to me. - If you think I'm about to go wrong, say so briefly and let me decide — don't pre-empt by implementing the fix. @@ -127,63 +133,63 @@ Act as a helper, not the author: ## Rules 1. **Think before coding.** State assumptions explicitly; ask rather than guess. Push - back when a simpler approach exists. Stop when confused. -2. **Simplicity first.** Guide me toward the minimum idiomatic code that solves the + back when simpler approach exists. Stop when confused. +2. **Simplicity first.** Guide me toward minimum idiomatic code that solves the problem. Nothing speculative; no abstractions for single-use code. -3. **Issue → branch → work → PR.** Every change starts as an issue, on a branch named - `feat/issue-XXX`, `fix/issue-XXX`, `chore/issue-XXX`, and lands via a PR. +3. **Issue → branch → work → PR.** Every change starts as issue, on branch named + `feat/issue-XXX`, `fix/issue-XXX`, `chore/issue-XXX`, lands via PR. 4. **Guard the contract.** Changes to `src/schema` or Neo4j output must keep parity - with the sibling analyzers and pass the schema conformance test. + with sibling analyzers and pass schema conformance test. ## Goal-driven execution, as a teaching loop -Success is measured by the sole fact that **I understand it**. The success criterion: -I can point to the exact line of code where any feature lives, however remote or +Success measured by sole fact that **I understand it**. Success criterion: +I can point to exact line of code where any feature lives, however remote or obscure, and explain why it's there and how it behaves. -To that end, be my teacher and a Socratic one — not an answer key: +To that end, be my teacher and Socratic one — not answer key: -- Lead with questions that make me derive the answer; don't hand me the solution. -- Verify understanding, not just behavior — have me locate and explain the relevant - LOC, walk edge cases, and predict what a change would do before running it. -- Teach, help improve, and strengthen the weak spots you surface; circle back to them. -- The loop closes when I can **teach it back** and place every feature on a line, not - merely when the tests pass. -- Over the session, frequently — but not so much that I am stymied — ask spaced - repetition questions so concepts are internalized. +- Lead with questions that make me derive answer; don't hand me solution. +- Verify understanding, not just behavior — have me locate and explain relevant + LOC, walk edge cases, predict what change would do before running it. +- Teach, help improve, strengthen weak spots you surface; circle back to them. +- Loop closes when I can **teach it back** and place every feature on a line, not + merely when tests pass. +- Over session, frequently — but not so much that I am stymied — ask spaced + repetition questions so concepts internalized. -Learning progress is tracked globally, not per-repo: see the SRS deck and the +Learning progress tracked globally, not per-repo: see SRS deck and "continual learning" defaults in `~/.claude/CLAUDE.md`. # Auxiliary support tasks ## Tidy up the release announcement -Every `vX.Y.Z` tag makes the release workflow (`.github/workflows/release.yml`) -auto-post an announcement to the **Announcements** discussion (this repo, and the -org mirror in `codellm-devkit/.github`). That body is machine-generated from the -release notes / PR titles — it mis-categorizes changes, includes `chore(release)` -noise, and buries breaking changes. +Every `vX.Y.Z` tag makes release workflow (`.github/workflows/release.yml`) +auto-post announcement to **Announcements** discussion (this repo, and +org mirror in `codellm-devkit/.github`). That body machine-generated from +release notes / PR titles — mis-categorizes changes, includes `chore(release)` +noise, buries breaking changes. -When you're working in this repo, check whether the latest release's announcement +When working in this repo, check whether latest release's announcement still needs cleanup, and if so, fix it: 1. **Find it.** `gh release view --json tagName,publishedAt`; then list recent discussions via `gh api graphql` (repository → discussions), match category - `Announcements` and title `vX.Y.Z`. Keep the discussion node `id` and read its + `Announcements` and title `vX.Y.Z`. Keep discussion node `id`, read its `body`. -2. **Skip if already done.** If the body starts with `` (or already - reads as a clear, human-written announcement), do nothing. -3. **Otherwise rewrite it** into a clear, user-facing announcement, grounded in - `CHANGELOG.md` and the referenced PRs/diff (not the auto-grouping — verify each +2. **Skip if already done.** If body starts with `` (or already + reads as clear, human-written announcement), do nothing. +3. **Otherwise rewrite it** into clear, user-facing announcement, grounded in + `CHANGELOG.md` and referenced PRs/diff (not auto-grouping — verify each change; never invent anything): - - **breaking changes first**, each with a one-line migration step; - - plain-language highlights (what it does, not the PR title); + - **breaking changes first**, each with one-line migration step; + - plain-language highlights (what it does, not PR title); - upgrade lines — `pip install -U "codeanalyzer-typescript==X.Y.Z"`, or - `brew upgrade codellm-devkit/homebrew-tap/codeanalyzer-typescript`, or the + `brew upgrade codellm-devkit/homebrew-tap/codeanalyzer-typescript`, or shell installer one-liner; - - links to the GitHub release and `CHANGELOG.md`. -4. **Update in place.** Edit the discussion body with the GraphQL `updateDiscussion` - mutation (don't open a new one), prepend ``, and mirror the same - body to the org discussion. This task only reads code and edits Discussions — it - makes no commits. + - links to GitHub release and `CHANGELOG.md`. +4. **Update in place.** Edit discussion body with GraphQL `updateDiscussion` + mutation (don't open new one), prepend ``, mirror same + body to org discussion. This task only reads code and edits Discussions — makes + no commits. diff --git a/src/build/neo4j/project.ts b/src/build/neo4j/project.ts index a51fb6f..6c217f1 100644 --- a/src/build/neo4j/project.ts +++ b/src/build/neo4j/project.ts @@ -1,16 +1,16 @@ /** - * project() — the pure projection from the schema-v2 additive-CPG tree (`V2Application`) to graph + * project() — the pure projection from the schema-v2 additive-CPG tree (`TSAnalysis`) to graph * rows. It walks the uniform tree (module → types/functions/fields → callables → body) emitting one * graph node per tree/body node keyed on its `can://` id, containment as HAS_x / DECLARES edges, and * every typed overlay (call_graph, cfg/cdg/ddg/summary, param_in/param_out) as a typed relationship. * No I/O: the writers (cypher snapshot / bolt incremental) consume the returned `GraphRows`. * - * The graph is a second projection of the SAME v2 shape the JSON path emits (serialize.ts → toV2), + * The graph is a second projection of the SAME v2 envelope the JSON path emits (finalizeAnalysis), * so JSON and graph never diverge. Every project-owned node carries `_module` (its owning file key, * for the incremental writer's per-module isolation); shared nodes (External) carry none. */ -import type { V2Application, V2BodyNode, V2Callable, V2External, V2Field, V2Module, V2Node, V2Root, V2Type } from "../../schema/v2"; +import type { TSAnalysis, TSApplication, TSBodyNode, TSCallable, TSField, TSModule, TSType } from "../../schema"; import { SCHEMA_VERSION } from "./schema"; import { type GraphRows, type NodeRef, type Props, RowBuilder, prune } from "./rows"; @@ -41,9 +41,9 @@ const KIND_LABEL: Record = { function_expression: "TSCallable", }; -export function project(app: V2Application, _appName?: string): GraphRows { +export function project(app: TSAnalysis, _appName?: string): GraphRows { const b = new RowBuilder(); - const root: V2Root = app.application; + const root: TSApplication = app.application; const appRef = b.node(["Application", "TSApplication"], "id", root.id, prune({ id: root.id, @@ -67,19 +67,19 @@ export function project(app: V2Application, _appName?: string): GraphRows { } // External library targets (shared nodes — no _module). - for (const ext of Object.values((root.external_symbols ?? {}) as Record)) { + for (const ext of Object.values(root.external_symbols ?? {})) { b.node([CAN, "TSExternal"], "id", ext.id, prune({ id: ext.id, kind: "external", name: ext.name, module: ext.module })); } // 2.1.0: `synthesized_callables` is mostly a compatibility index (old id → tree id) whose targets // are already projected as tree nodes. Only the residual fallback entries — a signature no // provider could name, recognisable because the map key IS the entry's own id — still need a // standalone node, so call-graph edges pointing at them do not dangle. - for (const [key, sc] of Object.entries((root.synthesized_callables ?? {}) as Record)) { + for (const [key, sc] of Object.entries(root.synthesized_callables ?? {})) { if (key !== sc.id) continue; b.node([CAN, "TSAnonymousCallable"], "id", sc.id, prune({ - id: sc.id, kind: "callable", name: str(sc.name), path: str(sc.path), - start_line: spanLine(sc, "start"), start_column: spanCol(sc, "start"), - _module: str(sc.path), + id: sc.id, kind: "callable", name: sc.name ?? null, path: sc.path ?? null, + start_line: sc.span?.start?.[0] ?? null, start_column: sc.span?.start?.[1] ?? null, + _module: sc.path ?? null, })); } @@ -96,13 +96,13 @@ export function project(app: V2Application, _appName?: string): GraphRows { // ---------------------------------------------------------------------------------------------- /** Walk a scope's child maps (module OR namespace: types + functions + fields). */ -function projectScope(b: RowBuilder, scope: V2Module | V2Type, parent: NodeRef, fileKey: string): void { +function projectScope(b: RowBuilder, scope: TSModule | TSType, parent: NodeRef, fileKey: string): void { for (const t of Object.values(scope.types ?? {})) projectType(b, t, parent, fileKey); for (const c of Object.values(scope.functions ?? {})) projectCallable(b, c, parent, "TS_DECLARES", fileKey); for (const f of Object.values(scope.fields ?? {})) projectField(b, f, parent, fileKey); } -function projectType(b: RowBuilder, t: V2Type, parent: NodeRef, fileKey: string): void { +function projectType(b: RowBuilder, t: TSType, parent: NodeRef, fileKey: string): void { const label = KIND_LABEL[t.kind] ?? "TSClass"; const node = b.node([CAN, label], "id", t.id, typeProps(t, fileKey)); b.edge("TS_DECLARES", parent, node); @@ -121,7 +121,7 @@ function projectType(b: RowBuilder, t: V2Type, parent: NodeRef, fileKey: string) /** An unnamed callable's signature ends with the positional segment `contributorName` gives it. */ const ANON_SIG = /\.$/; -function projectCallable(b: RowBuilder, c: V2Callable, owner: NodeRef, ownerRel: string, fileKey: string): void { +function projectCallable(b: RowBuilder, c: TSCallable, owner: NodeRef, ownerRel: string, fileKey: string): void { // An unnamed callable carries :TSAnonymousCallable alongside :TSCallable — one node, two labels, // reached by ordinary containment. That is what keeps pre-2.1.0 MATCH (:TSAnonymousCallable) // queries working and puts these nodes on the snapshot wipe's containment walk (issue #75). @@ -152,9 +152,9 @@ function projectCallable(b: RowBuilder, c: V2Callable, owner: NodeRef, ownerRel: for (const t of Object.values(c.types ?? {})) projectType(b, t, node, fileKey); } -function projectField(b: RowBuilder, f: V2Field, owner: NodeRef, fileKey: string): void { +function projectField(b: RowBuilder, f: TSField, owner: NodeRef, fileKey: string): void { const node = b.node([CAN, "TSField"], "id", f.id, prune({ - id: f.id, kind: "field", name: str(f.name), type: str((f as unknown as V2Node).type), ...span(f), _module: fileKey, + id: f.id, kind: "field", name: f.name, type: f.type ?? null, ...span(f), _module: fileKey, })); b.edge("TS_HAS_FIELD", owner, node); } @@ -163,40 +163,42 @@ function projectField(b: RowBuilder, f: V2Field, owner: NodeRef, fileKey: string // property flattening (v2 node attrs → Neo4j-legal scalars/arrays) // ---------------------------------------------------------------------------------------------- -function moduleProps(mod: V2Module, fileKey: string): Props { +function moduleProps(mod: TSModule, fileKey: string): Props { + // The wire strips the internal fields (module_name, content_hash) — the graph name is the + // file key, exactly as the historical projection of the stripped tree produced. return prune({ - id: mod.id, kind: "module", name: str((mod as unknown as V2Node).module_name) ?? fileKey, - is_tsx: bool((mod as unknown as V2Node).is_tsx), is_declaration_file: bool((mod as unknown as V2Node).is_declaration_file), - content_hash: str((mod as unknown as V2Node).content_hash), ...span(mod), _module: fileKey, + id: mod.id, kind: "module", name: fileKey, + is_tsx: mod.is_tsx, is_declaration_file: mod.is_declaration_file, + ...span(mod), _module: fileKey, }); } -function typeProps(t: V2Type, fileKey: string): Props { +function typeProps(t: TSType, fileKey: string): Props { return prune({ - id: t.id, kind: t.kind, signature: str(t.signature), name: str((t as unknown as V2Node).name), - base_classes: strArr((t as unknown as V2Node).base_classes), implements_types: strArr((t as unknown as V2Node).implements_types), - aliased_type: str((t as unknown as V2Node).aliased_type), - is_abstract: bool((t as unknown as V2Node).is_abstract), is_const: bool((t as unknown as V2Node).is_const), - is_exported: bool((t as unknown as V2Node).is_exported), is_ambient: bool((t as unknown as V2Node).is_ambient), + id: t.id, kind: t.kind, signature: t.signature, name: t.name, + base_classes: strArr(t.base_classes), implements_types: strArr(t.implements_types), + aliased_type: t.aliased_type ?? null, + is_abstract: t.is_abstract ?? null, is_const: t.is_const ?? null, + is_exported: t.is_exported, is_ambient: t.is_ambient, ...span(t), }); } -function callableProps(c: V2Callable, fileKey: string): Props { +function callableProps(c: TSCallable, fileKey: string): Props { return prune({ - id: c.id, kind: c.kind, signature: str(c.signature), name: str((c as unknown as V2Node).name), - return_type: str((c as unknown as V2Node).return_type), cyclomatic_complexity: num((c as unknown as V2Node).cyclomatic_complexity), - accessibility: str((c as unknown as V2Node).accessibility), accessor_kind: str((c as unknown as V2Node).accessor_kind), - is_static: bool((c as unknown as V2Node).is_static), is_abstract: bool((c as unknown as V2Node).is_abstract), - is_async: bool((c as unknown as V2Node).is_async), is_generator: bool((c as unknown as V2Node).is_generator), - is_exported: bool((c as unknown as V2Node).is_exported), is_ambient: bool((c as unknown as V2Node).is_ambient), - is_implicit: bool((c as unknown as V2Node).is_implicit), ...span(c), _module: fileKey, + id: c.id, kind: c.kind, signature: c.signature, name: c.name, + return_type: c.return_type ?? null, cyclomatic_complexity: c.cyclomatic_complexity, + accessibility: c.accessibility ?? null, accessor_kind: c.accessor_kind ?? null, + is_static: c.is_static, is_abstract: c.is_abstract, + is_async: c.is_async, is_generator: c.is_generator, + is_exported: c.is_exported, is_ambient: c.is_ambient, + is_implicit: c.is_implicit, ...span(c), _module: fileKey, }); } -function bodyProps(bn: V2BodyNode, id: string, fileKey: string): Props { +function bodyProps(bn: TSBodyNode, id: string, fileKey: string): Props { return prune({ - id, kind: bn.kind, of: str(bn.of), parent: str(bn.parent), + id, kind: bn.kind, of: bn.of ?? null, parent: bn.parent ?? null, callee: typeof bn.callee === "string" ? bn.callee : null, ...span(bn), _module: fileKey, }); } @@ -217,7 +219,7 @@ const edges = (x: unknown): Edge[] => (Array.isArray(x) ? (x as Edge[]) : []); /** A cross-edge endpoint is already the graph node's can:// id — pass it through unchanged. */ const idOf = (endpoint: string): string => endpoint; -function moduleKeyOf(mod: V2Module): string { +function moduleKeyOf(mod: TSModule): string { // id = can:////; the fileKey is everything after the 3rd '/' past the scheme. const m = /^can:\/\/[^/]+\/[^/]+\/(.+)$/.exec(mod.id); return m ? (m[1] as string) : mod.id; @@ -227,17 +229,5 @@ function span(n: { span?: { start: [number, number]; end: [number, number] } }): if (!n.span) return {}; return { start_line: n.span.start?.[0], end_line: n.span.end?.[0] }; } -function spanLine(n: V2Node, which: "start" | "end"): number | undefined { - const s = n.span as { start?: [number, number]; end?: [number, number] } | undefined; - return s?.[which]?.[0]; -} -function spanCol(n: V2Node, which: "start" | "end"): number | undefined { - const s = n.span as { start?: [number, number]; end?: [number, number] } | undefined; - return s?.[which]?.[1]; -} - -// value coercion (v2 attrs are `unknown`; Neo4j props must be scalars / homogeneous arrays) -const str = (v: unknown): string | null => (typeof v === "string" ? v : null); -const num = (v: unknown): number | null => (typeof v === "number" ? v : null); -const bool = (v: unknown): boolean | null => (typeof v === "boolean" ? v : null); -const strArr = (v: unknown): string[] | null => (Array.isArray(v) && v.every((x) => typeof x === "string") && v.length ? (v as string[]) : null); +// A present-but-empty string list is a non-fact in the graph (matches the historical projection). +const strArr = (v: string[] | undefined): string[] | null => (v && v.length ? v : null); diff --git a/src/build/neo4j/schema.ts b/src/build/neo4j/schema.ts index d3be823..acb7f1d 100644 --- a/src/build/neo4j/schema.ts +++ b/src/build/neo4j/schema.ts @@ -170,7 +170,7 @@ export const REL_TYPES: RelType[] = [ { type: "TS_SUMMARY", from: ["TSBodyNode"], to: ["TSBodyNode"], properties: { var: "string" } }, { type: "TS_PARAM_IN", from: ["TSBodyNode"], to: ["TSBodyNode"], properties: { var: "string" } }, { type: "TS_PARAM_OUT", from: ["TSBodyNode"], to: ["TSBodyNode"], properties: { var: "string" } }, - // Inheritance, projected from the `extends_ids`/`implements_ids` node props (schema/v2/emit.ts) — + // Inheritance, projected from the `extends_ids`/`implements_ids` node props (the heritage pass, schema/heritage.ts) — // resolved-only: an unresolved (external/library) supertype never reaches here. A `to` of `TSClass` // covers TS's `implements SomeClass` (structural, not just interfaces); an interface may itself // `extends` a class's instance type, hence `TS_EXTENDS` also allows a `TSInterface` source. diff --git a/src/core.ts b/src/core.ts index 2031863..5355e86 100644 --- a/src/core.ts +++ b/src/core.ts @@ -4,7 +4,7 @@ import { mergeCallGraphs, selectProvider } from "./semantic_analysis"; import { loadCache, saveCache } from "./utils"; import { materialize } from "./build"; import type { AnalysisOptions } from "./options"; -import type { TSApplication } from "./schema"; +import type { AnalysisInternal } from "./schema"; import { type AnalysisResult, finalizeAnalysis } from "./schema/emit"; import { buildSymbolTable } from "./syntactic_analysis"; import { Logger } from "./utils"; @@ -43,8 +43,8 @@ export async function analyze(opts: AnalysisOptions): Promise { const extraction = opts.analysisLevel >= 3 ? startExtraction(project, symbol_table, mat.tsConfigFilePath, opts, log) : null; // Call graph via the selected provider (union of tsc+jelly by default; --tsc-only / jelly opt-in). - // Only worth running at level >= 2: the v2 emitter discards call_graph/external_symbols/ - // synthesized_callables at -a 1 (homeExternals/homeSynthesized in src/schema/v2/emit.ts are + // Only worth running at level >= 2: finalizeAnalysis discards call_graph/external_symbols/ + // synthesized_callables at -a 1 (homeExternals/homeSynthesized in src/schema/emit.ts are // gated to `level >= 2`), so running the solve — including the heavier Jelly leg — at -a 1 // would compute a result that's thrown away. Levels 3/4 need the provider for callee // resolution and are always >= 2, so this gate is safe. @@ -71,7 +71,7 @@ export async function analyze(opts: AnalysisOptions): Promise { } const call_graph = cg.edges; - const app: TSApplication = { + const app: AnalysisInternal = { symbol_table, call_graph, external_symbols: cg.external_symbols, @@ -80,12 +80,10 @@ export async function analyze(opts: AnalysisOptions): Promise { // Level 3 join: stages 5–7 (summary wavefront + SDG) consume the extraction AND the // provider-backfilled callee signatures. Strictly flag-gated so -a 1/-a 2 cost nothing. - if (extraction) { - app.program_graphs = await buildProgramGraphs(extraction, symbol_table, opts, log); - } + const pg = extraction ? await buildProgramGraphs(extraction, symbol_table, opts, log) : null; // Cache the id-free base (ids/body/heritage are per-run layers stamped by finalizeAnalysis; // the cached tree must stay --app-name-free). - saveCache(cacheDir, { symbol_table, call_graph }); - return finalizeAnalysis(app, opts); + saveCache(cacheDir, { symbol_table }); + return finalizeAnalysis(app, pg, opts); } diff --git a/src/dataflow/attach.ts b/src/dataflow/attach.ts index 4a7978d..ceea6a9 100644 --- a/src/dataflow/attach.ts +++ b/src/dataflow/attach.ts @@ -12,17 +12,17 @@ * * A pure relabel of what the analyzer already computed — no re-analysis. See * .claude/SCHEMA_DECISIONS.md § "Schema v2 migration" and dataflow-graphs.md. - * Node-kind mapping (grounded in the v1 model): + * Node-kind mapping (grounded in the compute IR, schema/graphs.ts): * entry→'@entry', exit→'@exit' (also '@formal_out' as a PARAM_OUT/formal-out anchor), * param→contracted out of the L3 CFG; '@formal_in:N' at L4, statement→'line:col'. */ import type { CfgEdge, GraphNode, PdgEdge, ProgramGraphs } from "../schema/graphs"; -import type { V2Callable, V2ParamEdge, V2Root } from "../schema/v2/model"; +import type { TSApplication, TSCallable, TSParamEdge } from "../schema"; interface LocalIds { canId: string; - callable: V2Callable; + callable: TSCallable; stmtLocal: Map; // entry/exit/statement node id → body local id paramN: Map; // param node id → declaration index N paramName: Map; // param node id → the `of` name @@ -30,7 +30,7 @@ interface LocalIds { } /** Build the per-callable node_id→local-id maps (single source-of-truth for every edge rewrite). */ -function buildLocalIds(canId: string, callable: V2Callable, nodes: GraphNode[]): LocalIds { +function buildLocalIds(canId: string, callable: TSCallable, nodes: GraphNode[]): LocalIds { const stmtLocal = new Map(); const paramN = new Map(); const paramName = new Map(); @@ -131,7 +131,7 @@ function emitL3(li: LocalIds, nodes: GraphNode[], cfgEdges: CfgEdge[] | undefine // L4 — synthetic vertices + summary (callable) + param_in/param_out (application) // ---------------------------------------------------------------------------------------------- -function emitL4(root: V2Root, pg: ProgramGraphs, info: Map): void { +function emitL4(root: TSApplication, pg: ProgramGraphs, info: Map): void { // Formal vertices + the deferred formal-out-routing ddg edges, per callable. for (const [sig, fg] of Object.entries(pg.functions)) { const li = info.get(sig); @@ -227,10 +227,10 @@ function emitL4(root: V2Root, pg: ProgramGraphs, info: Map): v * `callableBySig` locates each callable's v2 node (populated during the L1 walk). */ export function applyDataflow( - root: V2Root, + root: TSApplication, pg: ProgramGraphs, idBySig: Map, - callableBySig: Map, + callableBySig: Map, level: number, ): void { if (level < 3) return; @@ -277,6 +277,6 @@ function cmp3(a: { src: string; dst: string; kind: string }, b: { src: string; d function cmpDdg(a: { src: string; dst: string; var?: string }, b: { src: string; dst: string; var?: string }): number { return cmp2(a, b) || (a.var ?? "").localeCompare(b.var ?? ""); } -function cmpEdgeVar(a: V2ParamEdge, b: V2ParamEdge): number { +function cmpEdgeVar(a: TSParamEdge, b: TSParamEdge): number { return a.src.localeCompare(b.src) || a.dst.localeCompare(b.dst) || (a.var ?? "").localeCompare(b.var ?? ""); } diff --git a/src/schema/assignIds.ts b/src/schema/assignIds.ts index a40a463..e493c11 100644 --- a/src/schema/assignIds.ts +++ b/src/schema/assignIds.ts @@ -9,7 +9,7 @@ */ import { applicationIdOf, idFromSig, memberKey, moduleIdOf, modulePrefixOf } from "./ids"; -import type { TSApplication, TSCallable, TSField, TSType } from "./schema"; +import type { AnalysisInternal, TSCallable, TSField, TSType } from "./schema"; export interface AssignedIds { appId: string; @@ -18,7 +18,7 @@ export interface AssignedIds { collisions: string[]; // signatures that mapped to two distinct ids (L1 id-uniqueness gate) } -export function assignIds(app: TSApplication, appName: string): AssignedIds { +export function assignIds(app: AnalysisInternal, appName: string): AssignedIds { const appId = applicationIdOf(appName); const idBySig = new Map(); const callableBySig = new Map(); diff --git a/src/schema/emit.ts b/src/schema/emit.ts index 5f7d9ad..4ba933e 100644 --- a/src/schema/emit.ts +++ b/src/schema/emit.ts @@ -18,14 +18,14 @@ import * as path from "node:path"; import type { AnalysisOptions } from "../options"; import { ANALYZER_VERSION } from "../utils/version"; -import type { TSApplication } from "./schema"; +import type { AnalysisInternal, TSAnalysis, TSApplication } from "./schema"; +import type { ProgramGraphs } from "./graphs"; import { assignIds } from "./assignIds"; import { populateL1Body } from "./l1Body"; import { resolveHeritageIds } from "./heritage"; import { homeExternals, homeSynthesized } from "./homing"; import { backfillCallees, reidentifyCallGraph } from "./l2Callees"; import { applyDataflow } from "../dataflow/attach"; -import type { V2Application, V2Root } from "./v2/model"; const LANGUAGE = "typescript"; const SCHEMA_VERSION = "2.1.0"; @@ -41,14 +41,15 @@ const INTERNAL_KEYS = new Set(["call_sites", "abs_path", "content_hash", // ---------------------------------------------------------------------------------------------- export interface AnalysisResult { - application: V2Application; // the wire: deep, internal-field-stripped envelope - internal: TSApplication; // the live internal aggregate (tree + sig-keyed provider outputs + program_graphs) + application: TSAnalysis; // the wire: deep, internal-field-stripped envelope + internal: AnalysisInternal; // the live internal working set (tree + sig-keyed provider outputs) + program_graphs?: ProgramGraphs; // the L3/L4 compute IR (already attached onto the wire tree) idBySig: Map; // signature → can:// id (real callables + externals + synthesized) collisions: string[]; // signatures that mapped to two distinct ids (L1 id-uniqueness gate) dangling: string[]; // call-graph endpoints with no id home (L2 no-dangling gate; should be empty) } -export function finalizeAnalysis(app: TSApplication, opts: AnalysisOptions): AnalysisResult { +export function finalizeAnalysis(app: AnalysisInternal, pg: ProgramGraphs | null, opts: AnalysisOptions): AnalysisResult { const level = opts.analysisLevel; const appName = (opts.appName ?? (opts.input ? path.basename(opts.input) : "") ?? "").trim() || "app"; @@ -57,7 +58,7 @@ export function finalizeAnalysis(app: TSApplication, opts: AnalysisOptions): Ana populateL1Body(app); resolveHeritageIds(app, idBySig); - const root: V2Root = { id: appId, kind: "application", symbol_table: app.symbol_table, call_graph: [], param_in: [], param_out: [] }; + const root: TSApplication = { id: appId, kind: "application", symbol_table: app.symbol_table, call_graph: [], param_in: [], param_out: [] }; // L2 — home the off-tree edge endpoints, backfill `callee`, re-identify the call graph. const dangling: string[] = []; @@ -70,12 +71,12 @@ export function finalizeAnalysis(app: TSApplication, opts: AnalysisOptions): Ana // L3/L4 — grow body{} + cfg/cdg/ddg/summary on callables and param_in/param_out on the app. let k_limit: number | undefined; - if (level >= 3 && app.program_graphs) { - applyDataflow(root, app.program_graphs, idBySig, callableBySig, level); - k_limit = app.program_graphs.k_limit; + if (level >= 3 && pg) { + applyDataflow(root, pg, idBySig, callableBySig, level); + k_limit = pg.k_limit; } - const envelope: V2Application = { + const envelope: TSAnalysis = { schema_version: SCHEMA_VERSION, language: LANGUAGE, max_level: Math.min(level, MAX_IMPLEMENTED), @@ -86,6 +87,6 @@ export function finalizeAnalysis(app: TSApplication, opts: AnalysisOptions): Ana // The wire copy: deep, detached from the live tree, internal fields stripped by key. const application = JSON.parse( JSON.stringify(envelope, (key, value) => (INTERNAL_KEYS.has(key) ? undefined : value)), - ) as V2Application; - return { application, internal: app, idBySig, collisions, dangling }; + ) as TSAnalysis; + return { application, internal: app, ...(pg ? { program_graphs: pg } : {}), idBySig, collisions, dangling }; } diff --git a/src/schema/heritage.ts b/src/schema/heritage.ts index fc42b83..0b36ca9 100644 --- a/src/schema/heritage.ts +++ b/src/schema/heritage.ts @@ -7,7 +7,7 @@ * previous run under another app name are recomputed; unresolvable sets are deleted). */ -import type { TSApplication, TSModule, TSType } from "./schema"; +import type { AnalysisInternal, TSModule, TSType } from "./schema"; import { forEachType } from "./schema"; function resolve(sigs: string[], idBySig: Map): string[] { @@ -30,7 +30,7 @@ function doType(t: TSType, idBySig: Map): void { if (implementsIds.length) t.implements_ids = implementsIds; } -export function resolveHeritageIds(app: TSApplication, idBySig: Map): void { +export function resolveHeritageIds(app: AnalysisInternal, idBySig: Map): void { for (const mod of Object.values(app.symbol_table) as TSModule[]) { forEachType(mod, (t) => doType(t, idBySig)); } diff --git a/src/schema/homing.ts b/src/schema/homing.ts index 4ca88c1..7eea938 100644 --- a/src/schema/homing.ts +++ b/src/schema/homing.ts @@ -11,7 +11,7 @@ * the call-graph re-identification (l2Callees.ts). */ -import type { TSApplication, TSSpan } from "./schema"; +import type { AnalysisInternal, TSSpan } from "./schema"; /** A call target outside the project (an imported library member / builtin) — an edge endpoint, not a tree node. */ export interface TSExternalNode { @@ -31,7 +31,7 @@ export interface TSSynthesizedNode { } /** External library call targets → `can://…/@external//` ids on the application root. */ -export function homeExternals(app: TSApplication, appId: string, idBySig: Map): Record { +export function homeExternals(app: AnalysisInternal, appId: string, idBySig: Map): Record { const out: Record = {}; for (const [sig, ext] of Object.entries(app.external_symbols ?? {})) { const id = `${appId}/@external/${ext.module}/${ext.name}`; @@ -59,7 +59,7 @@ export function homeExternals(app: TSApplication, appId: string, idBySig: Map): Record { +export function homeSynthesized(app: AnalysisInternal, appId: string, idBySig: Map): Record { const out: Record = {}; for (const [sig, id] of [...idBySig.entries()]) { const m = /^(.*?)((?:\.)+)$/.exec(sig); diff --git a/src/schema/l1Body.ts b/src/schema/l1Body.ts index d46d453..903c562 100644 --- a/src/schema/l1Body.ts +++ b/src/schema/l1Body.ts @@ -9,7 +9,7 @@ * the whole pass chain idempotent across repeated emissions at different levels. */ -import type { TSApplication, TSBodyNode, TSCallable, TSCallsite, TSModule } from "./schema"; +import type { AnalysisInternal, TSBodyNode, TSCallable, TSCallsite, TSModule } from "./schema"; import { forEachCallable } from "./schema"; /** @@ -58,7 +58,7 @@ function resetCallable(c: TSCallable): void { delete c.summary; } -export function populateL1Body(app: TSApplication): void { +export function populateL1Body(app: AnalysisInternal): void { for (const mod of Object.values(app.symbol_table) as TSModule[]) { forEachCallable(mod, resetCallable); } diff --git a/src/schema/l2Callees.ts b/src/schema/l2Callees.ts index d92a431..7ab3fa0 100644 --- a/src/schema/l2Callees.ts +++ b/src/schema/l2Callees.ts @@ -10,11 +10,11 @@ * (the L2 no-dangling gate; should be empty) and their edges dropped. */ -import type { TSApplication, TSCallEdge, TSModule } from "./schema"; +import type { AnalysisInternal, TSCallEdge, TSCallGraphEdge, TSModule } from "./schema"; import { forEachCallable } from "./schema"; import { callBodyKeys } from "./l1Body"; -export function backfillCallees(app: TSApplication, idBySig: Map): void { +export function backfillCallees(app: AnalysisInternal, idBySig: Map): void { for (const mod of Object.values(app.symbol_table) as TSModule[]) { forEachCallable(mod, (c) => { for (const [key, cs] of callBodyKeys(c.call_sites)) { @@ -27,19 +27,12 @@ export function backfillCallees(app: TSApplication, idBySig: Map } } -export interface WireCallEdge { - src: string; - dst: string; - prov: string[]; - weight: number; -} - export function reidentifyCallGraph( edges: TSCallEdge[], idBySig: Map, dangling: string[], -): WireCallEdge[] { - const out: WireCallEdge[] = []; +): TSCallGraphEdge[] { + const out: TSCallGraphEdge[] = []; for (const e of edges) { const src = idBySig.get(e.source); const dst = idBySig.get(e.target); diff --git a/src/schema/schema.ts b/src/schema/schema.ts index c11bfc7..7587bb0 100644 --- a/src/schema/schema.ts +++ b/src/schema/schema.ts @@ -365,13 +365,66 @@ export interface TSSynthesizedCallable { start_column: number; } -export interface TSApplication { +/** + * The analyzer's INTERNAL working set: the live tree plus the signature-keyed provider outputs. + * `finalizeAnalysis` consumes it and assembles the wire (`TSAnalysis`); it is never serialized + * itself. (The program-graph IR travels separately — see AnalysisResult.) + */ +export interface AnalysisInternal { symbol_table: Record; call_graph: TSCallEdge[]; external_symbols: Record; synthesized_callables: Record; - /** Level-3 CFG/PDG/SDG section — present only at `-a 3` (see schema/graphs.ts). */ - program_graphs?: import("./graphs").ProgramGraphs; +} + +// ---------------------------------------------------------------------------------------------- +// The wire: envelope → application root → cross-callable edges (what analysis.json IS, and what +// the Neo4j projection consumes) +// ---------------------------------------------------------------------------------------------- + +export interface TSAnalysis { + schema_version: string; // "2.1.0" + language: string; // "typescript" + max_level: number; // highest level populated; consumers read this, not key-sniffing + k_limit?: number; // access-path depth bound for the L3/L4 dataflow (present at L3+) + analyzer: TSAnalyzer; // which analyzer produced this artifact, and at what version + application: TSApplication; +} + +/** Analyzer identity — lets consumers correlate an `analysis.json` with the tool/version that emitted it. */ +export interface TSAnalyzer { + name: string; // "codeanalyzer-typescript" + version: string; // ANALYZER_VERSION (src/utils/version.ts) +} + +/** The application ROOT node (python's PyApplication): the containment tree + app-scope overlays. */ +export interface TSApplication { + id: string; // can:/// + kind: "application"; + symbol_table: Record; // keyed by project-relative POSIX path (with extension) + call_graph: TSCallGraphEdge[]; // L2 — callable → callable (empty at L1) + param_in: TSParamEdge[]; // L4 (empty until L4) + param_out: TSParamEdge[]; // L4 + // TS-additive (parity): edge endpoints outside the containment tree need an id home. + external_symbols?: Record; // L2 — library call targets, keyed by id + // L2 — 2.1.0 compatibility index: pre-2.1.0 anonymous-callable id → the tree id that replaced + // it. Entries whose key equals their own `id` are the residual fallback nodes for signatures no + // provider could name. + synthesized_callables?: Record; +} + +/** A wire call-graph edge: identity-only, can:// endpoints (l2Callees re-identifies onto these). */ +export interface TSCallGraphEdge { + src: string; + dst: string; + prov: string[]; // provenance, e.g. ["tsc"], ["jelly"] + weight: number; +} + +export interface TSParamEdge { + src: string; + dst: string; + var?: string; } // ---------------------------------------------------------------------------------------------- diff --git a/src/schema/v2/index.ts b/src/schema/v2/index.ts deleted file mode 100644 index dec4ca7..0000000 --- a/src/schema/v2/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Transition shim (#96): the emitter moved to src/schema/emit.ts (finalizeAnalysis, run by -// analyze()) and the L3/L4 attach to src/dataflow/attach.ts. These re-exports keep the historical -// v2 import paths and names alive until the Stage-4 teardown retires them. -export * from "./model"; -export { finalizeAnalysis, type AnalysisResult, type AnalysisResult as ToV2Result } from "../emit"; -import type { AnalysisOptions } from "../../options"; -import type { TSApplication } from "../schema"; -import { finalizeAnalysis } from "../emit"; -import type { V2Application } from "./model"; - -/** Historical name for the pass-runner (idempotent — safe to re-run on an analyzed tree). */ -export function toV2Detailed(app: TSApplication, opts: AnalysisOptions): ReturnType { - return finalizeAnalysis(app, opts); -} - -/** Historical name: native app + options → schema-v2 Application (the wire). */ -export function toV2(app: TSApplication, opts: AnalysisOptions): V2Application { - return finalizeAnalysis(app, opts).application; -} diff --git a/src/schema/v2/model.ts b/src/schema/v2/model.ts deleted file mode 100644 index 45d7f2c..0000000 --- a/src/schema/v2/model.ts +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Schema v2 — the wire envelope + application root, and the historical `V2*` names for the tree - * node types. The tree shapes themselves are the NATIVE model in `../schema.ts` (the stages - * build them directly); this file adds only what exists at serialization scope: the envelope, - * the assembled root, and the cross-callable edge shapes. - * - * The `V2*` aliases keep the projection/tests compiling during the native-model transition - * (#96); the Stage-4 teardown folds this file into `../schema.ts` and retires the aliases. - */ - -import type { TSCallable, TSField, TSModule, TSSpan, TSType } from "../schema"; -import type { TSBodyNode } from "../schema"; -import type { TSExternalNode, TSSynthesizedNode } from "../homing"; -import type { WireCallEdge } from "../l2Callees"; - -/** The one universal attribute. `bytes` are char offsets into the owning module's `source`. */ -export type Span = TSSpan; - -// ---------------------------------------------------------------------------------------------- -// Root -// ---------------------------------------------------------------------------------------------- - -export interface V2Application { - schema_version: string; // "2.1.0" - language: string; // "typescript" - max_level: number; // highest level populated; consumers read this, not key-sniffing - k_limit?: number; // access-path depth bound for the L3/L4 dataflow (present at L3+) - analyzer: V2Analyzer; // which analyzer produced this artifact, and at what version - application: V2Root; -} - -/** Analyzer identity — lets consumers correlate an `analysis.json` with the tool/version that emitted it. */ -export interface V2Analyzer { - name: string; // "codeanalyzer-typescript" - version: string; // ANALYZER_VERSION (src/utils/version.ts) -} - -export interface V2Root { - id: string; // can:/// - kind: "application"; - symbol_table: Record; // keyed by project-relative POSIX path (with extension) - call_graph: WireCallEdge[]; // L2 — callable → callable (empty at L1) - param_in: V2ParamEdge[]; // L4 (empty until L4) - param_out: V2ParamEdge[]; // L4 - // TS-additive (parity): edge endpoints outside the containment tree need an id home. - external_symbols?: Record; // L2 — imported/library call targets, keyed by id - // L2 — 2.1.0 compatibility index: pre-2.1.0 anonymous-callable id → the tree id that replaced - // it. Anonymous callables are real nodes in the tree; entries whose key equals their own `id` - // are the residual fallback nodes for signatures no provider could name. - synthesized_callables?: Record; -} - -// ---------------------------------------------------------------------------------------------- -// Cross-callable edges (application scope) -// ---------------------------------------------------------------------------------------------- - -export type V2CallEdge = WireCallEdge; - -export interface V2ParamEdge { - src: string; - dst: string; - var?: string; -} - -// ---------------------------------------------------------------------------------------------- -// Historical names for the native tree types (transition aliases, retired at Stage 4) -// ---------------------------------------------------------------------------------------------- - -export type V2Module = TSModule; -export type V2Type = TSType; -export type V2Callable = TSCallable; -export type V2Field = TSField; -export type V2BodyNode = TSBodyNode; -export type V2External = TSExternalNode; - -/** A loosely-typed node view for consumers that probe optional attributes (the Neo4j projection). */ -export interface V2Node { - id: string; - kind: string; - span?: Span; - [attr: string]: unknown; -} diff --git a/src/utils/cache.ts b/src/utils/cache.ts index 7c1cff3..452c935 100644 --- a/src/utils/cache.ts +++ b/src/utils/cache.ts @@ -1,13 +1,12 @@ import * as fs from "node:fs"; import * as path from "node:path"; -import type { TSCallEdge, TSModule } from "../schema"; +import type { TSModule } from "../schema"; import { sha256 } from "./fs"; import { ANALYZER_VERSION } from "./version"; export interface CacheData { analyzer_version?: string; symbol_table: Record; - call_graph: TSCallEdge[]; } export function cacheFilePath(cacheDir: string): string { diff --git a/src/utils/serialize.ts b/src/utils/serialize.ts index 577a3df..95b9989 100644 --- a/src/utils/serialize.ts +++ b/src/utils/serialize.ts @@ -2,7 +2,7 @@ import * as fs from "node:fs"; import * as path from "node:path"; import { boltWriter, buildSchemaDocument, project, renderCypher } from "../build/neo4j"; import type { AnalysisOptions } from "../options"; -import type { V2Application } from "../schema/v2"; +import type { TSAnalysis } from "../schema"; import { Logger } from "./logging"; /** @@ -12,7 +12,7 @@ import { Logger } from "./logging"; * - neo4j: project the IR to a graph. With --neo4j-uri, push incrementally to a live DB over * Bolt; otherwise write a self-contained `/graph.cypher` snapshot. */ -export async function emit(application: V2Application, opts: AnalysisOptions): Promise { +export async function emit(application: TSAnalysis, opts: AnalysisOptions): Promise { if (opts.emit === "neo4j") { await emitNeo4j(application, opts); return; @@ -40,7 +40,7 @@ export function emitSchema(opts: AnalysisOptions): void { fs.writeFileSync(path.join(opts.output, "schema.json"), doc); } -async function emitNeo4j(application: V2Application, opts: AnalysisOptions): Promise { +async function emitNeo4j(application: TSAnalysis, opts: AnalysisOptions): Promise { // Second projection of the SAME v2 envelope the JSON path emits. --emit neo4j forces full depth // (cli.ts), so the envelope carries the L4 dataflow and the projected graph is the complete CPG. const appId = application.application.id; From 4bda9c1a7fa63223b72083e5a4f9d7366168591f Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 26 Aug 2026 18:36:04 -0400 Subject: [PATCH 6/8] test: re-point the suite at the terminal analyze() API (#96) analyze() returns AnalysisResult; tests read .application (wire), .internal (working set), .program_graphs (IR) instead of re-running the retired toV2/toV2Detailed shims. The v1-superset gate becomes the id- registration gate (its v1 premise no longer exists; completeness is carried by the transition goldens and the standing conformance gates). --- test/anonymous-callables.test.ts | 29 +++++------ test/dataflow.test.ts | 8 ++-- test/neo4j-bolt.test.ts | 7 +-- test/schema-v2.test.ts | 82 ++++++++++++++++---------------- test/synthesized-nodes.test.ts | 7 ++- 5 files changed, 67 insertions(+), 66 deletions(-) diff --git a/test/anonymous-callables.test.ts b/test/anonymous-callables.test.ts index 4423cd6..076416e 100644 --- a/test/anonymous-callables.test.ts +++ b/test/anonymous-callables.test.ts @@ -13,7 +13,8 @@ import { describe, expect, test } from "bun:test"; import * as path from "node:path"; import { analyze } from "../src/core"; import type { AnalysisOptions } from "../src/options"; -import type { V2Callable, V2Module, V2Node } from "../src/schema/v2"; +import type { TSCallable, TSModule } from "../src/schema"; +import type { TSSynthesizedNode } from "../src/schema/homing"; import { project } from "../src/build/neo4j"; const FIXTURE = path.resolve(import.meta.dir, "fixtures/anon-app"); @@ -46,13 +47,13 @@ function options(level: number): AnalysisOptions { const opts = options(4); const { application, idBySig, collisions, dangling } = await analyze(opts); const root = application.application; -const mod = root.symbol_table["src/routes.ts"] as V2Module; -const fns = mod.functions as Record; +const mod = root.symbol_table["src/routes.ts"] as TSModule; +const fns = mod.functions as Record; -const login = fns["login"] as V2Callable; -const handler = (login.callables ?? {})[""] as V2Callable; +const login = fns["login"] as TSCallable; +const handler = (login.callables ?? {})[""] as TSCallable; -/** Edge lists are typed `unknown[]` on V2Callable until the body-node model lands (roadmap #2). */ +/** Edge lists are typed `unknown[]` on TSCallable until the body-node model lands (roadmap #2). */ type Edge = { src: string; dst: string; var?: string }; const edges = (xs: unknown[] | undefined): Edge[] => (xs ?? []) as Edge[]; @@ -72,30 +73,30 @@ describe("anonymous callables are first-class (issue #92)", () => { }); test("a variable-bound arrow keeps its own name — no segment", () => { - expect((fns["named"] as V2Callable).signature).toBe("src/routes.named"); + expect((fns["named"] as TSCallable).signature).toBe("src/routes.named"); expect(Object.keys(fns)).not.toContain(""); }); test("a bare arrow in a module-level expression statement is materialized", () => { - const h = fns[""] as V2Callable; + const h = fns[""] as TSCallable; expect(h).toBeDefined(); expect(h.kind).toBe("arrow"); expect(edges(h.ddg).some((e) => e.var === "req.query.probe")).toBe(true); }); test("nested anonymous callables chain their segments", () => { - const outer = fns["outer"] as V2Callable; - const first = Object.values(outer.callables ?? {})[0] as V2Callable; - const second = Object.values(first.callables ?? {})[0] as V2Callable; + const outer = fns["outer"] as TSCallable; + const first = Object.values(outer.callables ?? {})[0] as TSCallable; + const second = Object.values(first.callables ?? {})[0] as TSCallable; expect(second.signature.match(//g)).toHaveLength(2); expect(second.id.startsWith(first.id)).toBe(true); }); test("call sites re-anchor from the enclosing callable to the arrow", () => { - const calleeOf = (c: V2Callable): unknown[] => + const calleeOf = (c: TSCallable): unknown[] => Object.values(c.body ?? {}).filter((n) => n.kind === "call").map((n) => n.callee); expect(calleeOf(login)).toEqual([]); - expect(calleeOf(handler)).toEqual([`${(fns["query"] as V2Callable).id}`]); + expect(calleeOf(handler)).toEqual([`${(fns["query"] as TSCallable).id}`]); const srcs = root.call_graph.map((e) => e.src); expect(srcs).toContain(handler.id); @@ -128,7 +129,7 @@ describe("anonymous callables are first-class (issue #92)", () => { }); test("synthesized_callables is a compatibility index onto the tree", () => { - const index = (root.synthesized_callables ?? {}) as Record; + const index = (root.synthesized_callables ?? {}) as Record; expect(index[`${login.id}@2:10`]?.id).toBe(handler.id); // Every entry either points at a tree node or is a residual fallback node keyed by its own id. for (const [key, entry] of Object.entries(index)) { diff --git a/test/dataflow.test.ts b/test/dataflow.test.ts index dacbdf1..a539472 100644 --- a/test/dataflow.test.ts +++ b/test/dataflow.test.ts @@ -41,16 +41,16 @@ function options(level: 1 | 2 | 3, cacheDir: string, jobs: number): AnalysisOpti } async function run(level: 1 | 2 | 3, jobs = 1): Promise>> { + // returns the full AnalysisResult — the program-graph IR rides on it, not on the tree const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-dataflow-test-")); try { - return (await analyze(options(level, cacheDir, jobs))).internal; + return await analyze(options(level, cacheDir, jobs)); } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } } -const app = await run(3); -const pg = app.program_graphs as ProgramGraphs; +const pg = (await run(3)).program_graphs as ProgramGraphs; const cfgOf = (sig: string): FunctionCfg => { const g = pg.functions[sig]?.cfg; @@ -380,7 +380,7 @@ describe("determinism and gating", () => { test("-a 1 emits no program_graphs section", async () => { const level1 = await run(1); expect(level1.program_graphs).toBeUndefined(); - expect(JSON.stringify(level1)).not.toContain("program_graphs"); + expect(JSON.stringify(level1.application)).not.toContain("program_graphs"); }); test("schema_version and k_limit are stamped", () => { diff --git a/test/neo4j-bolt.test.ts b/test/neo4j-bolt.test.ts index 177cee7..684f7c3 100644 --- a/test/neo4j-bolt.test.ts +++ b/test/neo4j-bolt.test.ts @@ -15,7 +15,7 @@ import neo4j, { type Driver } from "neo4j-driver"; import { type BoltConfig, boltWriter, CONSTRAINTS, INDEXES, project, SCHEMA_VERSION } from "../src/build/neo4j"; import { analyze } from "../src/core"; import type { AnalysisOptions } from "../src/options"; -import { toV2 } from "../src/schema/v2"; +import { finalizeAnalysis } from "../src/schema"; import { Logger } from "../src/utils"; const FIXTURE = path.resolve(import.meta.dir, "fixtures/sample-app"); @@ -145,11 +145,12 @@ containerSuite("neo4j bolt writer", () => { "a full run prunes a module whose source vanished", async () => { const opts = optsFor(); - const app = (await analyze(opts)).internal; + const result = await analyze(opts); + const app = result.internal; const victim = Object.keys(app.symbol_table).sort()[0]; delete app.symbol_table[victim]; - const rows = project(toV2(app, opts)); + const rows = project(finalizeAnalysis(app, result.program_graphs ?? null, opts).application); await boltWriter(rows, cfg, log, true); // The victim's nodes are gone. diff --git a/test/schema-v2.test.ts b/test/schema-v2.test.ts index 25d8320..eda00ce 100644 --- a/test/schema-v2.test.ts +++ b/test/schema-v2.test.ts @@ -12,8 +12,8 @@ import * as path from "node:path"; import pkg from "../package.json"; import { analyze } from "../src/core"; import type { AnalysisOptions } from "../src/options"; -import { forEachCallable, forEachType, type GraphSelector, type TSApplication } from "../src/schema"; -import { type V2Application, type V2Callable, type V2Module, type V2Type, toV2Detailed } from "../src/schema/v2"; +import { forEachCallable, forEachType, type GraphSelector } from "../src/schema"; +import type { AnalysisResult } from "../src/core"; import { type GraphRows, project } from "../src/build/neo4j"; import { tscProvider } from "../src/semantic_analysis"; @@ -44,36 +44,37 @@ function options(): AnalysisOptions { }; } -async function run(): Promise { +async function run(): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-v2-test-")); try { - return (await analyze({ ...options(), cacheDir })).internal; + return await analyze({ ...options(), cacheDir }); } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } } -const v1 = await run(); -const { application: v2, idBySig, collisions } = toV2Detailed(v1, { ...options(), input: FIXTURE }); +const result = await run(); +const v1 = result.internal; +const { application: v2, idBySig, collisions } = result; const root = v2.application; const st = root.symbol_table; /** Every id in the tree, in walk order, for uniqueness + well-formedness checks. */ function allIds(): string[] { const out: string[] = []; - const walkCallable = (c: V2Callable): void => { + const walkCallable = (c: TSCallable): void => { out.push(c.id); for (const cc of Object.values(c.callables ?? {})) walkCallable(cc); for (const t of Object.values(c.types ?? {})) walkType(t); }; - const walkType = (t: V2Type): void => { + const walkType = (t: TSType): void => { out.push(t.id); for (const c of Object.values(t.callables ?? {})) walkCallable(c); for (const f of Object.values(t.fields ?? {})) out.push(f.id); for (const st2 of Object.values(t.types ?? {})) walkType(st2); for (const fn of Object.values(t.functions ?? {})) walkCallable(fn); }; - for (const m of Object.values(st) as V2Module[]) { + for (const m of Object.values(st) as TSModule[]) { out.push(m.id); for (const t of Object.values(m.types)) walkType(t); for (const c of Object.values(m.functions)) walkCallable(c); @@ -121,7 +122,7 @@ describe("schema v2 — L1 identity", () => { }); test("module ids derive from the file key", () => { - for (const [key, m] of Object.entries(st) as [string, V2Module][]) { + for (const [key, m] of Object.entries(st) as [string, TSModule][]) { expect(m.id).toBe(`can://typescript/sample-app/${key}`); expect(m.kind).toBe("module"); } @@ -130,7 +131,7 @@ describe("schema v2 — L1 identity", () => { describe("schema v2 — L1 source & spans (get_method_body)", () => { test("each module carries its full source", () => { - for (const m of Object.values(st) as V2Module[]) expect(typeof m.source).toBe("string"); + for (const m of Object.values(st) as TSModule[]) expect(typeof m.source).toBe("string"); }); test("a callable's span.bytes slices its declaration out of module.source", () => { @@ -159,7 +160,7 @@ describe("schema v2 — L1 tree shape", () => { }); test("a callable's body holds L1 call nodes keyed by line:col with callee null", () => { - const create = st["src/services.ts"].types.UserService.callables?.create as V2Callable; + const create = st["src/services.ts"].types.UserService.callables?.create as TSCallable; const keys = Object.keys(create.body); expect(keys.length).toBeGreaterThan(0); for (const k of keys) expect(k).toMatch(/^\d+:\d+(\/\d+)?$/); @@ -271,16 +272,15 @@ describe("schema v2 — L1 skips the call-graph solve (issue #31)", () => { }); // ---- L2: call graph ------------------------------------------------------------------------- -async function runL2(): Promise { +async function runL2(): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-v2-l2-")); try { - return (await analyze({ ...options(), analysisLevel: 2, cacheDir })).internal; + return await analyze({ ...options(), analysisLevel: 2, cacheDir }); } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } } -const v1L2 = await runL2(); -const { application: v2L2, idBySig: idsL2, dangling: danglingL2 } = toV2Detailed(v1L2, { ...options(), analysisLevel: 2, input: FIXTURE }); +const { application: v2L2, idBySig: idsL2, dangling: danglingL2 } = await runL2(); const rootL2 = v2L2.application; const knownIds = new Set(idsL2.values()); @@ -303,7 +303,7 @@ describe("schema v2 — L2 call graph", () => { test("body call-node callees are backfilled to a known id (null → id refinement)", () => { let sawBackfill = false; - const scan = (c: V2Callable): void => { + const scan = (c: TSCallable): void => { for (const b of Object.values(c.body)) { if (b.kind === "call" && b.callee != null) { sawBackfill = true; @@ -335,24 +335,24 @@ const DF_FIXTURE = path.resolve(import.meta.dir, "fixtures/dataflow-app"); function dfOptions(level: 3 | 4): AnalysisOptions { return { ...options(), input: DF_FIXTURE, analysisLevel: level, graphs: level >= 4 ? ["cfg", "dfg", "pdg", "sdg"] : ["cfg", "dfg", "pdg"] }; } -async function runDF(level: 3 | 4): Promise { +async function runDF(level: 3 | 4): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), `cants-v2-l${level}-`)); try { - return (await analyze({ ...dfOptions(level), cacheDir })).internal; + return await analyze({ ...dfOptions(level), cacheDir }); } finally { fs.rmSync(cacheDir, { recursive: true, force: true }); } } /** Every callable node in the tree (module/type/namespace/nested recursion). */ -function allCallables(root: { symbol_table: Record }): V2Callable[] { - const out: V2Callable[] = []; - const wc = (c: V2Callable): void => { +function allCallables(root: { symbol_table: Record }): TSCallable[] { + const out: TSCallable[] = []; + const wc = (c: TSCallable): void => { out.push(c); for (const cc of Object.values(c.callables ?? {})) wc(cc); for (const t of Object.values(c.types ?? {})) wt(t); }; - const wt = (t: V2Type): void => { + const wt = (t: TSType): void => { for (const c of Object.values(t.callables ?? {})) wc(c); for (const st of Object.values(t.types ?? {})) wt(st); for (const fn of Object.values(t.functions ?? {})) wc(fn); @@ -364,8 +364,8 @@ function allCallables(root: { symbol_table: Record }): V2Calla return out; } -const dfL3 = toV2Detailed(await runDF(3), dfOptions(3)).application; -const dfL4 = toV2Detailed(await runDF(4), dfOptions(4)).application; +const dfL3 = (await runDF(3)).application; +const dfL4 = (await runDF(4)).application; /** No intra-callable (bare-local) or cross-callable (canId@local) endpoint may dangle. */ function danglingCount(app: typeof dfL3): number { @@ -435,7 +435,7 @@ describe("schema v2 — L3 intraprocedural dataflow", () => { test("a sampled L3 statement node is source-sliceable (span.bytes reproduces its text)", () => { const mod = dfL3.application.symbol_table["src/flow.ts"]; - const classify = mod.functions.classify as V2Callable; + const classify = mod.functions.classify as TSCallable; const stmt = classify.body["4:3"]; expect(stmt?.kind).toBe("statement"); const [s, e] = (stmt as { span: { bytes: [number, number] } }).span.bytes; @@ -448,7 +448,7 @@ describe("schema v2 — L3 intraprocedural dataflow", () => { // nodes (which slice out just their own text), entry/exit should reproduce the callable's // entire declaration, including its `export` modifier. const mod = dfL3.application.symbol_table["src/flow.ts"]; - const classify = mod.functions.classify as V2Callable; + const classify = mod.functions.classify as TSCallable; const entry = classify.body["@entry"]; const exit = classify.body["@exit"]; expect(entry?.kind).toBe("entry"); @@ -546,7 +546,7 @@ describe("schema v2 — L4 interprocedural SDG", () => { // ---- Real end-to-end monotonicity gate + Neo4j↔JSON count parity (issue #27) ------------------- // // `analyze()` run fresh at each of `-a 1/2/3/4` on dataflow-app (four full runs — the fixture is -// small), then the emitted V2Application at each level is reduced to three KEY-sets — symbol-table +// small), then the emitted TSAnalysis at each level is reduced to three KEY-sets — symbol-table // ids, body-node keys, and edge keys (call_graph / cfg / cdg / ddg / summary / param_in / param_out) // — and every level's set must be a superset of the level below (canonical-schema.md's additive // invariant). Comparing KEYS (not values) means the one sanctioned value mutation, a `call` node's @@ -560,7 +560,7 @@ function optsAt(level: 1 | 2 | 3 | 4): AnalysisOptions { return { ...options(), input: DF_FIXTURE, analysisLevel: level, graphs }; } -async function appAt(level: 1 | 2 | 3 | 4): Promise { +async function appAt(level: 1 | 2 | 3 | 4): Promise { const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-mono-")); try { return (await analyze({ ...optsAt(level), cacheDir })).application; @@ -570,14 +570,14 @@ async function appAt(level: 1 | 2 | 3 | 4): Promise { } /** Every symbol-table id — module/type/callable/field — recursing through nested scopes. */ -function symbolIds(app: V2Application): Set { +function symbolIds(app: TSAnalysis): Set { const out = new Set(); - const walkCallable = (c: V2Callable): void => { + const walkCallable = (c: TSCallable): void => { out.add(c.id); for (const cc of Object.values(c.callables ?? {})) walkCallable(cc); for (const t of Object.values(c.types ?? {})) walkType(t); }; - const walkType = (t: V2Type): void => { + const walkType = (t: TSType): void => { out.add(t.id); for (const c of Object.values(t.callables ?? {})) walkCallable(c); for (const f of Object.values(t.fields ?? {})) out.add(f.id); @@ -594,13 +594,13 @@ function symbolIds(app: V2Application): Set { } /** Every type node — classes/interfaces/enums/aliases/namespaces — recursing through nested scopes. */ -function allTypes(app: V2Application): V2Type[] { - const out: V2Type[] = []; - const walkCallable = (c: V2Callable): void => { +function allTypes(app: TSAnalysis): TSType[] { + const out: TSType[] = []; + const walkCallable = (c: TSCallable): void => { for (const cc of Object.values(c.callables ?? {})) walkCallable(cc); for (const t of Object.values(c.types ?? {})) walkType(t); }; - const walkType = (t: V2Type): void => { + const walkType = (t: TSType): void => { out.push(t); for (const c of Object.values(t.callables ?? {})) walkCallable(c); for (const nested of Object.values(t.types ?? {})) walkType(nested); @@ -614,7 +614,7 @@ function allTypes(app: V2Application): V2Type[] { } /** Every body-node key, namespaced by its owning callable id so bare local keys never collide. */ -function bodyKeys(app: V2Application): Set { +function bodyKeys(app: TSAnalysis): Set { const out = new Set(); for (const c of allCallables(app.application)) { for (const k of Object.keys(c.body)) out.add(`${c.id}::${k}`); @@ -623,7 +623,7 @@ function bodyKeys(app: V2Application): Set { } /** Every edge key: call_graph + param_in/param_out (app scope), cfg/cdg/ddg/summary (per callable). */ -function edgeKeys(app: V2Application): Set { +function edgeKeys(app: TSAnalysis): Set { const out = new Set(); const root = app.application; for (const e of root.call_graph) out.add(`call_graph::${e.src}>${e.dst}:${[...e.prov].sort().join(",")}`); @@ -649,7 +649,7 @@ const monoApp1 = await appAt(1); const monoApp2 = await appAt(2); const monoApp3 = await appAt(3); const monoApp4 = await appAt(4); -const monoPairs: Array<[V2Application, V2Application, string]> = [ +const monoPairs: Array<[TSAnalysis, TSAnalysis, string]> = [ [monoApp1, monoApp2, "L1 -> L2"], [monoApp2, monoApp3, "L2 -> L3"], [monoApp3, monoApp4, "L3 -> L4"], @@ -694,7 +694,7 @@ function relCount(rows: GraphRows, type: string): number { } /** Every id materialized as a `:CanNode` row: symbol-table ids + body-node fq ids + external/synth. */ -function canNodeIds(app: V2Application): Set { +function canNodeIds(app: TSAnalysis): Set { const ids = new Set(symbolIds(app)); for (const c of allCallables(app.application)) { for (const k of Object.keys(c.body)) ids.add(k.startsWith("@") ? `${c.id}${k}` : `${c.id}@${k}`); @@ -705,7 +705,7 @@ function canNodeIds(app: V2Application): Set { } /** Every `call` body node whose `callee` resolved to an id — the JSON-side source of RESOLVES_TO. */ -function resolvesToCount(app: V2Application): number { +function resolvesToCount(app: TSAnalysis): number { let n = 0; for (const c of allCallables(app.application)) { for (const bn of Object.values(c.body)) if (typeof bn.callee === "string") n++; diff --git a/test/synthesized-nodes.test.ts b/test/synthesized-nodes.test.ts index 0e13ed3..018cb88 100644 --- a/test/synthesized-nodes.test.ts +++ b/test/synthesized-nodes.test.ts @@ -7,8 +7,7 @@ import { describe, expect, test } from "bun:test"; import { project } from "../src/build/neo4j"; import type { AnalysisOptions } from "../src/options"; -import { CALL_DEP, type TSApplication, type TSCallable, type TSModule, type TSSpan } from "../src/schema"; -import { toV2Detailed } from "../src/schema/v2"; +import { CALL_DEP, type AnalysisInternal, type TSCallable, type TSModule, type TSSpan, finalizeAnalysis } from "../src/schema"; const ANON = "src/x.foo:<3:10>"; const SPAN: TSSpan = { start: [1, 1], end: [5, 1], bytes: [0, 10] }; @@ -16,7 +15,7 @@ const SPAN: TSSpan = { start: [1, 1], end: [5, 1], bytes: [0, 10] }; const callable = (signature: string, name: string): TSCallable => ({ signature, name, kind: "function", span: SPAN, parameters: [], call_sites: [], inner_callables: {}, inner_classes: {} }) as unknown as TSCallable; -const app: TSApplication = { +const app: AnalysisInternal = { symbol_table: { "src/x.ts": { module_name: "src/x", source: "", span: SPAN, @@ -30,7 +29,7 @@ const app: TSApplication = { }; const opts = { appName: "t", input: "", analysisLevel: 2 } as unknown as AnalysisOptions; -const { application, idBySig } = toV2Detailed(app, opts); +const { application, idBySig } = finalizeAnalysis(app, null, opts); const rows = project(application); const fooId = idBySig.get("src/x.foo") as string; From bf7219eec595316d81810ae3b64ae9c9bc0e3c96 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 26 Aug 2026 18:37:16 -0400 Subject: [PATCH 7/8] test(goldens): retire the transition harness (#96) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The rewrite is complete and wire-stability is proven; the deep-equal goldens and their gate leave with the transform they guarded. The standing schema conformance, monotonicity (L1⊆L2⊆L3⊆L4), and Neo4j gates carry coverage from here. --- test/goldens/anon-app-a1.json | 1 - test/goldens/anon-app-a2.json | 1 - test/goldens/anon-app-a3.json | 1 - test/goldens/anon-app-a4.json | 1 - test/goldens/anon-app.cypher | 269 ----- test/goldens/dataflow-app-a1.json | 1 - test/goldens/dataflow-app-a2.json | 1 - test/goldens/dataflow-app-a3.json | 1 - test/goldens/dataflow-app-a4.json | 1 - test/goldens/dataflow-app.cypher | 1303 ----------------------- test/goldens/sample-app-a1.json | 1 - test/goldens/sample-app-a2.json | 1 - test/goldens/sample-app-a3.json | 1 - test/goldens/sample-app-a4.json | 1 - test/goldens/sample-app.cypher | 1532 --------------------------- test/native-rewrite-goldens.test.ts | 99 -- 16 files changed, 3215 deletions(-) delete mode 100644 test/goldens/anon-app-a1.json delete mode 100644 test/goldens/anon-app-a2.json delete mode 100644 test/goldens/anon-app-a3.json delete mode 100644 test/goldens/anon-app-a4.json delete mode 100644 test/goldens/anon-app.cypher delete mode 100644 test/goldens/dataflow-app-a1.json delete mode 100644 test/goldens/dataflow-app-a2.json delete mode 100644 test/goldens/dataflow-app-a3.json delete mode 100644 test/goldens/dataflow-app-a4.json delete mode 100644 test/goldens/dataflow-app.cypher delete mode 100644 test/goldens/sample-app-a1.json delete mode 100644 test/goldens/sample-app-a2.json delete mode 100644 test/goldens/sample-app-a3.json delete mode 100644 test/goldens/sample-app-a4.json delete mode 100644 test/goldens/sample-app.cypher delete mode 100644 test/native-rewrite-goldens.test.ts diff --git a/test/goldens/anon-app-a1.json b/test/goldens/anon-app-a1.json deleted file mode 100644 index 74173e6..0000000 --- a/test/goldens/anon-app-a1.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/anon-app","kind":"application","symbol_table":{"src/routes.ts":{"source":"export function login() {\n return (req: any, res: any) => {\n const email = req.body.email;\n query(`SELECT * FROM Users WHERE email = '${email}'`);\n };\n}\n\nexport function query(sql: string) {\n return sql;\n}\n\nconst app: any = {};\napp.get(\"/health\", (req: any, res: any) => {\n res.send(req.query.probe);\n});\n\nconst named = () => 1;\n\nexport function outer() {\n return () => () => named();\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/anon-app/src/routes.ts","kind":"module","span":{"start":[1,1],"end":[22,1],"bytes":[0,398]},"types":{},"functions":{"login":{"name":"login","signature":"src/routes.login","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"(req: any, res: any) => void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.login.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":11,"end_column":19},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":21,"end_column":29}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login/","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]},"body":{"4:5":{"method_name":"query","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,5],"end":[4,58],"bytes":[99,152]},"callee":null}}}}},"query":{"name":"query","signature":"src/routes.query","comments":[],"decorators":[],"parameters":[{"name":"sql","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":23,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/query","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]},"body":{}},"outer":{"name":"outer","signature":"src/routes.outer","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => () => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer/","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer..","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer//","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]},"body":{}}}}}},"named":{"name":"named","signature":"src/routes.named","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/named","span":{"start":[17,7],"end":[17,22],"bytes":[322,337]},"body":{}},"":{"name":"(anonymous)","signature":"src/routes.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":21,"end_column":29},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":31,"end_column":39}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]},"body":{"14:3":{"method_name":"send","receiver_expr":"res","receiver_type":"any","argument_types":["any"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,28],"bytes":[284,309]},"callee":null}}}},"fields":{"app":{"name":"app","type":"any","initializer":"{}","scope":"module","declaration_kind":"const","is_readonly":true,"is_exported":false,"id":"can://typescript/anon-app/src/routes.ts/app","kind":"field","span":{"start":[12,7],"end":[12,20],"bytes":[222,235]}}}}},"call_graph":[],"param_in":[],"param_out":[]}} \ No newline at end of file diff --git a/test/goldens/anon-app-a2.json b/test/goldens/anon-app-a2.json deleted file mode 100644 index c31d8da..0000000 --- a/test/goldens/anon-app-a2.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/anon-app","kind":"application","symbol_table":{"src/routes.ts":{"source":"export function login() {\n return (req: any, res: any) => {\n const email = req.body.email;\n query(`SELECT * FROM Users WHERE email = '${email}'`);\n };\n}\n\nexport function query(sql: string) {\n return sql;\n}\n\nconst app: any = {};\napp.get(\"/health\", (req: any, res: any) => {\n res.send(req.query.probe);\n});\n\nconst named = () => 1;\n\nexport function outer() {\n return () => () => named();\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/anon-app/src/routes.ts","kind":"module","span":{"start":[1,1],"end":[22,1],"bytes":[0,398]},"types":{},"functions":{"login":{"name":"login","signature":"src/routes.login","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"(req: any, res: any) => void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.login.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":11,"end_column":19},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":21,"end_column":29}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login/","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]},"body":{"4:5":{"method_name":"query","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,5],"end":[4,58],"bytes":[99,152]},"callee":"can://typescript/anon-app/src/routes.ts/query"}}}}},"query":{"name":"query","signature":"src/routes.query","comments":[],"decorators":[],"parameters":[{"name":"sql","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":23,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/query","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]},"body":{}},"outer":{"name":"outer","signature":"src/routes.outer","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => () => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer/","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer..","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer//","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]},"body":{}}}}}},"named":{"name":"named","signature":"src/routes.named","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/named","span":{"start":[17,7],"end":[17,22],"bytes":[322,337]},"body":{}},"":{"name":"(anonymous)","signature":"src/routes.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":21,"end_column":29},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":31,"end_column":39}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]},"body":{"14:3":{"method_name":"send","receiver_expr":"res","receiver_type":"any","argument_types":["any"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,28],"bytes":[284,309]},"callee":null}}}},"fields":{"app":{"name":"app","type":"any","initializer":"{}","scope":"module","declaration_kind":"const","is_readonly":true,"is_exported":false,"id":"can://typescript/anon-app/src/routes.ts/app","kind":"field","span":{"start":[12,7],"end":[12,20],"bytes":[222,235]}}}}},"call_graph":[{"src":"can://typescript/anon-app/src/routes.ts/login/","dst":"can://typescript/anon-app/src/routes.ts/query","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/anon-app/src/routes.ts/outer//","dst":"can://typescript/anon-app/src/routes.ts/named","prov":["jelly"],"weight":1}],"param_in":[],"param_out":[],"external_symbols":{},"synthesized_callables":{"can://typescript/anon-app/src/routes.ts/login@2:10":{"id":"can://typescript/anon-app/src/routes.ts/login/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:10":{"id":"can://typescript/anon-app/src/routes.ts/outer/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:16":{"id":"can://typescript/anon-app/src/routes.ts/outer//","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/anon-app-a3.json b/test/goldens/anon-app-a3.json deleted file mode 100644 index 1e45135..0000000 --- a/test/goldens/anon-app-a3.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/anon-app","kind":"application","symbol_table":{"src/routes.ts":{"source":"export function login() {\n return (req: any, res: any) => {\n const email = req.body.email;\n query(`SELECT * FROM Users WHERE email = '${email}'`);\n };\n}\n\nexport function query(sql: string) {\n return sql;\n}\n\nconst app: any = {};\napp.get(\"/health\", (req: any, res: any) => {\n res.send(req.query.probe);\n});\n\nconst named = () => 1;\n\nexport function outer() {\n return () => () => named();\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/anon-app/src/routes.ts","kind":"module","span":{"start":[1,1],"end":[22,1],"bytes":[0,398]},"types":{},"functions":{"login":{"name":"login","signature":"src/routes.login","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"(req: any, res: any) => void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]},"body":{"@entry":{"kind":"entry","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]}},"2:3":{"kind":"statement","span":{"start":[2,3],"end":[5,5],"bytes":[28,158]}},"@exit":{"kind":"exit","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]}}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.login.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":11,"end_column":19},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":21,"end_column":29}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login/","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]},"body":{"4:5":{"method_name":"query","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,5],"end":[4,58],"bytes":[99,152]},"callee":"can://typescript/anon-app/src/routes.ts/query"},"@entry":{"kind":"entry","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]}},"3:5":{"kind":"statement","span":{"start":[3,5],"end":[3,34],"bytes":[65,94]}},"@exit":{"kind":"exit","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]}}},"cfg":[{"src":"@entry","dst":"3:5","kind":"fallthrough"},{"src":"3:5","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"3:5"},{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"3:5","var":"req.body.email","prov":["reaching-defs"]},{"src":"3:5","dst":"4:5","var":"email","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"2:3","kind":"fallthrough"},{"src":"2:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"2:3"}],"ddg":[]},"query":{"name":"query","signature":"src/routes.query","comments":[],"decorators":[],"parameters":[{"name":"sql","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":23,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/query","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]},"body":{"@entry":{"kind":"entry","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,14],"bytes":[201,212]}},"@exit":{"kind":"exit","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]}}},"cfg":[{"src":"@entry","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"9:3","var":"sql","prov":["reaching-defs"]}]},"outer":{"name":"outer","signature":"src/routes.outer","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => () => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]},"body":{"@entry":{"kind":"entry","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]}},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,30],"bytes":[368,395]}},"@exit":{"kind":"exit","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]}}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer/","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]},"body":{"@entry":{"kind":"entry","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]}},"20:16":{"kind":"statement","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"@exit":{"kind":"exit","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]}}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer..","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer//","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]},"body":{"@entry":{"kind":"entry","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"20:22":{"kind":"statement","span":{"start":[20,22],"end":[20,29],"bytes":[387,394]}},"@exit":{"kind":"exit","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}}},"cfg":[{"src":"@entry","dst":"20:22","kind":"fallthrough"},{"src":"20:22","dst":"@exit","kind":"exception"},{"src":"20:22","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:22"}],"ddg":[{"src":"@entry","dst":"20:22","var":"src/routes.named","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"20:16","kind":"fallthrough"},{"src":"20:16","dst":"@exit","kind":"exception"},{"src":"20:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:16"}],"ddg":[{"src":"@entry","dst":"20:16","var":"src/routes.named","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:3"}],"ddg":[{"src":"@entry","dst":"20:3","var":"src/routes.named","prov":["reaching-defs"]}]},"named":{"name":"named","signature":"src/routes.named","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/named","span":{"start":[17,7],"end":[17,22],"bytes":[322,337]},"body":{"@entry":{"kind":"entry","span":{"start":[17,15],"end":[17,22],"bytes":[330,337]}},"17:21":{"kind":"statement","span":{"start":[17,21],"end":[17,22],"bytes":[336,337]}},"@exit":{"kind":"exit","span":{"start":[17,15],"end":[17,22],"bytes":[330,337]}}},"cfg":[{"src":"@entry","dst":"17:21","kind":"fallthrough"},{"src":"17:21","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:21"}],"ddg":[]},"":{"name":"(anonymous)","signature":"src/routes.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":21,"end_column":29},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":31,"end_column":39}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]},"body":{"14:3":{"method_name":"send","receiver_expr":"res","receiver_type":"any","argument_types":["any"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,28],"bytes":[284,309]},"callee":null},"@entry":{"kind":"entry","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]}},"@exit":{"kind":"exit","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]}}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"14:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"req.query.probe","prov":["reaching-defs"]},{"src":"@entry","dst":"14:3","var":"res.send","prov":["reaching-defs"]}]}},"fields":{"app":{"name":"app","type":"any","initializer":"{}","scope":"module","declaration_kind":"const","is_readonly":true,"is_exported":false,"id":"can://typescript/anon-app/src/routes.ts/app","kind":"field","span":{"start":[12,7],"end":[12,20],"bytes":[222,235]}}}}},"call_graph":[{"src":"can://typescript/anon-app/src/routes.ts/login/","dst":"can://typescript/anon-app/src/routes.ts/query","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/anon-app/src/routes.ts/outer//","dst":"can://typescript/anon-app/src/routes.ts/named","prov":["jelly"],"weight":1}],"param_in":[],"param_out":[],"external_symbols":{},"synthesized_callables":{"can://typescript/anon-app/src/routes.ts/login@2:10":{"id":"can://typescript/anon-app/src/routes.ts/login/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:10":{"id":"can://typescript/anon-app/src/routes.ts/outer/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:16":{"id":"can://typescript/anon-app/src/routes.ts/outer//","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/anon-app-a4.json b/test/goldens/anon-app-a4.json deleted file mode 100644 index 095e5ec..0000000 --- a/test/goldens/anon-app-a4.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/anon-app","kind":"application","symbol_table":{"src/routes.ts":{"source":"export function login() {\n return (req: any, res: any) => {\n const email = req.body.email;\n query(`SELECT * FROM Users WHERE email = '${email}'`);\n };\n}\n\nexport function query(sql: string) {\n return sql;\n}\n\nconst app: any = {};\napp.get(\"/health\", (req: any, res: any) => {\n res.send(req.query.probe);\n});\n\nconst named = () => 1;\n\nexport function outer() {\n return () => () => named();\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/anon-app/src/routes.ts","kind":"module","span":{"start":[1,1],"end":[22,1],"bytes":[0,398]},"types":{},"functions":{"login":{"name":"login","signature":"src/routes.login","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"(req: any, res: any) => void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]},"body":{"@entry":{"kind":"entry","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]}},"2:3":{"kind":"statement","span":{"start":[2,3],"end":[5,5],"bytes":[28,158]}},"@exit":{"kind":"exit","span":{"start":[1,1],"end":[6,2],"bytes":[0,160]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.login.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":11,"end_column":19},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":2,"end_line":2,"start_column":21,"end_column":29}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/login/","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]},"body":{"4:5":{"method_name":"query","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,5],"end":[4,58],"bytes":[99,152]},"callee":"can://typescript/anon-app/src/routes.ts/query"},"@entry":{"kind":"entry","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]}},"3:5":{"kind":"statement","span":{"start":[3,5],"end":[3,34],"bytes":[65,94]}},"@exit":{"kind":"exit","span":{"start":[2,10],"end":[5,4],"bytes":[35,157]}},"@formal_in:0":{"kind":"formal_in","of":"req"},"@formal_in:1":{"kind":"formal_in","of":"res"},"@formal_out":{"kind":"formal_out","of":"$ret"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5"}},"cfg":[{"src":"@entry","dst":"3:5","kind":"fallthrough"},{"src":"3:5","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"3:5"},{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"3:5","var":"req.body.email","prov":["reaching-defs"]},{"src":"3:5","dst":"4:5","var":"email","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]}},"cfg":[{"src":"@entry","dst":"2:3","kind":"fallthrough"},{"src":"2:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"2:3"}],"ddg":[{"src":"2:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"query":{"name":"query","signature":"src/routes.query","comments":[],"decorators":[],"parameters":[{"name":"sql","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":23,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/query","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]},"body":{"@entry":{"kind":"entry","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,14],"bytes":[201,212]}},"@exit":{"kind":"exit","span":{"start":[8,1],"end":[10,2],"bytes":[162,214]}},"@formal_in:0":{"kind":"formal_in","of":"sql"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"9:3","var":"sql","prov":["reaching-defs"]},{"src":"9:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"outer":{"name":"outer","signature":"src/routes.outer","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => () => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]},"body":{"@entry":{"kind":"entry","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]}},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,30],"bytes":[368,395]}},"@exit":{"kind":"exit","span":{"start":[19,1],"end":[21,2],"bytes":[340,397]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer/","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]},"body":{"@entry":{"kind":"entry","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]}},"20:16":{"kind":"statement","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"@exit":{"kind":"exit","span":{"start":[20,10],"end":[20,29],"bytes":[375,394]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/routes.outer..","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/outer//","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]},"body":{"@entry":{"kind":"entry","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"20:22":{"kind":"statement","span":{"start":[20,22],"end":[20,29],"bytes":[387,394]}},"@exit":{"kind":"exit","span":{"start":[20,16],"end":[20,29],"bytes":[381,394]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"20:22","kind":"fallthrough"},{"src":"20:22","dst":"@exit","kind":"exception"},{"src":"20:22","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:22"}],"ddg":[{"src":"@entry","dst":"20:22","var":"src/routes.named","prov":["reaching-defs"]},{"src":"20:22","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"20:16","kind":"fallthrough"},{"src":"20:16","dst":"@exit","kind":"exception"},{"src":"20:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:16"}],"ddg":[{"src":"@entry","dst":"20:16","var":"src/routes.named","prov":["reaching-defs"]},{"src":"20:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:3"}],"ddg":[{"src":"@entry","dst":"20:3","var":"src/routes.named","prov":["reaching-defs"]},{"src":"20:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"named":{"name":"named","signature":"src/routes.named","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/named","span":{"start":[17,7],"end":[17,22],"bytes":[322,337]},"body":{"@entry":{"kind":"entry","span":{"start":[17,15],"end":[17,22],"bytes":[330,337]}},"17:21":{"kind":"statement","span":{"start":[17,21],"end":[17,22],"bytes":[336,337]}},"@exit":{"kind":"exit","span":{"start":[17,15],"end":[17,22],"bytes":[330,337]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"17:21","kind":"fallthrough"},{"src":"17:21","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:21"}],"ddg":[{"src":"17:21","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"":{"name":"(anonymous)","signature":"src/routes.","comments":[],"decorators":[],"parameters":[{"name":"req","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":21,"end_column":29},{"name":"res","type":"any","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":31,"end_column":39}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/anon-app/src/routes.ts/","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]},"body":{"14:3":{"method_name":"send","receiver_expr":"res","receiver_type":"any","argument_types":["any"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,28],"bytes":[284,309]},"callee":null},"@entry":{"kind":"entry","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]}},"@exit":{"kind":"exit","span":{"start":[13,20],"end":[15,2],"bytes":[256,312]}},"@formal_in:0":{"kind":"formal_in","of":"req"},"@formal_in:1":{"kind":"formal_in","of":"res"},"@formal_out":{"kind":"formal_out","of":"$ret"},"14:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:3"},"14:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:3"}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"14:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"req.query.probe","prov":["reaching-defs"]},{"src":"@entry","dst":"14:3","var":"res.send","prov":["reaching-defs"]}],"summary":[{"src":"14:3/actual_in:0","dst":"14:3/actual_out"}]}},"fields":{"app":{"name":"app","type":"any","initializer":"{}","scope":"module","declaration_kind":"const","is_readonly":true,"is_exported":false,"id":"can://typescript/anon-app/src/routes.ts/app","kind":"field","span":{"start":[12,7],"end":[12,20],"bytes":[222,235]}}}}},"call_graph":[{"src":"can://typescript/anon-app/src/routes.ts/login/","dst":"can://typescript/anon-app/src/routes.ts/query","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/anon-app/src/routes.ts/outer//","dst":"can://typescript/anon-app/src/routes.ts/named","prov":["jelly"],"weight":1}],"param_in":[{"src":"can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0","dst":"can://typescript/anon-app/src/routes.ts/query@formal_in:0"}],"param_out":[{"src":"can://typescript/anon-app/src/routes.ts/query@formal_out","dst":"can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out"}],"external_symbols":{},"synthesized_callables":{"can://typescript/anon-app/src/routes.ts/login@2:10":{"id":"can://typescript/anon-app/src/routes.ts/login/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:10":{"id":"can://typescript/anon-app/src/routes.ts/outer/","kind":"callable"},"can://typescript/anon-app/src/routes.ts/outer@20:16":{"id":"can://typescript/anon-app/src/routes.ts/outer//","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/anon-app.cypher b/test/goldens/anon-app.cypher deleted file mode 100644 index 2fed2c5..0000000 --- a/test/goldens/anon-app.cypher +++ /dev/null @@ -1,269 +0,0 @@ - - - - - {f: 'can://typescript/anon-app', t: 'can://typescript/anon-app/src/routes.ts', p: {}} - {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/app', p: {}} - {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/login', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/named', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/outer', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts', t: 'can://typescript/anon-app/src/routes.ts/query', p: {}} - {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@14:3', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_in:0', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@entry', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@exit', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@formal_in:0', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@formal_in:1', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/', t: 'can://typescript/anon-app/src/routes.ts/@formal_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/@14:3', t: 'can://typescript/anon-app/src/routes.ts/@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/anon-app/src/routes.ts/@14:3', t: 'can://typescript/anon-app/src/routes.ts/@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_in:0', t: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/@entry', t: 'can://typescript/anon-app/src/routes.ts/@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/@entry', t: 'can://typescript/anon-app/src/routes.ts/@14:3', k: 'req.query.probe|reaching-defs', p: {var: 'req.query.probe', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/@entry', t: 'can://typescript/anon-app/src/routes.ts/@14:3', k: 'res.send|reaching-defs', p: {var: 'res.send', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/@entry', t: 'can://typescript/anon-app/src/routes.ts/@14:3', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login/', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login@2:3', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login@entry', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login@exit', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login', t: 'can://typescript/anon-app/src/routes.ts/login@formal_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@3:5', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@entry', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@exit', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:0', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:1', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/login/@formal_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/', t: 'can://typescript/anon-app/src/routes.ts/query', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/@3:5', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5', k: 'email|reaching-defs', p: {var: 'email', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/@3:5', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5', t: 'can://typescript/anon-app/src/routes.ts/login/@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5', t: 'can://typescript/anon-app/src/routes.ts/login/@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5', t: 'can://typescript/anon-app/src/routes.ts/query', p: {}} - {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', p: {}} - {f: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', t: 'can://typescript/anon-app/src/routes.ts/query@formal_in:0', p: {}} - {f: 'can://typescript/anon-app/src/routes.ts/login/@entry', t: 'can://typescript/anon-app/src/routes.ts/login/@3:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/@entry', t: 'can://typescript/anon-app/src/routes.ts/login/@3:5', k: 'req.body.email|reaching-defs', p: {var: 'req.body.email', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/@entry', t: 'can://typescript/anon-app/src/routes.ts/login/@3:5', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login/@entry', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/login@2:3', t: 'can://typescript/anon-app/src/routes.ts/login@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/anon-app/src/routes.ts/login@2:3', t: 'can://typescript/anon-app/src/routes.ts/login@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/login@entry', t: 'can://typescript/anon-app/src/routes.ts/login@2:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/login@entry', t: 'can://typescript/anon-app/src/routes.ts/login@2:3', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/named', t: 'can://typescript/anon-app/src/routes.ts/named@17:21', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/named', t: 'can://typescript/anon-app/src/routes.ts/named@entry', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/named', t: 'can://typescript/anon-app/src/routes.ts/named@exit', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/named', t: 'can://typescript/anon-app/src/routes.ts/named@formal_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/named@17:21', t: 'can://typescript/anon-app/src/routes.ts/named@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/anon-app/src/routes.ts/named@17:21', t: 'can://typescript/anon-app/src/routes.ts/named@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/named@entry', t: 'can://typescript/anon-app/src/routes.ts/named@17:21', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/named@entry', t: 'can://typescript/anon-app/src/routes.ts/named@17:21', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer/', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer@20:3', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer@entry', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer@exit', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer', t: 'can://typescript/anon-app/src/routes.ts/outer@formal_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer//', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer/@entry', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer/@exit', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/', t: 'can://typescript/anon-app/src/routes.ts/outer/@formal_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/named', p: {weight: 1, prov: ['jelly']}} - {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/outer//@entry', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/outer//@exit', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//', t: 'can://typescript/anon-app/src/routes.ts/outer//@formal_out', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', t: 'can://typescript/anon-app/src/routes.ts/outer//@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', t: 'can://typescript/anon-app/src/routes.ts/outer//@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', t: 'can://typescript/anon-app/src/routes.ts/outer//@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//@entry', t: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//@entry', t: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', k: 'src/routes.named|reaching-defs', p: {var: 'src/routes.named', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer//@entry', t: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', t: 'can://typescript/anon-app/src/routes.ts/outer/@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', t: 'can://typescript/anon-app/src/routes.ts/outer/@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', t: 'can://typescript/anon-app/src/routes.ts/outer/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/@entry', t: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/@entry', t: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', k: 'src/routes.named|reaching-defs', p: {var: 'src/routes.named', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer/@entry', t: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer@20:3', t: 'can://typescript/anon-app/src/routes.ts/outer@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer@20:3', t: 'can://typescript/anon-app/src/routes.ts/outer@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer@entry', t: 'can://typescript/anon-app/src/routes.ts/outer@20:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer@entry', t: 'can://typescript/anon-app/src/routes.ts/outer@20:3', k: 'src/routes.named|reaching-defs', p: {var: 'src/routes.named', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/outer@entry', t: 'can://typescript/anon-app/src/routes.ts/outer@20:3', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@9:3', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@entry', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@exit', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@formal_in:0', p: {}}, - {f: 'can://typescript/anon-app/src/routes.ts/query', t: 'can://typescript/anon-app/src/routes.ts/query@formal_out', p: {}} - {f: 'can://typescript/anon-app/src/routes.ts/query@9:3', t: 'can://typescript/anon-app/src/routes.ts/query@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/anon-app/src/routes.ts/query@9:3', t: 'can://typescript/anon-app/src/routes.ts/query@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/anon-app/src/routes.ts/query@entry', t: 'can://typescript/anon-app/src/routes.ts/query@9:3', k: 'fallthrough', p: {kind: 'fallthrough'}} - {f: 'can://typescript/anon-app/src/routes.ts/query@entry', t: 'can://typescript/anon-app/src/routes.ts/query@9:3', k: 'sql|reaching-defs', p: {var: 'sql', prov: ['reaching-defs']}} - {f: 'can://typescript/anon-app/src/routes.ts/query@entry', t: 'can://typescript/anon-app/src/routes.ts/query@9:3', p: {}} - {f: 'can://typescript/anon-app/src/routes.ts/query@formal_out', t: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', p: {}} - {k: 'can://typescript/anon-app', p: {id: 'can://typescript/anon-app', schema_version: '2.1.0', language: 'typescript', max_level: 4, k_limit: 3, analyzer_name: 'codeanalyzer-typescript', analyzer_version: '1.0.0'}} - {k: 'can://typescript/anon-app/src/routes.ts', p: {id: 'can://typescript/anon-app/src/routes.ts', kind: 'module', name: 'src/routes.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 22, _module: 'src/routes.ts'}} - {k: 'can://typescript/anon-app/src/routes.ts/', p: {id: 'can://typescript/anon-app/src/routes.ts/', kind: 'arrow', signature: 'src/routes.', name: '(anonymous)', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 13, end_line: 15, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/@14:3', p: {id: 'can://typescript/anon-app/src/routes.ts/@14:3', kind: 'call', start_line: 14, end_line: 14, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '14:3', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_out', p: {id: 'can://typescript/anon-app/src/routes.ts/@14:3/actual_out', kind: 'actual_out', of: '$ret', parent: '14:3', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/@entry', kind: 'entry', start_line: 13, end_line: 15, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/@exit', kind: 'exit', start_line: 13, end_line: 15, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/@formal_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/@formal_in:0', kind: 'formal_in', of: 'req', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/@formal_in:1', p: {id: 'can://typescript/anon-app/src/routes.ts/@formal_in:1', kind: 'formal_in', of: 'res', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/app', p: {id: 'can://typescript/anon-app/src/routes.ts/app', kind: 'field', name: 'app', type: 'any', start_line: 12, end_line: 12, _module: 'src/routes.ts'}} - {k: 'can://typescript/anon-app/src/routes.ts/login', p: {id: 'can://typescript/anon-app/src/routes.ts/login', kind: 'function', signature: 'src/routes.login', name: 'login', return_type: '(req: any, res: any) => void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 1, end_line: 6, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/', p: {id: 'can://typescript/anon-app/src/routes.ts/login/', kind: 'arrow', signature: 'src/routes.login.', name: '(anonymous)', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 2, end_line: 5, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@3:5', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@3:5', kind: 'statement', start_line: 3, end_line: 3, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@4:5', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@4:5', kind: 'call', callee: 'can://typescript/anon-app/src/routes.ts/query', start_line: 4, end_line: 4, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '4:5', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@4:5/actual_out', kind: 'actual_out', of: '$ret', parent: '4:5', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@entry', kind: 'entry', start_line: 2, end_line: 5, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@exit', kind: 'exit', start_line: 2, end_line: 5, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:0', kind: 'formal_in', of: 'req', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:1', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@formal_in:1', kind: 'formal_in', of: 'res', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login/@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/login/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login@2:3', p: {id: 'can://typescript/anon-app/src/routes.ts/login@2:3', kind: 'statement', start_line: 2, end_line: 5, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/login@entry', kind: 'entry', start_line: 1, end_line: 6, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/login@exit', kind: 'exit', start_line: 1, end_line: 6, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/login@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/login@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/named', p: {id: 'can://typescript/anon-app/src/routes.ts/named', kind: 'arrow', signature: 'src/routes.named', name: 'named', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 17, end_line: 17, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/named@17:21', p: {id: 'can://typescript/anon-app/src/routes.ts/named@17:21', kind: 'statement', start_line: 17, end_line: 17, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/named@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/named@entry', kind: 'entry', start_line: 17, end_line: 17, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/named@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/named@exit', kind: 'exit', start_line: 17, end_line: 17, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/named@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/named@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer', p: {id: 'can://typescript/anon-app/src/routes.ts/outer', kind: 'function', signature: 'src/routes.outer', name: 'outer', return_type: '() => () => number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 19, end_line: 21, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer/', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/', kind: 'arrow', signature: 'src/routes.outer.', name: '(anonymous)', return_type: '() => number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer//', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//', kind: 'arrow', signature: 'src/routes.outer..', name: '(anonymous)', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 20, end_line: 20, _module: 'src/routes.ts'}} - {k: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//@20:22', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer//@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//@entry', kind: 'entry', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer//@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//@exit', kind: 'exit', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer//@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/outer//@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/@20:16', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer/@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/@entry', kind: 'entry', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer/@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/@exit', kind: 'exit', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer/@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/outer/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer@20:3', p: {id: 'can://typescript/anon-app/src/routes.ts/outer@20:3', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/outer@entry', kind: 'entry', start_line: 19, end_line: 21, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/outer@exit', kind: 'exit', start_line: 19, end_line: 21, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/outer@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/outer@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/query', p: {id: 'can://typescript/anon-app/src/routes.ts/query', kind: 'function', signature: 'src/routes.query', name: 'query', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 8, end_line: 10, _module: 'src/routes.ts'}} - {k: 'can://typescript/anon-app/src/routes.ts/query@9:3', p: {id: 'can://typescript/anon-app/src/routes.ts/query@9:3', kind: 'statement', start_line: 9, end_line: 9, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/query@entry', p: {id: 'can://typescript/anon-app/src/routes.ts/query@entry', kind: 'entry', start_line: 8, end_line: 10, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/query@exit', p: {id: 'can://typescript/anon-app/src/routes.ts/query@exit', kind: 'exit', start_line: 8, end_line: 10, _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/query@formal_in:0', p: {id: 'can://typescript/anon-app/src/routes.ts/query@formal_in:0', kind: 'formal_in', of: 'sql', _module: 'src/routes.ts'}}, - {k: 'can://typescript/anon-app/src/routes.ts/query@formal_out', p: {id: 'can://typescript/anon-app/src/routes.ts/query@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/routes.ts'}} -// ── constraints & indexes ── -// ── nodes ── -// ── relationships ── -// ── wipe this project's prior subgraph (external targets are shared) ── -CREATE CONSTRAINT application_id IF NOT EXISTS FOR (x:Application) REQUIRE x.id IS UNIQUE; -CREATE CONSTRAINT cannode_id IF NOT EXISTS FOR (x:CanNode) REQUIRE x.id IS UNIQUE; -CREATE INDEX callable_name IF NOT EXISTS FOR (c:TSCallable) ON (c.name); -CREATE INDEX cannode_kind IF NOT EXISTS FOR (n:CanNode) ON (n.kind); -CREATE INDEX cannode_module IF NOT EXISTS FOR (n:CanNode) ON (n._module); -DETACH DELETE x, m, a; -MATCH (a:Application {id: 'can://typescript/anon-app'}) -MATCH (a:Application {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MERGE (a)-[r:TS_CALLS]->(b) -MERGE (a)-[r:TS_CDG]->(b) -MERGE (a)-[r:TS_CFG_NEXT {_k: row.k}]->(b) -MERGE (a)-[r:TS_DDG {_k: row.k}]->(b) -MERGE (a)-[r:TS_DECLARES]->(b) -MERGE (a)-[r:TS_HAS_BODY_NODE]->(b) -MERGE (a)-[r:TS_HAS_FIELD]->(b) -MERGE (a)-[r:TS_HAS_MODULE]->(b) -MERGE (a)-[r:TS_PARAM_IN]->(b) -MERGE (a)-[r:TS_PARAM_OUT]->(b) -MERGE (a)-[r:TS_RESOLVES_TO]->(b) -MERGE (a)-[r:TS_SUMMARY]->(b) -MERGE (n:Application {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -OPTIONAL MATCH (a)-[:TS_HAS_MODULE]->(m:TSModule) -OPTIONAL MATCH (m)-[:TS_DECLARES|TS_HAS_METHOD|TS_HAS_FIELD|TS_HAS_BODY_NODE*1..]->(x) -SET n += row.p, n:TSApplication; -SET n += row.p, n:TSBodyNode; -SET n += row.p, n:TSCallable:TSAnonymousCallable; -SET n += row.p, n:TSCallable; -SET n += row.p, n:TSField; -SET n += row.p, n:TSModule; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row \ No newline at end of file diff --git a/test/goldens/dataflow-app-a1.json b/test/goldens/dataflow-app-a1.json deleted file mode 100644 index 9733fee..0000000 --- a/test/goldens/dataflow-app-a1.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/dataflow-app","kind":"application","symbol_table":{"src/chain.ts":{"source":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */\nimport { increment } from \"./util\";\n\nexport function c(z: number): number {\n return z + 1; // the parameter flows to the return value\n}\n\nexport function b(y: number): number {\n const fromC = c(y);\n return fromC;\n}\n\nexport function a(x: number): number {\n const fromB = b(x); // SUMMARY edge here: arg0 flows through b (and c) to the result\n return fromB;\n}\n\nexport function viaOtherFile(x: number): number {\n return increment(x); // cross-module CALL / PARAM_IN / PARAM_OUT edges\n}\n\nexport function isEven(n: number): boolean {\n if (n === 0) return true;\n return isOdd(n - 1); // mutual recursion: {isEven, isOdd} form an SCC\n}\n\nexport function isOdd(n: number): boolean {\n if (n === 0) return false;\n return isEven(n - 1);\n}\n","imports":[{"module":"./util","name":"increment","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":36}],"exports":[],"comments":[{"content":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/chain.ts","kind":"module","span":{"start":[1,1],"end":[31,1],"bytes":[0,824]},"types":{},"functions":{"c":{"name":"c","signature":"src/chain.c","comments":[],"decorators":[],"parameters":[{"name":"z","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/c","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]},"body":{}},"b":{"name":"b","signature":"src/chain.b","comments":[],"decorators":[],"parameters":[{"name":"y","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/b","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]},"body":{"9:17":{"method_name":"c","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,17],"end":[9,21],"bytes":[281,285]},"callee":null}}},"a":{"name":"a","signature":"src/chain.a","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/a","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]},"body":{"14:17":{"method_name":"b","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,17],"end":[14,21],"bytes":[361,365]},"callee":null}}},"viaOtherFile":{"name":"viaOtherFile","signature":"src/chain.viaOtherFile","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":18,"end_line":18,"start_column":30,"end_column":39}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]},"body":{"19:10":{"method_name":"increment","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,10],"end":[19,22],"bytes":[510,522]},"callee":null}}},"isEven":{"name":"isEven","signature":"src/chain.isEven","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":22,"end_line":22,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isEven","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]},"body":{"24:10":{"method_name":"isOdd","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,10],"end":[24,22],"bytes":[659,671]},"callee":null}}},"isOdd":{"name":"isOdd","signature":"src/chain.isOdd","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":27,"end_line":27,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isOdd","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]},"body":{"29:10":{"method_name":"isEven","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,10],"end":[29,23],"bytes":[807,820]},"callee":null}}}},"fields":{}},"src/closures.ts":{"source":"/** Closure capture and copy aliasing. */\n\nexport function makeCounter(start: number): () => number {\n let count = start;\n const inc = (): number => {\n count = count + 1; // writes the captured local\n return count;\n };\n return inc;\n}\n\nexport function useAlias(): number {\n const p = { f: 1 };\n const q = p; // q and p alias the same object\n q.f = 42; // write through q ...\n return p.f; // ... must reach this read through p\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Closure capture and copy aliasing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/closures.ts","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,441]},"types":{},"functions":{"makeCounter":{"name":"makeCounter","signature":"src/closures.makeCounter","comments":[{"content":"Closure capture and copy aliasing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"decorators":[],"parameters":[{"name":"start","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":29,"end_column":42}],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]},"body":{},"callables":{"inc":{"name":"inc","signature":"src/closures.makeCounter.inc","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter/inc","span":{"start":[5,9],"end":[8,4],"bytes":[131,226]},"body":{}}}},"useAlias":{"name":"useAlias","signature":"src/closures.useAlias","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/useAlias","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]},"body":{}}},"fields":{}},"src/flow.ts":{"source":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */\n\nexport function classify(n: number): string {\n let label = \"none\";\n if (n > 0) {\n label = \"pos\";\n } else {\n label = \"neg\";\n }\n return label;\n}\n\nexport function sumTo(n: number): number {\n let acc = 0;\n for (let i = 0; i < n; i++) {\n acc = acc + i; // loop-carried dependency: acc feeds itself around the back edge\n }\n return acc;\n}\n\nexport function early(n: number): number {\n if (n < 0) {\n return -1; // early return (multi-exit normalization)\n }\n const r = n * 2;\n return r;\n}\n\nexport function parse(s: string): number {\n const v = Number(s);\n if (Number.isNaN(v)) {\n throw new Error(`bad input: ${s}`);\n }\n return v;\n}\n\nexport function guarded(s: string): number {\n let out = 0;\n try {\n out = parse(s); // may throw → exception edge into the catch node\n } catch (e) {\n out = -1;\n } finally {\n touch(out);\n }\n return out;\n}\n\nexport function touch(x: number): void {\n void x;\n}\n\nexport function pickDay(d: number): string {\n let name = \"\";\n switch (d) {\n case 0:\n name = \"sun\";\n break;\n case 6:\n name = \"sat\";\n break;\n default:\n name = \"weekday\";\n }\n return name;\n}\n\nexport function spin(): number {\n let ticks = 0;\n while (true) {\n ticks = ticks + 1; // infinite loop: the dead loop-exit edge keeps EXIT reachable\n if (ticks > 3) {\n break;\n }\n }\n return ticks;\n}\n\nexport function shadow(): number {\n const x = 1;\n {\n const x = 2; // shadows the outer x — must NOT leak DDG edges across scopes\n touch(x);\n }\n return x;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/flow.ts","kind":"module","span":{"start":[1,1],"end":[87,1],"bytes":[0,1634]},"types":{},"functions":{"classify":{"name":"classify","signature":"src/flow.classify","comments":[{"content":"Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/classify","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]},"body":{}},"sumTo":{"name":"sumTo","signature":"src/flow.sumTo","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/sumTo","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]},"body":{}},"early":{"name":"early","signature":"src/flow.early","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/early","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]},"body":{}},"parse":{"name":"parse","signature":"src/flow.parse","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":29,"end_line":29,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/parse","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]},"body":{"30:13":{"method_name":"Number","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,13],"end":[30,22],"bytes":[658,667]},"callee":null},"31:7":{"method_name":"isNaN","receiver_expr":"Number","receiver_type":"NumberConstructor","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,7],"end":[31,22],"bytes":[675,690]},"callee":null},"32:11":{"method_name":"Error","argument_types":["string"],"type_arguments":[],"return_type":"Error","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[32,11],"end":[32,39],"bytes":[704,732]},"callee":null}}},"guarded":{"name":"guarded","signature":"src/flow.guarded","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/guarded","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]},"body":{"40:11":{"method_name":"parse","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,11],"end":[40,19],"bytes":[831,839]},"callee":null},"44:5":{"method_name":"touch","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[44,5],"end":[44,15],"bytes":[939,949]},"callee":null}}},"touch":{"name":"touch","signature":"src/flow.touch","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":49,"end_line":49,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/touch","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]},"body":{}},"pickDay":{"name":"pickDay","signature":"src/flow.pickDay","comments":[],"decorators":[],"parameters":[{"name":"d","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":53,"end_line":53,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/pickDay","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]},"body":{}},"spin":{"name":"spin","signature":"src/flow.spin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/spin","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]},"body":{}},"shadow":{"name":"shadow","signature":"src/flow.shadow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/shadow","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]},"body":{"83:5":{"method_name":"touch","argument_types":["2"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[83,5],"end":[83,13],"bytes":[1606,1614]},"callee":null}}}},"fields":{}},"src/hierarchy.ts":{"source":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */\n\nexport interface Shape {\n area(): number;\n}\n\nexport interface Labeled {\n readonly label: string;\n}\n\nexport interface ColoredShape extends Shape {\n readonly color: string;\n}\n\nexport class Rectangle implements Shape {\n constructor(\n protected readonly width: number,\n protected readonly height: number,\n ) {}\n\n area(): number {\n return this.width * this.height;\n }\n}\n\nexport class Square extends Rectangle implements Labeled {\n readonly label = \"square\";\n\n constructor(side: number) {\n super(side, side);\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts","kind":"module","span":{"start":[1,1],"end":[34,1],"bytes":[0,712]},"types":{"Rectangle":{"name":"Rectangle","signature":"src/hierarchy.Rectangle","comments":[],"decorators":[],"base_classes":["src/hierarchy.Shape"],"implements_types":["src/hierarchy.Shape"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle","kind":"class","span":{"start":[16,1],"end":[25,2],"bytes":[359,562]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Rectangle.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]},"body":{}},"constructor":{"name":"constructor","signature":"src/hierarchy.Rectangle.constructor","comments":[],"decorators":[],"parameters":[{"name":"width","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":18,"end_line":18,"start_column":5,"end_column":37},{"name":"height","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":19,"end_line":19,"start_column":5,"end_column":38}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]},"body":{}}},"fields":{"width":{"name":"width","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width","kind":"field"},"height":{"name":"height","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height","kind":"field"}},"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]},"Square":{"name":"Square","signature":"src/hierarchy.Square","comments":[],"decorators":[],"base_classes":["src/hierarchy.Rectangle","src/hierarchy.Labeled"],"implements_types":["src/hierarchy.Labeled"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square","kind":"class","span":{"start":[27,1],"end":[33,2],"bytes":[564,711]},"callables":{"constructor":{"name":"constructor","signature":"src/hierarchy.Square.constructor","comments":[],"decorators":[],"parameters":[{"name":"side","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":30,"end_line":30,"start_column":15,"end_column":27}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]},"body":{"31:5":{"method_name":"super","argument_types":["number","number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,22],"bytes":[687,704]},"callee":null}}}},"fields":{"label":{"name":"label","type":"\"square\"","comments":[],"decorators":[],"initializer":"\"square\"","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/label","kind":"field","span":{"start":[28,3],"end":[28,29],"bytes":[625,651]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Rectangle"],"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Labeled"]},"Shape":{"name":"Shape","signature":"src/hierarchy.Shape","comments":[{"content":"A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\nprojection, including interface→interface EXTENDS (`ColoredShape extends Shape`).","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape","kind":"interface","span":{"start":[4,1],"end":[6,2],"bytes":[182,226]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Shape.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape/area","span":{"start":[5,3],"end":[5,18],"bytes":[209,224]},"body":{}}},"fields":{}},"Labeled":{"name":"Labeled","signature":"src/hierarchy.Labeled","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled","kind":"interface","span":{"start":[8,1],"end":[10,2],"bytes":[228,282]},"callables":{},"fields":{"label":{"name":"label","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label","kind":"field","span":{"start":[9,3],"end":[9,26],"bytes":[257,280]}}}},"ColoredShape":{"name":"ColoredShape","signature":"src/hierarchy.ColoredShape","comments":[],"base_classes":["src/hierarchy.Shape"],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape","kind":"interface","span":{"start":[12,1],"end":[14,2],"bytes":[284,357]},"callables":{},"fields":{"color":{"name":"color","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color","kind":"field","span":{"start":[13,3],"end":[13,26],"bytes":[332,355]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]}},"functions":{},"fields":{}},"src/main.ts":{"source":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */\nimport { a } from \"./chain\";\nimport { bump, readCounter } from \"./state\";\n\nexport function main(): number {\n bump(3);\n const r = a(readCounter());\n return r;\n}\n","imports":[{"module":"./chain","name":"a","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":29},{"module":"./state","name":"bump","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45},{"module":"./state","name":"readCounter","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45}],"exports":[],"comments":[{"content":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":81}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/main.ts","kind":"module","span":{"start":[1,1],"end":[10,1],"bytes":[0,244]},"types":{},"functions":{"main":{"name":"main","signature":"src/main.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/main.ts/main","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]},"body":{"6:3":{"method_name":"bump","argument_types":["3"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[6,3],"end":[6,10],"bytes":[191,198]},"callee":null},"7:13":{"method_name":"a","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,13],"end":[7,29],"bytes":[212,228]},"callee":null},"7:15":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,15],"end":[7,28],"bytes":[214,227]},"callee":null}}}},"fields":{}},"src/state.ts":{"source":"/** Module-level global state: written in one function, read in another. */\n\nexport let counter = 0;\n\nexport function bump(by: number): void {\n counter = counter + by; // global write\n}\n\nexport function readCounter(): number {\n return counter; // global read that flows to the return value\n}\n\nexport function churn(by: number): number {\n bump(by); // transitive global write lands on this callsite node\n return readCounter(); // transitive global read\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Module-level global state: written in one function, read in another. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":76}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/state.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,458]},"types":{},"functions":{"bump":{"name":"bump","signature":"src/state.bump","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":5,"end_line":5,"start_column":22,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/bump","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]},"body":{}},"readCounter":{"name":"readCounter","signature":"src/state.readCounter","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/readCounter","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]},"body":{}},"churn":{"name":"churn","signature":"src/state.churn","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":33}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/churn","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]},"body":{"14:3":{"method_name":"bump","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,11],"bytes":[341,349]},"callee":null},"15:10":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,23],"bytes":[415,428]},"callee":null}}}},"fields":{"counter":{"name":"counter","type":"number","initializer":"0","scope":"module","declaration_kind":"let","is_readonly":false,"is_exported":true,"id":"can://typescript/dataflow-app/src/state.ts/counter","kind":"field","span":{"start":[3,12],"end":[3,23],"bytes":[88,99]}}}},"src/susp.ts":{"source":"/** Suspension points (await/yield) and intra-statement expression control flow. */\n\nexport async function compute(x: number): Promise {\n return x * 2;\n}\n\nexport async function fetchTotal(x: number): Promise {\n const a = await compute(x); // await_resume edge out of this statement\n return a + 1;\n}\n\nexport function* numbers(n: number): Generator {\n let i = 0;\n while (i < n) {\n yield i; // yield (suspend/resume) edge\n i = i + 1;\n }\n return n;\n}\n\nexport function shortCircuit(a: { f?: number } | null, b: number): number {\n const v = (a && a.f) || b; // short-circuit stays intra-statement (documented rule)\n const w = a?.f ?? b; // optional chaining likewise\n return v + w;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Suspension points (await/yield) and intra-statement expression control flow. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/susp.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,735]},"types":{},"functions":{"compute":{"name":"compute","signature":"src/susp.compute","comments":[{"content":"Suspension points (await/yield) and intra-statement expression control flow.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":31,"end_column":40}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/compute","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]},"body":{}},"fetchTotal":{"name":"fetchTotal","signature":"src/susp.fetchTotal","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":34,"end_column":43}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]},"body":{"8:19":{"method_name":"compute","argument_types":["number"],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,19],"end":[8,29],"bytes":[245,255]},"callee":null}}},"numbers":{"name":"numbers","signature":"src/susp.numbers","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"Generator","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":true,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/numbers","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]},"body":{}},"shortCircuit":{"name":"shortCircuit","signature":"src/susp.shortCircuit","comments":[],"decorators":[],"parameters":[{"name":"a","type":"{ f?: number } | null","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":30,"end_column":54},{"name":"b","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":56,"end_column":65}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":4,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/shortCircuit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]},"body":{}}},"fields":{}},"src/taint.ts":{"source":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */\n\nexport function source(): string {\n return \"user-input\";\n}\n\nexport function sanitize(s: string): string {\n return s.replace(/dangerous/g, \"\");\n}\n\nexport function sink(s: string): void {\n void s;\n}\n\nexport function unsafeFlow(): void {\n const s = source();\n sink(s);\n}\n\nexport function safeFlow(): void {\n const s = sanitize(source());\n sink(s);\n}\n","imports":[],"exports":[],"comments":[{"content":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/taint.ts","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,536]},"types":{},"functions":{"source":{"name":"source","signature":"src/taint.source","comments":[{"content":"Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n(issue #2 PR E); the fixture carries the flows now so that PR only adds the query.","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/source","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]},"body":{}},"sanitize":{"name":"sanitize","signature":"src/taint.sanitize","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sanitize","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]},"body":{"11:10":{"method_name":"replace","receiver_expr":"s","receiver_type":"string","argument_types":["RegExp","\"\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[11,10],"end":[11,37],"bytes":[298,325]},"callee":null}}},"sink":{"name":"sink","signature":"src/taint.sink","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":22,"end_column":31}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sink","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]},"body":{}},"unsafeFlow":{"name":"unsafeFlow","signature":"src/taint.unsafeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]},"body":{"19:13":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,13],"end":[19,21],"bytes":[432,440]},"callee":null},"20:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,3],"end":[20,10],"bytes":[444,451]},"callee":null}}},"safeFlow":{"name":"safeFlow","signature":"src/taint.safeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/safeFlow","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]},"body":{"24:13":{"method_name":"sanitize","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,13],"end":[24,31],"bytes":[503,521]},"callee":null},"24:22":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,22],"end":[24,30],"bytes":[512,520]},"callee":null},"25:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,3],"end":[25,10],"bytes":[525,532]},"callee":null}}}},"fields":{}},"src/util.ts":{"source":"export function increment(v: number): number {\n return v + 1;\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[4,1],"bytes":[0,65]},"types":{},"functions":{"increment":{"name":"increment","signature":"src/util.increment","comments":[],"decorators":[],"parameters":[{"name":"v","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":1,"end_line":1,"start_column":27,"end_column":36}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/util.ts/increment","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]},"body":{}}},"fields":{}}},"call_graph":[],"param_in":[],"param_out":[]}} \ No newline at end of file diff --git a/test/goldens/dataflow-app-a2.json b/test/goldens/dataflow-app-a2.json deleted file mode 100644 index ad9b930..0000000 --- a/test/goldens/dataflow-app-a2.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/dataflow-app","kind":"application","symbol_table":{"src/chain.ts":{"source":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */\nimport { increment } from \"./util\";\n\nexport function c(z: number): number {\n return z + 1; // the parameter flows to the return value\n}\n\nexport function b(y: number): number {\n const fromC = c(y);\n return fromC;\n}\n\nexport function a(x: number): number {\n const fromB = b(x); // SUMMARY edge here: arg0 flows through b (and c) to the result\n return fromB;\n}\n\nexport function viaOtherFile(x: number): number {\n return increment(x); // cross-module CALL / PARAM_IN / PARAM_OUT edges\n}\n\nexport function isEven(n: number): boolean {\n if (n === 0) return true;\n return isOdd(n - 1); // mutual recursion: {isEven, isOdd} form an SCC\n}\n\nexport function isOdd(n: number): boolean {\n if (n === 0) return false;\n return isEven(n - 1);\n}\n","imports":[{"module":"./util","name":"increment","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":36}],"exports":[],"comments":[{"content":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/chain.ts","kind":"module","span":{"start":[1,1],"end":[31,1],"bytes":[0,824]},"types":{},"functions":{"c":{"name":"c","signature":"src/chain.c","comments":[],"decorators":[],"parameters":[{"name":"z","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/c","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]},"body":{}},"b":{"name":"b","signature":"src/chain.b","comments":[],"decorators":[],"parameters":[{"name":"y","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/b","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]},"body":{"9:17":{"method_name":"c","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,17],"end":[9,21],"bytes":[281,285]},"callee":"can://typescript/dataflow-app/src/chain.ts/c"}}},"a":{"name":"a","signature":"src/chain.a","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/a","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]},"body":{"14:17":{"method_name":"b","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,17],"end":[14,21],"bytes":[361,365]},"callee":"can://typescript/dataflow-app/src/chain.ts/b"}}},"viaOtherFile":{"name":"viaOtherFile","signature":"src/chain.viaOtherFile","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":18,"end_line":18,"start_column":30,"end_column":39}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]},"body":{"19:10":{"method_name":"increment","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,10],"end":[19,22],"bytes":[510,522]},"callee":"can://typescript/dataflow-app/src/util.ts/increment"}}},"isEven":{"name":"isEven","signature":"src/chain.isEven","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":22,"end_line":22,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isEven","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]},"body":{"24:10":{"method_name":"isOdd","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,10],"end":[24,22],"bytes":[659,671]},"callee":"can://typescript/dataflow-app/src/chain.ts/isOdd"}}},"isOdd":{"name":"isOdd","signature":"src/chain.isOdd","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":27,"end_line":27,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isOdd","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]},"body":{"29:10":{"method_name":"isEven","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,10],"end":[29,23],"bytes":[807,820]},"callee":"can://typescript/dataflow-app/src/chain.ts/isEven"}}}},"fields":{}},"src/closures.ts":{"source":"/** Closure capture and copy aliasing. */\n\nexport function makeCounter(start: number): () => number {\n let count = start;\n const inc = (): number => {\n count = count + 1; // writes the captured local\n return count;\n };\n return inc;\n}\n\nexport function useAlias(): number {\n const p = { f: 1 };\n const q = p; // q and p alias the same object\n q.f = 42; // write through q ...\n return p.f; // ... must reach this read through p\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Closure capture and copy aliasing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/closures.ts","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,441]},"types":{},"functions":{"makeCounter":{"name":"makeCounter","signature":"src/closures.makeCounter","comments":[{"content":"Closure capture and copy aliasing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"decorators":[],"parameters":[{"name":"start","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":29,"end_column":42}],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]},"body":{},"callables":{"inc":{"name":"inc","signature":"src/closures.makeCounter.inc","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter/inc","span":{"start":[5,9],"end":[8,4],"bytes":[131,226]},"body":{}}}},"useAlias":{"name":"useAlias","signature":"src/closures.useAlias","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/useAlias","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]},"body":{}}},"fields":{}},"src/flow.ts":{"source":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */\n\nexport function classify(n: number): string {\n let label = \"none\";\n if (n > 0) {\n label = \"pos\";\n } else {\n label = \"neg\";\n }\n return label;\n}\n\nexport function sumTo(n: number): number {\n let acc = 0;\n for (let i = 0; i < n; i++) {\n acc = acc + i; // loop-carried dependency: acc feeds itself around the back edge\n }\n return acc;\n}\n\nexport function early(n: number): number {\n if (n < 0) {\n return -1; // early return (multi-exit normalization)\n }\n const r = n * 2;\n return r;\n}\n\nexport function parse(s: string): number {\n const v = Number(s);\n if (Number.isNaN(v)) {\n throw new Error(`bad input: ${s}`);\n }\n return v;\n}\n\nexport function guarded(s: string): number {\n let out = 0;\n try {\n out = parse(s); // may throw → exception edge into the catch node\n } catch (e) {\n out = -1;\n } finally {\n touch(out);\n }\n return out;\n}\n\nexport function touch(x: number): void {\n void x;\n}\n\nexport function pickDay(d: number): string {\n let name = \"\";\n switch (d) {\n case 0:\n name = \"sun\";\n break;\n case 6:\n name = \"sat\";\n break;\n default:\n name = \"weekday\";\n }\n return name;\n}\n\nexport function spin(): number {\n let ticks = 0;\n while (true) {\n ticks = ticks + 1; // infinite loop: the dead loop-exit edge keeps EXIT reachable\n if (ticks > 3) {\n break;\n }\n }\n return ticks;\n}\n\nexport function shadow(): number {\n const x = 1;\n {\n const x = 2; // shadows the outer x — must NOT leak DDG edges across scopes\n touch(x);\n }\n return x;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/flow.ts","kind":"module","span":{"start":[1,1],"end":[87,1],"bytes":[0,1634]},"types":{},"functions":{"classify":{"name":"classify","signature":"src/flow.classify","comments":[{"content":"Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/classify","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]},"body":{}},"sumTo":{"name":"sumTo","signature":"src/flow.sumTo","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/sumTo","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]},"body":{}},"early":{"name":"early","signature":"src/flow.early","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/early","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]},"body":{}},"parse":{"name":"parse","signature":"src/flow.parse","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":29,"end_line":29,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/parse","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]},"body":{"30:13":{"method_name":"Number","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,13],"end":[30,22],"bytes":[658,667]},"callee":null},"31:7":{"method_name":"isNaN","receiver_expr":"Number","receiver_type":"NumberConstructor","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,7],"end":[31,22],"bytes":[675,690]},"callee":"can://typescript/dataflow-app/@external/(builtin)/isNaN"},"32:11":{"method_name":"Error","argument_types":["string"],"type_arguments":[],"return_type":"Error","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[32,11],"end":[32,39],"bytes":[704,732]},"callee":null}}},"guarded":{"name":"guarded","signature":"src/flow.guarded","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/guarded","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]},"body":{"40:11":{"method_name":"parse","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,11],"end":[40,19],"bytes":[831,839]},"callee":"can://typescript/dataflow-app/src/flow.ts/parse"},"44:5":{"method_name":"touch","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[44,5],"end":[44,15],"bytes":[939,949]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"}}},"touch":{"name":"touch","signature":"src/flow.touch","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":49,"end_line":49,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/touch","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]},"body":{}},"pickDay":{"name":"pickDay","signature":"src/flow.pickDay","comments":[],"decorators":[],"parameters":[{"name":"d","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":53,"end_line":53,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/pickDay","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]},"body":{}},"spin":{"name":"spin","signature":"src/flow.spin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/spin","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]},"body":{}},"shadow":{"name":"shadow","signature":"src/flow.shadow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/shadow","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]},"body":{"83:5":{"method_name":"touch","argument_types":["2"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[83,5],"end":[83,13],"bytes":[1606,1614]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"}}}},"fields":{}},"src/hierarchy.ts":{"source":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */\n\nexport interface Shape {\n area(): number;\n}\n\nexport interface Labeled {\n readonly label: string;\n}\n\nexport interface ColoredShape extends Shape {\n readonly color: string;\n}\n\nexport class Rectangle implements Shape {\n constructor(\n protected readonly width: number,\n protected readonly height: number,\n ) {}\n\n area(): number {\n return this.width * this.height;\n }\n}\n\nexport class Square extends Rectangle implements Labeled {\n readonly label = \"square\";\n\n constructor(side: number) {\n super(side, side);\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts","kind":"module","span":{"start":[1,1],"end":[34,1],"bytes":[0,712]},"types":{"Rectangle":{"name":"Rectangle","signature":"src/hierarchy.Rectangle","comments":[],"decorators":[],"base_classes":["src/hierarchy.Shape"],"implements_types":["src/hierarchy.Shape"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle","kind":"class","span":{"start":[16,1],"end":[25,2],"bytes":[359,562]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Rectangle.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]},"body":{}},"constructor":{"name":"constructor","signature":"src/hierarchy.Rectangle.constructor","comments":[],"decorators":[],"parameters":[{"name":"width","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":18,"end_line":18,"start_column":5,"end_column":37},{"name":"height","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":19,"end_line":19,"start_column":5,"end_column":38}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]},"body":{}}},"fields":{"width":{"name":"width","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width","kind":"field"},"height":{"name":"height","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height","kind":"field"}},"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]},"Square":{"name":"Square","signature":"src/hierarchy.Square","comments":[],"decorators":[],"base_classes":["src/hierarchy.Rectangle","src/hierarchy.Labeled"],"implements_types":["src/hierarchy.Labeled"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square","kind":"class","span":{"start":[27,1],"end":[33,2],"bytes":[564,711]},"callables":{"constructor":{"name":"constructor","signature":"src/hierarchy.Square.constructor","comments":[],"decorators":[],"parameters":[{"name":"side","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":30,"end_line":30,"start_column":15,"end_column":27}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]},"body":{"31:5":{"method_name":"super","argument_types":["number","number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,22],"bytes":[687,704]},"callee":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor"}}}},"fields":{"label":{"name":"label","type":"\"square\"","comments":[],"decorators":[],"initializer":"\"square\"","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/label","kind":"field","span":{"start":[28,3],"end":[28,29],"bytes":[625,651]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Rectangle"],"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Labeled"]},"Shape":{"name":"Shape","signature":"src/hierarchy.Shape","comments":[{"content":"A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\nprojection, including interface→interface EXTENDS (`ColoredShape extends Shape`).","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape","kind":"interface","span":{"start":[4,1],"end":[6,2],"bytes":[182,226]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Shape.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape/area","span":{"start":[5,3],"end":[5,18],"bytes":[209,224]},"body":{}}},"fields":{}},"Labeled":{"name":"Labeled","signature":"src/hierarchy.Labeled","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled","kind":"interface","span":{"start":[8,1],"end":[10,2],"bytes":[228,282]},"callables":{},"fields":{"label":{"name":"label","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label","kind":"field","span":{"start":[9,3],"end":[9,26],"bytes":[257,280]}}}},"ColoredShape":{"name":"ColoredShape","signature":"src/hierarchy.ColoredShape","comments":[],"base_classes":["src/hierarchy.Shape"],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape","kind":"interface","span":{"start":[12,1],"end":[14,2],"bytes":[284,357]},"callables":{},"fields":{"color":{"name":"color","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color","kind":"field","span":{"start":[13,3],"end":[13,26],"bytes":[332,355]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]}},"functions":{},"fields":{}},"src/main.ts":{"source":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */\nimport { a } from \"./chain\";\nimport { bump, readCounter } from \"./state\";\n\nexport function main(): number {\n bump(3);\n const r = a(readCounter());\n return r;\n}\n","imports":[{"module":"./chain","name":"a","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":29},{"module":"./state","name":"bump","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45},{"module":"./state","name":"readCounter","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45}],"exports":[],"comments":[{"content":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":81}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/main.ts","kind":"module","span":{"start":[1,1],"end":[10,1],"bytes":[0,244]},"types":{},"functions":{"main":{"name":"main","signature":"src/main.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/main.ts/main","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]},"body":{"6:3":{"method_name":"bump","argument_types":["3"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[6,3],"end":[6,10],"bytes":[191,198]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"7:13":{"method_name":"a","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,13],"end":[7,29],"bytes":[212,228]},"callee":"can://typescript/dataflow-app/src/chain.ts/a"},"7:15":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,15],"end":[7,28],"bytes":[214,227]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"}}}},"fields":{}},"src/state.ts":{"source":"/** Module-level global state: written in one function, read in another. */\n\nexport let counter = 0;\n\nexport function bump(by: number): void {\n counter = counter + by; // global write\n}\n\nexport function readCounter(): number {\n return counter; // global read that flows to the return value\n}\n\nexport function churn(by: number): number {\n bump(by); // transitive global write lands on this callsite node\n return readCounter(); // transitive global read\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Module-level global state: written in one function, read in another. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":76}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/state.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,458]},"types":{},"functions":{"bump":{"name":"bump","signature":"src/state.bump","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":5,"end_line":5,"start_column":22,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/bump","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]},"body":{}},"readCounter":{"name":"readCounter","signature":"src/state.readCounter","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/readCounter","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]},"body":{}},"churn":{"name":"churn","signature":"src/state.churn","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":33}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/churn","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]},"body":{"14:3":{"method_name":"bump","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,11],"bytes":[341,349]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"15:10":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,23],"bytes":[415,428]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"}}}},"fields":{"counter":{"name":"counter","type":"number","initializer":"0","scope":"module","declaration_kind":"let","is_readonly":false,"is_exported":true,"id":"can://typescript/dataflow-app/src/state.ts/counter","kind":"field","span":{"start":[3,12],"end":[3,23],"bytes":[88,99]}}}},"src/susp.ts":{"source":"/** Suspension points (await/yield) and intra-statement expression control flow. */\n\nexport async function compute(x: number): Promise {\n return x * 2;\n}\n\nexport async function fetchTotal(x: number): Promise {\n const a = await compute(x); // await_resume edge out of this statement\n return a + 1;\n}\n\nexport function* numbers(n: number): Generator {\n let i = 0;\n while (i < n) {\n yield i; // yield (suspend/resume) edge\n i = i + 1;\n }\n return n;\n}\n\nexport function shortCircuit(a: { f?: number } | null, b: number): number {\n const v = (a && a.f) || b; // short-circuit stays intra-statement (documented rule)\n const w = a?.f ?? b; // optional chaining likewise\n return v + w;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Suspension points (await/yield) and intra-statement expression control flow. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/susp.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,735]},"types":{},"functions":{"compute":{"name":"compute","signature":"src/susp.compute","comments":[{"content":"Suspension points (await/yield) and intra-statement expression control flow.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":31,"end_column":40}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/compute","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]},"body":{}},"fetchTotal":{"name":"fetchTotal","signature":"src/susp.fetchTotal","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":34,"end_column":43}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]},"body":{"8:19":{"method_name":"compute","argument_types":["number"],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,19],"end":[8,29],"bytes":[245,255]},"callee":"can://typescript/dataflow-app/src/susp.ts/compute"}}},"numbers":{"name":"numbers","signature":"src/susp.numbers","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"Generator","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":true,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/numbers","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]},"body":{}},"shortCircuit":{"name":"shortCircuit","signature":"src/susp.shortCircuit","comments":[],"decorators":[],"parameters":[{"name":"a","type":"{ f?: number } | null","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":30,"end_column":54},{"name":"b","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":56,"end_column":65}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":4,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/shortCircuit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]},"body":{}}},"fields":{}},"src/taint.ts":{"source":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */\n\nexport function source(): string {\n return \"user-input\";\n}\n\nexport function sanitize(s: string): string {\n return s.replace(/dangerous/g, \"\");\n}\n\nexport function sink(s: string): void {\n void s;\n}\n\nexport function unsafeFlow(): void {\n const s = source();\n sink(s);\n}\n\nexport function safeFlow(): void {\n const s = sanitize(source());\n sink(s);\n}\n","imports":[],"exports":[],"comments":[{"content":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/taint.ts","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,536]},"types":{},"functions":{"source":{"name":"source","signature":"src/taint.source","comments":[{"content":"Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n(issue #2 PR E); the fixture carries the flows now so that PR only adds the query.","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/source","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]},"body":{}},"sanitize":{"name":"sanitize","signature":"src/taint.sanitize","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sanitize","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]},"body":{"11:10":{"method_name":"replace","receiver_expr":"s","receiver_type":"string","argument_types":["RegExp","\"\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[11,10],"end":[11,37],"bytes":[298,325]},"callee":"can://typescript/dataflow-app/@external/(builtin)/replace"}}},"sink":{"name":"sink","signature":"src/taint.sink","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":22,"end_column":31}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sink","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]},"body":{}},"unsafeFlow":{"name":"unsafeFlow","signature":"src/taint.unsafeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]},"body":{"19:13":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,13],"end":[19,21],"bytes":[432,440]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"20:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,3],"end":[20,10],"bytes":[444,451]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"}}},"safeFlow":{"name":"safeFlow","signature":"src/taint.safeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/safeFlow","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]},"body":{"24:13":{"method_name":"sanitize","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,13],"end":[24,31],"bytes":[503,521]},"callee":"can://typescript/dataflow-app/src/taint.ts/sanitize"},"24:22":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,22],"end":[24,30],"bytes":[512,520]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"25:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,3],"end":[25,10],"bytes":[525,532]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"}}}},"fields":{}},"src/util.ts":{"source":"export function increment(v: number): number {\n return v + 1;\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[4,1],"bytes":[0,65]},"types":{},"functions":{"increment":{"name":"increment","signature":"src/util.increment","comments":[],"decorators":[],"parameters":[{"name":"v","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":1,"end_line":1,"start_column":27,"end_column":36}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/util.ts/increment","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]},"body":{}}},"fields":{}}},"call_graph":[{"src":"can://typescript/dataflow-app/src/chain.ts/b","dst":"can://typescript/dataflow-app/src/chain.ts/c","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/a","dst":"can://typescript/dataflow-app/src/chain.ts/b","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","dst":"can://typescript/dataflow-app/src/util.ts/increment","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd","dst":"can://typescript/dataflow-app/src/chain.ts/isEven","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/parse","dst":"can://typescript/dataflow-app/@external/(builtin)/isNaN","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/parse","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/shadow","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/chain.ts/a","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","dst":"can://typescript/dataflow-app/src/susp.ts/compute","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/sanitize","dst":"can://typescript/dataflow-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sanitize","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2}],"param_in":[],"param_out":[],"external_symbols":{"can://typescript/dataflow-app/@external/(builtin)/isNaN":{"id":"can://typescript/dataflow-app/@external/(builtin)/isNaN","kind":"external","module":"(builtin)","name":"isNaN"},"can://typescript/dataflow-app/@external/(builtin)/replace":{"id":"can://typescript/dataflow-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"}},"synthesized_callables":{}}} \ No newline at end of file diff --git a/test/goldens/dataflow-app-a3.json b/test/goldens/dataflow-app-a3.json deleted file mode 100644 index 62ceaf7..0000000 --- a/test/goldens/dataflow-app-a3.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/dataflow-app","kind":"application","symbol_table":{"src/chain.ts":{"source":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */\nimport { increment } from \"./util\";\n\nexport function c(z: number): number {\n return z + 1; // the parameter flows to the return value\n}\n\nexport function b(y: number): number {\n const fromC = c(y);\n return fromC;\n}\n\nexport function a(x: number): number {\n const fromB = b(x); // SUMMARY edge here: arg0 flows through b (and c) to the result\n return fromB;\n}\n\nexport function viaOtherFile(x: number): number {\n return increment(x); // cross-module CALL / PARAM_IN / PARAM_OUT edges\n}\n\nexport function isEven(n: number): boolean {\n if (n === 0) return true;\n return isOdd(n - 1); // mutual recursion: {isEven, isOdd} form an SCC\n}\n\nexport function isOdd(n: number): boolean {\n if (n === 0) return false;\n return isEven(n - 1);\n}\n","imports":[{"module":"./util","name":"increment","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":36}],"exports":[],"comments":[{"content":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/chain.ts","kind":"module","span":{"start":[1,1],"end":[31,1],"bytes":[0,824]},"types":{},"functions":{"c":{"name":"c","signature":"src/chain.c","comments":[],"decorators":[],"parameters":[{"name":"z","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/c","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,16],"bytes":[166,179]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]}}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"z","prov":["reaching-defs"]}]},"b":{"name":"b","signature":"src/chain.b","comments":[],"decorators":[],"parameters":[{"name":"y","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/b","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]},"body":{"9:17":{"method_name":"c","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,17],"end":[9,21],"bytes":[281,285]},"callee":"can://typescript/dataflow-app/src/chain.ts/c"},"@entry":{"kind":"entry","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,22],"bytes":[267,286]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,16],"bytes":[289,302]}},"@exit":{"kind":"exit","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]}}},"cfg":[{"src":"@entry","dst":"9:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"10:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"9:3"},{"src":"9:3","dst":"10:3"}],"ddg":[{"src":"@entry","dst":"9:3","var":"y","prov":["reaching-defs"]},{"src":"9:3","dst":"10:3","var":"fromC","prov":["reaching-defs"]}]},"a":{"name":"a","signature":"src/chain.a","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/a","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]},"body":{"14:17":{"method_name":"b","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,17],"end":[14,21],"bytes":[361,365]},"callee":"can://typescript/dataflow-app/src/chain.ts/b"},"@entry":{"kind":"entry","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,22],"bytes":[347,366]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,16],"bytes":[434,447]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]}}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"14:3","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"x","prov":["reaching-defs"]},{"src":"14:3","dst":"15:3","var":"fromB","prov":["reaching-defs"]}]},"viaOtherFile":{"name":"viaOtherFile","signature":"src/chain.viaOtherFile","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":18,"end_line":18,"start_column":30,"end_column":39}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]},"body":{"19:10":{"method_name":"increment","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,10],"end":[19,22],"bytes":[510,522]},"callee":"can://typescript/dataflow-app/src/util.ts/increment"},"@entry":{"kind":"entry","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,23],"bytes":[503,523]}},"@exit":{"kind":"exit","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]}}},"cfg":[{"src":"@entry","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"19:3"}],"ddg":[{"src":"@entry","dst":"19:3","var":"x","prov":["reaching-defs"]}]},"isEven":{"name":"isEven","signature":"src/chain.isEven","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":22,"end_line":22,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isEven","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]},"body":{"24:10":{"method_name":"isOdd","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,10],"end":[24,22],"bytes":[659,671]},"callee":"can://typescript/dataflow-app/src/chain.ts/isOdd"},"@entry":{"kind":"entry","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]}},"23:3":{"kind":"statement","span":{"start":[23,3],"end":[23,28],"bytes":[624,649]}},"23:16":{"kind":"statement","span":{"start":[23,16],"end":[23,28],"bytes":[637,649]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,23],"bytes":[652,672]}},"@exit":{"kind":"exit","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]}}},"cfg":[{"src":"@entry","dst":"23:3","kind":"fallthrough"},{"src":"23:16","dst":"@exit","kind":"return"},{"src":"23:3","dst":"23:16","kind":"true"},{"src":"23:3","dst":"24:3","kind":"false"},{"src":"24:3","dst":"@exit","kind":"exception"},{"src":"24:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"23:3"},{"src":"23:3","dst":"23:16"},{"src":"23:3","dst":"24:3"}],"ddg":[{"src":"@entry","dst":"23:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"24:3","var":"n","prov":["reaching-defs"]}]},"isOdd":{"name":"isOdd","signature":"src/chain.isOdd","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":27,"end_line":27,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isOdd","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]},"body":{"29:10":{"method_name":"isEven","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,10],"end":[29,23],"bytes":[807,820]},"callee":"can://typescript/dataflow-app/src/chain.ts/isEven"},"@entry":{"kind":"entry","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]}},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,29],"bytes":[771,797]}},"28:16":{"kind":"statement","span":{"start":[28,16],"end":[28,29],"bytes":[784,797]}},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[29,24],"bytes":[800,821]}},"@exit":{"kind":"exit","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]}}},"cfg":[{"src":"@entry","dst":"28:3","kind":"fallthrough"},{"src":"28:16","dst":"@exit","kind":"return"},{"src":"28:3","dst":"28:16","kind":"true"},{"src":"28:3","dst":"29:3","kind":"false"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"28:3"},{"src":"28:3","dst":"28:16"},{"src":"28:3","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"28:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"29:3","var":"n","prov":["reaching-defs"]}]}},"fields":{}},"src/closures.ts":{"source":"/** Closure capture and copy aliasing. */\n\nexport function makeCounter(start: number): () => number {\n let count = start;\n const inc = (): number => {\n count = count + 1; // writes the captured local\n return count;\n };\n return inc;\n}\n\nexport function useAlias(): number {\n const p = { f: 1 };\n const q = p; // q and p alias the same object\n q.f = 42; // write through q ...\n return p.f; // ... must reach this read through p\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Closure capture and copy aliasing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/closures.ts","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,441]},"types":{},"functions":{"makeCounter":{"name":"makeCounter","signature":"src/closures.makeCounter","comments":[{"content":"Closure capture and copy aliasing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"decorators":[],"parameters":[{"name":"start","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":29,"end_column":42}],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,21],"bytes":[104,122]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[8,5],"bytes":[125,227]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,14],"bytes":[230,241]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]}}},"callables":{"inc":{"name":"inc","signature":"src/closures.makeCounter.inc","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter/inc","span":{"start":[5,9],"end":[8,4],"bytes":[131,226]},"body":{"@entry":{"kind":"entry","span":{"start":[5,15],"end":[8,4],"bytes":[137,226]}},"6:5":{"kind":"statement","span":{"start":[6,5],"end":[6,23],"bytes":[157,175]}},"7:5":{"kind":"statement","span":{"start":[7,5],"end":[7,18],"bytes":[209,222]}},"@exit":{"kind":"exit","span":{"start":[5,15],"end":[8,4],"bytes":[137,226]}}},"cfg":[{"src":"@entry","dst":"6:5","kind":"fallthrough"},{"src":"6:5","dst":"7:5","kind":"fallthrough"},{"src":"7:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"6:5"},{"src":"@entry","dst":"7:5"}],"ddg":[{"src":"@entry","dst":"6:5","var":"count","prov":["reaching-defs"]},{"src":"@entry","dst":"7:5","var":"count","prov":["reaching-defs"]},{"src":"6:5","dst":"7:5","var":"count","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"4:3","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:3"},{"src":"@entry","dst":"5:3"},{"src":"@entry","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"4:3","var":"start","prov":["reaching-defs"]},{"src":"4:3","dst":"5:3","var":"count","prov":["reaching-defs"]},{"src":"5:3","dst":"9:3","var":"inc","prov":["reaching-defs"]}]},"useAlias":{"name":"useAlias","signature":"src/closures.useAlias","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/useAlias","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]},"body":{"@entry":{"kind":"entry","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,22],"bytes":[284,303]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,15],"bytes":[306,318]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,12],"bytes":[354,363]}},"16:3":{"kind":"statement","span":{"start":[16,3],"end":[16,14],"bytes":[389,400]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]}}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"},{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"15:3"},{"src":"@entry","dst":"16:3"}],"ddg":[{"src":"13:3","dst":"14:3","var":"p","prov":["reaching-defs"]},{"src":"14:3","dst":"16:3","var":"p.f","prov":["reaching-defs"]},{"src":"15:3","dst":"16:3","var":"p.f","prov":["reaching-defs"]}]}},"fields":{}},"src/flow.ts":{"source":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */\n\nexport function classify(n: number): string {\n let label = \"none\";\n if (n > 0) {\n label = \"pos\";\n } else {\n label = \"neg\";\n }\n return label;\n}\n\nexport function sumTo(n: number): number {\n let acc = 0;\n for (let i = 0; i < n; i++) {\n acc = acc + i; // loop-carried dependency: acc feeds itself around the back edge\n }\n return acc;\n}\n\nexport function early(n: number): number {\n if (n < 0) {\n return -1; // early return (multi-exit normalization)\n }\n const r = n * 2;\n return r;\n}\n\nexport function parse(s: string): number {\n const v = Number(s);\n if (Number.isNaN(v)) {\n throw new Error(`bad input: ${s}`);\n }\n return v;\n}\n\nexport function guarded(s: string): number {\n let out = 0;\n try {\n out = parse(s); // may throw → exception edge into the catch node\n } catch (e) {\n out = -1;\n } finally {\n touch(out);\n }\n return out;\n}\n\nexport function touch(x: number): void {\n void x;\n}\n\nexport function pickDay(d: number): string {\n let name = \"\";\n switch (d) {\n case 0:\n name = \"sun\";\n break;\n case 6:\n name = \"sat\";\n break;\n default:\n name = \"weekday\";\n }\n return name;\n}\n\nexport function spin(): number {\n let ticks = 0;\n while (true) {\n ticks = ticks + 1; // infinite loop: the dead loop-exit edge keeps EXIT reachable\n if (ticks > 3) {\n break;\n }\n }\n return ticks;\n}\n\nexport function shadow(): number {\n const x = 1;\n {\n const x = 2; // shadows the outer x — must NOT leak DDG edges across scopes\n touch(x);\n }\n return x;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/flow.ts","kind":"module","span":{"start":[1,1],"end":[87,1],"bytes":[0,1634]},"types":{},"functions":{"classify":{"name":"classify","signature":"src/flow.classify","comments":[{"content":"Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/classify","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,22],"bytes":[146,165]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[9,4],"bytes":[168,233]}},"6:5":{"kind":"statement","span":{"start":[6,5],"end":[6,19],"bytes":[185,199]}},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,19],"bytes":[215,229]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,16],"bytes":[236,249]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]}}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"},{"src":"4:3","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"6:5","kind":"true"},{"src":"5:3","dst":"8:5","kind":"false"},{"src":"6:5","dst":"10:3","kind":"fallthrough"},{"src":"8:5","dst":"10:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"10:3"},{"src":"@entry","dst":"4:3"},{"src":"@entry","dst":"5:3"},{"src":"5:3","dst":"6:5"},{"src":"5:3","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"5:3","var":"n","prov":["reaching-defs"]},{"src":"6:5","dst":"10:3","var":"label","prov":["reaching-defs"]},{"src":"8:5","dst":"10:3","var":"label","prov":["reaching-defs"]}]},"sumTo":{"name":"sumTo","signature":"src/flow.sumTo","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/sumTo","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]},"body":{"@entry":{"kind":"entry","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,15],"bytes":[298,310]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[17,4],"bytes":[313,431]}},"16:5":{"kind":"statement","span":{"start":[16,5],"end":[16,19],"bytes":[347,361]}},"18:3":{"kind":"statement","span":{"start":[18,3],"end":[18,14],"bytes":[434,445]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]}}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"16:5","kind":"true"},{"src":"15:3","dst":"18:3","kind":"false"},{"src":"16:5","dst":"15:3","kind":"loop_back"},{"src":"18:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"15:3"},{"src":"@entry","dst":"18:3"},{"src":"15:3","dst":"16:5"}],"ddg":[{"src":"@entry","dst":"15:3","var":"n","prov":["reaching-defs"]},{"src":"14:3","dst":"16:5","var":"acc","prov":["reaching-defs"]},{"src":"14:3","dst":"18:3","var":"acc","prov":["reaching-defs"]},{"src":"15:3","dst":"15:3","var":"i","prov":["reaching-defs"]},{"src":"15:3","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"16:5","var":"acc","prov":["reaching-defs"]},{"src":"16:5","dst":"18:3","var":"acc","prov":["reaching-defs"]}]},"early":{"name":"early","signature":"src/flow.early","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/early","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]},"body":{"@entry":{"kind":"entry","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]}},"22:3":{"kind":"statement","span":{"start":[22,3],"end":[24,4],"bytes":[494,568]}},"23:5":{"kind":"statement","span":{"start":[23,5],"end":[23,15],"bytes":[511,521]}},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[25,19],"bytes":[571,587]}},"26:3":{"kind":"statement","span":{"start":[26,3],"end":[26,12],"bytes":[590,599]}},"@exit":{"kind":"exit","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]}}},"cfg":[{"src":"@entry","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"23:5","kind":"true"},{"src":"22:3","dst":"25:3","kind":"false"},{"src":"23:5","dst":"@exit","kind":"return"},{"src":"25:3","dst":"26:3","kind":"fallthrough"},{"src":"26:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"22:3"},{"src":"22:3","dst":"23:5"},{"src":"22:3","dst":"25:3"},{"src":"22:3","dst":"26:3"}],"ddg":[{"src":"@entry","dst":"22:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"25:3","var":"n","prov":["reaching-defs"]},{"src":"25:3","dst":"26:3","var":"r","prov":["reaching-defs"]}]},"parse":{"name":"parse","signature":"src/flow.parse","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":29,"end_line":29,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/parse","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]},"body":{"30:13":{"method_name":"Number","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,13],"end":[30,22],"bytes":[658,667]},"callee":null},"31:7":{"method_name":"isNaN","receiver_expr":"Number","receiver_type":"NumberConstructor","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,7],"end":[31,22],"bytes":[675,690]},"callee":"can://typescript/dataflow-app/@external/(builtin)/isNaN"},"32:11":{"method_name":"Error","argument_types":["string"],"type_arguments":[],"return_type":"Error","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[32,11],"end":[32,39],"bytes":[704,732]},"callee":null},"@entry":{"kind":"entry","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]}},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,23],"bytes":[648,668]}},"31:3":{"kind":"statement","span":{"start":[31,3],"end":[33,4],"bytes":[671,737]}},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,40],"bytes":[698,733]}},"34:3":{"kind":"statement","span":{"start":[34,3],"end":[34,12],"bytes":[740,749]}},"@exit":{"kind":"exit","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]}}},"cfg":[{"src":"@entry","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"exception"},{"src":"30:3","dst":"31:3","kind":"fallthrough"},{"src":"31:3","dst":"@exit","kind":"exception"},{"src":"31:3","dst":"32:5","kind":"true"},{"src":"31:3","dst":"34:3","kind":"false"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"34:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"30:3"},{"src":"30:3","dst":"31:3"},{"src":"31:3","dst":"32:5"},{"src":"31:3","dst":"34:3"}],"ddg":[{"src":"@entry","dst":"30:3","var":"s","prov":["reaching-defs"]},{"src":"@entry","dst":"32:5","var":"s","prov":["reaching-defs"]},{"src":"30:3","dst":"31:3","var":"v","prov":["reaching-defs"]},{"src":"30:3","dst":"34:3","var":"v","prov":["reaching-defs"]}]},"guarded":{"name":"guarded","signature":"src/flow.guarded","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/guarded","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]},"body":{"40:11":{"method_name":"parse","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,11],"end":[40,19],"bytes":[831,839]},"callee":"can://typescript/dataflow-app/src/flow.ts/parse"},"44:5":{"method_name":"touch","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[44,5],"end":[44,15],"bytes":[939,949]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"},"@entry":{"kind":"entry","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]}},"38:3":{"kind":"statement","span":{"start":[38,3],"end":[38,15],"bytes":[800,812]}},"40:5":{"kind":"statement","span":{"start":[40,5],"end":[40,20],"bytes":[825,840]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[43,4],"bytes":[895,924]}},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[42,14],"bytes":[911,920]}},"46:3":{"kind":"statement","span":{"start":[46,3],"end":[46,14],"bytes":[957,968]}},"@exit":{"kind":"exit","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]}}},"cfg":[{"src":"@entry","dst":"38:3","kind":"fallthrough"},{"src":"38:3","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"41:5","kind":"exception"},{"src":"40:5","dst":"44:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"44:5","kind":"fallthrough"},{"src":"44:5","dst":"@exit","kind":"exception"},{"src":"44:5","dst":"46:3","kind":"fallthrough"},{"src":"46:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"38:3"},{"src":"@entry","dst":"40:5"},{"src":"@entry","dst":"44:5"},{"src":"40:5","dst":"41:5"},{"src":"40:5","dst":"42:5"},{"src":"44:5","dst":"46:3"}],"ddg":[{"src":"@entry","dst":"40:5","var":"s","prov":["reaching-defs"]},{"src":"40:5","dst":"44:5","var":"out","prov":["reaching-defs"]},{"src":"40:5","dst":"46:3","var":"out","prov":["reaching-defs"]},{"src":"42:5","dst":"44:5","var":"out","prov":["reaching-defs"]},{"src":"42:5","dst":"46:3","var":"out","prov":["reaching-defs"]}]},"touch":{"name":"touch","signature":"src/flow.touch","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":49,"end_line":49,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/touch","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]},"body":{"@entry":{"kind":"entry","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]}},"50:3":{"kind":"statement","span":{"start":[50,3],"end":[50,10],"bytes":[1015,1022]}},"@exit":{"kind":"exit","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]}}},"cfg":[{"src":"@entry","dst":"50:3","kind":"fallthrough"},{"src":"50:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"50:3"}],"ddg":[{"src":"@entry","dst":"50:3","var":"x","prov":["reaching-defs"]}]},"pickDay":{"name":"pickDay","signature":"src/flow.pickDay","comments":[],"decorators":[],"parameters":[{"name":"d","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":53,"end_line":53,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/pickDay","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]},"body":{"@entry":{"kind":"entry","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]}},"54:3":{"kind":"statement","span":{"start":[54,3],"end":[54,17],"bytes":[1073,1087]}},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[64,4],"bytes":[1090,1233]}},"57:7":{"kind":"statement","span":{"start":[57,7],"end":[57,20],"bytes":[1121,1134]}},"58:7":{"kind":"statement","span":{"start":[58,7],"end":[58,13],"bytes":[1141,1147]}},"60:7":{"kind":"statement","span":{"start":[60,7],"end":[60,20],"bytes":[1166,1179]}},"61:7":{"kind":"statement","span":{"start":[61,7],"end":[61,13],"bytes":[1186,1192]}},"63:7":{"kind":"statement","span":{"start":[63,7],"end":[63,24],"bytes":[1212,1229]}},"65:3":{"kind":"statement","span":{"start":[65,3],"end":[65,15],"bytes":[1236,1248]}},"@exit":{"kind":"exit","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]}}},"cfg":[{"src":"@entry","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"57:7","kind":"switch_case"},{"src":"55:3","dst":"60:7","kind":"switch_case"},{"src":"55:3","dst":"63:7","kind":"switch_case"},{"src":"57:7","dst":"58:7","kind":"fallthrough"},{"src":"58:7","dst":"65:3","kind":"break"},{"src":"60:7","dst":"61:7","kind":"fallthrough"},{"src":"61:7","dst":"65:3","kind":"break"},{"src":"63:7","dst":"65:3","kind":"fallthrough"},{"src":"65:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"54:3"},{"src":"@entry","dst":"55:3"},{"src":"@entry","dst":"65:3"},{"src":"55:3","dst":"57:7"},{"src":"55:3","dst":"58:7"},{"src":"55:3","dst":"60:7"},{"src":"55:3","dst":"61:7"},{"src":"55:3","dst":"63:7"}],"ddg":[{"src":"@entry","dst":"55:3","var":"d","prov":["reaching-defs"]},{"src":"57:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"60:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"63:7","dst":"65:3","var":"name","prov":["reaching-defs"]}]},"spin":{"name":"spin","signature":"src/flow.spin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/spin","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]},"body":{"@entry":{"kind":"entry","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]}},"69:3":{"kind":"statement","span":{"start":[69,3],"end":[69,17],"bytes":[1287,1301]}},"70:3":{"kind":"statement","span":{"start":[70,3],"end":[75,4],"bytes":[1304,1448]}},"71:5":{"kind":"statement","span":{"start":[71,5],"end":[71,23],"bytes":[1323,1341]}},"72:5":{"kind":"statement","span":{"start":[72,5],"end":[74,6],"bytes":[1409,1444]}},"73:7":{"kind":"statement","span":{"start":[73,7],"end":[73,13],"bytes":[1432,1438]}},"76:3":{"kind":"statement","span":{"start":[76,3],"end":[76,16],"bytes":[1451,1464]}},"@exit":{"kind":"exit","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]}}},"cfg":[{"src":"@entry","dst":"69:3","kind":"fallthrough"},{"src":"69:3","dst":"70:3","kind":"fallthrough"},{"src":"70:3","dst":"71:5","kind":"true"},{"src":"70:3","dst":"76:3","kind":"false"},{"src":"71:5","dst":"72:5","kind":"fallthrough"},{"src":"72:5","dst":"70:3","kind":"loop_back"},{"src":"72:5","dst":"73:7","kind":"true"},{"src":"73:7","dst":"76:3","kind":"break"},{"src":"76:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"69:3"},{"src":"@entry","dst":"70:3"},{"src":"@entry","dst":"76:3"},{"src":"70:3","dst":"71:5"},{"src":"70:3","dst":"72:5"},{"src":"72:5","dst":"70:3"},{"src":"72:5","dst":"73:7"}],"ddg":[{"src":"69:3","dst":"71:5","var":"ticks","prov":["reaching-defs"]},{"src":"69:3","dst":"76:3","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"71:5","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"72:5","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"76:3","var":"ticks","prov":["reaching-defs"]}]},"shadow":{"name":"shadow","signature":"src/flow.shadow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/shadow","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]},"body":{"83:5":{"method_name":"touch","argument_types":["2"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[83,5],"end":[83,13],"bytes":[1606,1614]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"},"@entry":{"kind":"entry","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]}},"80:3":{"kind":"statement","span":{"start":[80,3],"end":[80,15],"bytes":[1505,1517]}},"82:5":{"kind":"statement","span":{"start":[82,5],"end":[82,17],"bytes":[1526,1538]}},"85:3":{"kind":"statement","span":{"start":[85,3],"end":[85,12],"bytes":[1622,1631]}},"@exit":{"kind":"exit","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]}}},"cfg":[{"src":"@entry","dst":"80:3","kind":"fallthrough"},{"src":"80:3","dst":"82:5","kind":"fallthrough"},{"src":"82:5","dst":"83:5","kind":"fallthrough"},{"src":"83:5","dst":"@exit","kind":"exception"},{"src":"83:5","dst":"85:3","kind":"fallthrough"},{"src":"85:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"80:3"},{"src":"@entry","dst":"82:5"},{"src":"@entry","dst":"83:5"},{"src":"83:5","dst":"85:3"}],"ddg":[{"src":"80:3","dst":"85:3","var":"x","prov":["reaching-defs"]},{"src":"82:5","dst":"83:5","var":"x","prov":["reaching-defs"]}]}},"fields":{}},"src/hierarchy.ts":{"source":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */\n\nexport interface Shape {\n area(): number;\n}\n\nexport interface Labeled {\n readonly label: string;\n}\n\nexport interface ColoredShape extends Shape {\n readonly color: string;\n}\n\nexport class Rectangle implements Shape {\n constructor(\n protected readonly width: number,\n protected readonly height: number,\n ) {}\n\n area(): number {\n return this.width * this.height;\n }\n}\n\nexport class Square extends Rectangle implements Labeled {\n readonly label = \"square\";\n\n constructor(side: number) {\n super(side, side);\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts","kind":"module","span":{"start":[1,1],"end":[34,1],"bytes":[0,712]},"types":{"Rectangle":{"name":"Rectangle","signature":"src/hierarchy.Rectangle","comments":[],"decorators":[],"base_classes":["src/hierarchy.Shape"],"implements_types":["src/hierarchy.Shape"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle","kind":"class","span":{"start":[16,1],"end":[25,2],"bytes":[359,562]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Rectangle.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]},"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]}},"23:5":{"kind":"statement","span":{"start":[23,5],"end":[23,37],"bytes":[524,556]}},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]}}},"cfg":[{"src":"@entry","dst":"23:5","kind":"fallthrough"},{"src":"23:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"23:5"}],"ddg":[{"src":"@entry","dst":"23:5","var":"this.height","prov":["reaching-defs"]},{"src":"@entry","dst":"23:5","var":"this.width","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/hierarchy.Rectangle.constructor","comments":[],"decorators":[],"parameters":[{"name":"width","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":18,"end_line":18,"start_column":5,"end_column":37},{"name":"height","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":19,"end_line":19,"start_column":5,"end_column":38}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]},"body":{"@entry":{"kind":"entry","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]}},"@exit":{"kind":"exit","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"width":{"name":"width","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width","kind":"field"},"height":{"name":"height","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height","kind":"field"}},"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]},"Square":{"name":"Square","signature":"src/hierarchy.Square","comments":[],"decorators":[],"base_classes":["src/hierarchy.Rectangle","src/hierarchy.Labeled"],"implements_types":["src/hierarchy.Labeled"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square","kind":"class","span":{"start":[27,1],"end":[33,2],"bytes":[564,711]},"callables":{"constructor":{"name":"constructor","signature":"src/hierarchy.Square.constructor","comments":[],"decorators":[],"parameters":[{"name":"side","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":30,"end_line":30,"start_column":15,"end_column":27}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]},"body":{"31:5":{"method_name":"super","argument_types":["number","number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,22],"bytes":[687,704]},"callee":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor"},"@entry":{"kind":"entry","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]}},"@exit":{"kind":"exit","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]}}},"cfg":[{"src":"@entry","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"31:5"}],"ddg":[{"src":"@entry","dst":"31:5","var":"side","prov":["reaching-defs"]}]}},"fields":{"label":{"name":"label","type":"\"square\"","comments":[],"decorators":[],"initializer":"\"square\"","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/label","kind":"field","span":{"start":[28,3],"end":[28,29],"bytes":[625,651]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Rectangle"],"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Labeled"]},"Shape":{"name":"Shape","signature":"src/hierarchy.Shape","comments":[{"content":"A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\nprojection, including interface→interface EXTENDS (`ColoredShape extends Shape`).","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape","kind":"interface","span":{"start":[4,1],"end":[6,2],"bytes":[182,226]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Shape.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape/area","span":{"start":[5,3],"end":[5,18],"bytes":[209,224]},"body":{}}},"fields":{}},"Labeled":{"name":"Labeled","signature":"src/hierarchy.Labeled","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled","kind":"interface","span":{"start":[8,1],"end":[10,2],"bytes":[228,282]},"callables":{},"fields":{"label":{"name":"label","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label","kind":"field","span":{"start":[9,3],"end":[9,26],"bytes":[257,280]}}}},"ColoredShape":{"name":"ColoredShape","signature":"src/hierarchy.ColoredShape","comments":[],"base_classes":["src/hierarchy.Shape"],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape","kind":"interface","span":{"start":[12,1],"end":[14,2],"bytes":[284,357]},"callables":{},"fields":{"color":{"name":"color","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color","kind":"field","span":{"start":[13,3],"end":[13,26],"bytes":[332,355]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]}},"functions":{},"fields":{}},"src/main.ts":{"source":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */\nimport { a } from \"./chain\";\nimport { bump, readCounter } from \"./state\";\n\nexport function main(): number {\n bump(3);\n const r = a(readCounter());\n return r;\n}\n","imports":[{"module":"./chain","name":"a","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":29},{"module":"./state","name":"bump","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45},{"module":"./state","name":"readCounter","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45}],"exports":[],"comments":[{"content":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":81}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/main.ts","kind":"module","span":{"start":[1,1],"end":[10,1],"bytes":[0,244]},"types":{},"functions":{"main":{"name":"main","signature":"src/main.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/main.ts/main","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]},"body":{"6:3":{"method_name":"bump","argument_types":["3"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[6,3],"end":[6,10],"bytes":[191,198]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"7:13":{"method_name":"a","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,13],"end":[7,29],"bytes":[212,228]},"callee":"can://typescript/dataflow-app/src/chain.ts/a"},"7:15":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,15],"end":[7,28],"bytes":[214,227]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"},"@entry":{"kind":"entry","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,30],"bytes":[202,229]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,12],"bytes":[232,241]}},"@exit":{"kind":"exit","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]}}},"cfg":[{"src":"@entry","dst":"6:3","kind":"fallthrough"},{"src":"6:3","dst":"@exit","kind":"exception"},{"src":"6:3","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"6:3"},{"src":"6:3","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"6:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"@entry","dst":"7:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"6:3","dst":"7:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"r","prov":["reaching-defs"]}]}},"fields":{}},"src/state.ts":{"source":"/** Module-level global state: written in one function, read in another. */\n\nexport let counter = 0;\n\nexport function bump(by: number): void {\n counter = counter + by; // global write\n}\n\nexport function readCounter(): number {\n return counter; // global read that flows to the return value\n}\n\nexport function churn(by: number): number {\n bump(by); // transitive global write lands on this callsite node\n return readCounter(); // transitive global read\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Module-level global state: written in one function, read in another. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":76}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/state.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,458]},"types":{},"functions":{"bump":{"name":"bump","signature":"src/state.bump","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":5,"end_line":5,"start_column":22,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/bump","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]},"body":{"@entry":{"kind":"entry","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]}},"6:3":{"kind":"statement","span":{"start":[6,3],"end":[6,26],"bytes":[145,168]}},"@exit":{"kind":"exit","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]}}},"cfg":[{"src":"@entry","dst":"6:3","kind":"fallthrough"},{"src":"6:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"6:3"}],"ddg":[{"src":"@entry","dst":"6:3","var":"by","prov":["reaching-defs"]},{"src":"@entry","dst":"6:3","var":"src/state.counter","prov":["reaching-defs"]}]},"readCounter":{"name":"readCounter","signature":"src/state.readCounter","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/readCounter","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]},"body":{"@entry":{"kind":"entry","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,18],"bytes":[230,245]}},"@exit":{"kind":"exit","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]}}},"cfg":[{"src":"@entry","dst":"10:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"10:3"}],"ddg":[{"src":"@entry","dst":"10:3","var":"src/state.counter","prov":["reaching-defs"]}]},"churn":{"name":"churn","signature":"src/state.churn","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":33}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/churn","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]},"body":{"14:3":{"method_name":"bump","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,11],"bytes":[341,349]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"15:10":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,23],"bytes":[415,428]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"},"@entry":{"kind":"entry","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,24],"bytes":[408,429]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]}}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"14:3","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"by","prov":["reaching-defs"]},{"src":"@entry","dst":"14:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"@entry","dst":"15:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"14:3","dst":"15:3","var":"src/state.counter","prov":["reaching-defs"]}]}},"fields":{"counter":{"name":"counter","type":"number","initializer":"0","scope":"module","declaration_kind":"let","is_readonly":false,"is_exported":true,"id":"can://typescript/dataflow-app/src/state.ts/counter","kind":"field","span":{"start":[3,12],"end":[3,23],"bytes":[88,99]}}}},"src/susp.ts":{"source":"/** Suspension points (await/yield) and intra-statement expression control flow. */\n\nexport async function compute(x: number): Promise {\n return x * 2;\n}\n\nexport async function fetchTotal(x: number): Promise {\n const a = await compute(x); // await_resume edge out of this statement\n return a + 1;\n}\n\nexport function* numbers(n: number): Generator {\n let i = 0;\n while (i < n) {\n yield i; // yield (suspend/resume) edge\n i = i + 1;\n }\n return n;\n}\n\nexport function shortCircuit(a: { f?: number } | null, b: number): number {\n const v = (a && a.f) || b; // short-circuit stays intra-statement (documented rule)\n const w = a?.f ?? b; // optional chaining likewise\n return v + w;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Suspension points (await/yield) and intra-statement expression control flow. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/susp.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,735]},"types":{},"functions":{"compute":{"name":"compute","signature":"src/susp.compute","comments":[{"content":"Suspension points (await/yield) and intra-statement expression control flow.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":31,"end_column":40}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/compute","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,16],"bytes":[147,160]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]}}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"4:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:3"}],"ddg":[{"src":"@entry","dst":"4:3","var":"x","prov":["reaching-defs"]}]},"fetchTotal":{"name":"fetchTotal","signature":"src/susp.fetchTotal","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":34,"end_column":43}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]},"body":{"8:19":{"method_name":"compute","argument_types":["number"],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,19],"end":[8,29],"bytes":[245,255]},"callee":"can://typescript/dataflow-app/src/susp.ts/compute"},"@entry":{"kind":"entry","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,30],"bytes":[229,256]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,16],"bytes":[302,315]}},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]}}},"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"await_resume"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"},{"src":"8:3","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"x","prov":["reaching-defs"]},{"src":"8:3","dst":"9:3","var":"a","prov":["reaching-defs"]}]},"numbers":{"name":"numbers","signature":"src/susp.numbers","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"Generator","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":true,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/numbers","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]},"body":{"@entry":{"kind":"entry","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,13],"bytes":[395,405]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[17,4],"bytes":[408,486]}},"15:5":{"kind":"statement","span":{"start":[15,5],"end":[15,13],"bytes":[428,436]}},"16:5":{"kind":"statement","span":{"start":[16,5],"end":[16,15],"bytes":[472,482]}},"18:3":{"kind":"statement","span":{"start":[18,3],"end":[18,12],"bytes":[489,498]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]}}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:5","kind":"true"},{"src":"14:3","dst":"18:3","kind":"false"},{"src":"15:5","dst":"16:5","kind":"yield"},{"src":"16:5","dst":"14:3","kind":"loop_back"},{"src":"18:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"},{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"18:3"},{"src":"14:3","dst":"15:5"},{"src":"14:3","dst":"16:5"}],"ddg":[{"src":"@entry","dst":"14:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"18:3","var":"n","prov":["reaching-defs"]},{"src":"13:3","dst":"14:3","var":"i","prov":["reaching-defs"]},{"src":"13:3","dst":"15:5","var":"i","prov":["reaching-defs"]},{"src":"13:3","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"14:3","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"15:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"16:5","var":"i","prov":["reaching-defs"]}]},"shortCircuit":{"name":"shortCircuit","signature":"src/susp.shortCircuit","comments":[],"decorators":[],"parameters":[{"name":"a","type":"{ f?: number } | null","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":30,"end_column":54},{"name":"b","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":56,"end_column":65}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":4,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/shortCircuit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]},"body":{"@entry":{"kind":"entry","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]}},"22:3":{"kind":"statement","span":{"start":[22,3],"end":[22,29],"bytes":[580,606]}},"23:3":{"kind":"statement","span":{"start":[23,3],"end":[23,23],"bytes":[666,686]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,16],"bytes":[719,732]}},"@exit":{"kind":"exit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]}}},"cfg":[{"src":"@entry","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"23:3","kind":"fallthrough"},{"src":"23:3","dst":"24:3","kind":"fallthrough"},{"src":"24:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"22:3"},{"src":"@entry","dst":"23:3"},{"src":"@entry","dst":"24:3"}],"ddg":[{"src":"@entry","dst":"22:3","var":"a","prov":["reaching-defs"]},{"src":"@entry","dst":"22:3","var":"a.f","prov":["reaching-defs"]},{"src":"@entry","dst":"22:3","var":"b","prov":["reaching-defs"]},{"src":"@entry","dst":"23:3","var":"a.f","prov":["reaching-defs"]},{"src":"@entry","dst":"23:3","var":"b","prov":["reaching-defs"]},{"src":"22:3","dst":"24:3","var":"v","prov":["reaching-defs"]},{"src":"23:3","dst":"24:3","var":"w","prov":["reaching-defs"]}]}},"fields":{}},"src/taint.ts":{"source":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */\n\nexport function source(): string {\n return \"user-input\";\n}\n\nexport function sanitize(s: string): string {\n return s.replace(/dangerous/g, \"\");\n}\n\nexport function sink(s: string): void {\n void s;\n}\n\nexport function unsafeFlow(): void {\n const s = source();\n sink(s);\n}\n\nexport function safeFlow(): void {\n const s = sanitize(source());\n sink(s);\n}\n","imports":[],"exports":[],"comments":[{"content":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/taint.ts","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,536]},"types":{},"functions":{"source":{"name":"source","signature":"src/taint.source","comments":[{"content":"Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n(issue #2 PR E); the fixture carries the flows now so that PR only adds the query.","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/source","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]},"body":{"@entry":{"kind":"entry","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,23],"bytes":[219,239]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]}}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"}],"ddg":[]},"sanitize":{"name":"sanitize","signature":"src/taint.sanitize","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sanitize","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]},"body":{"11:10":{"method_name":"replace","receiver_expr":"s","receiver_type":"string","argument_types":["RegExp","\"\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[11,10],"end":[11,37],"bytes":[298,325]},"callee":"can://typescript/dataflow-app/@external/(builtin)/replace"},"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,38],"bytes":[291,326]}},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]}}},"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"11:3","var":"s.replace","prov":["reaching-defs"]}]},"sink":{"name":"sink","signature":"src/taint.sink","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":22,"end_column":31}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sink","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]},"body":{"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,10],"bytes":[372,379]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]}}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"s","prov":["reaching-defs"]}]},"unsafeFlow":{"name":"unsafeFlow","signature":"src/taint.unsafeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]},"body":{"19:13":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,13],"end":[19,21],"bytes":[432,440]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"20:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,3],"end":[20,10],"bytes":[444,451]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"},"@entry":{"kind":"entry","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,22],"bytes":[422,441]}},"@exit":{"kind":"exit","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]}}},"cfg":[{"src":"@entry","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"19:3"},{"src":"19:3","dst":"20:3"}],"ddg":[{"src":"19:3","dst":"20:3","var":"s","prov":["reaching-defs"]}]},"safeFlow":{"name":"safeFlow","signature":"src/taint.safeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/safeFlow","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]},"body":{"24:13":{"method_name":"sanitize","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,13],"end":[24,31],"bytes":[503,521]},"callee":"can://typescript/dataflow-app/src/taint.ts/sanitize"},"24:22":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,22],"end":[24,30],"bytes":[512,520]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"25:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,3],"end":[25,10],"bytes":[525,532]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"},"@entry":{"kind":"entry","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,32],"bytes":[493,522]}},"@exit":{"kind":"exit","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]}}},"cfg":[{"src":"@entry","dst":"24:3","kind":"fallthrough"},{"src":"24:3","dst":"@exit","kind":"exception"},{"src":"24:3","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"24:3"},{"src":"24:3","dst":"25:3"}],"ddg":[{"src":"24:3","dst":"25:3","var":"s","prov":["reaching-defs"]}]}},"fields":{}},"src/util.ts":{"source":"export function increment(v: number): number {\n return v + 1;\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[4,1],"bytes":[0,65]},"types":{},"functions":{"increment":{"name":"increment","signature":"src/util.increment","comments":[],"decorators":[],"parameters":[{"name":"v","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":1,"end_line":1,"start_column":27,"end_column":36}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/util.ts/increment","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]},"body":{"@entry":{"kind":"entry","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]}},"2:3":{"kind":"statement","span":{"start":[2,3],"end":[2,16],"bytes":[49,62]}},"@exit":{"kind":"exit","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]}}},"cfg":[{"src":"@entry","dst":"2:3","kind":"fallthrough"},{"src":"2:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"2:3"}],"ddg":[{"src":"@entry","dst":"2:3","var":"v","prov":["reaching-defs"]}]}},"fields":{}}},"call_graph":[{"src":"can://typescript/dataflow-app/src/chain.ts/b","dst":"can://typescript/dataflow-app/src/chain.ts/c","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/a","dst":"can://typescript/dataflow-app/src/chain.ts/b","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","dst":"can://typescript/dataflow-app/src/util.ts/increment","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd","dst":"can://typescript/dataflow-app/src/chain.ts/isEven","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/parse","dst":"can://typescript/dataflow-app/@external/(builtin)/isNaN","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/parse","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/shadow","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/chain.ts/a","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","dst":"can://typescript/dataflow-app/src/susp.ts/compute","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/sanitize","dst":"can://typescript/dataflow-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sanitize","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2}],"param_in":[],"param_out":[],"external_symbols":{"can://typescript/dataflow-app/@external/(builtin)/isNaN":{"id":"can://typescript/dataflow-app/@external/(builtin)/isNaN","kind":"external","module":"(builtin)","name":"isNaN"},"can://typescript/dataflow-app/@external/(builtin)/replace":{"id":"can://typescript/dataflow-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"}},"synthesized_callables":{}}} \ No newline at end of file diff --git a/test/goldens/dataflow-app-a4.json b/test/goldens/dataflow-app-a4.json deleted file mode 100644 index f3ab5ee..0000000 --- a/test/goldens/dataflow-app-a4.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/dataflow-app","kind":"application","symbol_table":{"src/chain.ts":{"source":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */\nimport { increment } from \"./util\";\n\nexport function c(z: number): number {\n return z + 1; // the parameter flows to the return value\n}\n\nexport function b(y: number): number {\n const fromC = c(y);\n return fromC;\n}\n\nexport function a(x: number): number {\n const fromB = b(x); // SUMMARY edge here: arg0 flows through b (and c) to the result\n return fromB;\n}\n\nexport function viaOtherFile(x: number): number {\n return increment(x); // cross-module CALL / PARAM_IN / PARAM_OUT edges\n}\n\nexport function isEven(n: number): boolean {\n if (n === 0) return true;\n return isOdd(n - 1); // mutual recursion: {isEven, isOdd} form an SCC\n}\n\nexport function isOdd(n: number): boolean {\n if (n === 0) return false;\n return isEven(n - 1);\n}\n","imports":[{"module":"./util","name":"increment","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":36}],"exports":[],"comments":[{"content":"/** Interprocedural chains: a → b → c value flow, cross-file flow, mutual recursion. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/chain.ts","kind":"module","span":{"start":[1,1],"end":[31,1],"bytes":[0,824]},"types":{},"functions":{"c":{"name":"c","signature":"src/chain.c","comments":[],"decorators":[],"parameters":[{"name":"z","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/c","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,16],"bytes":[166,179]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[125,224]}},"@formal_in:0":{"kind":"formal_in","of":"z"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"z","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"b":{"name":"b","signature":"src/chain.b","comments":[],"decorators":[],"parameters":[{"name":"y","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":8,"end_line":8,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/b","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]},"body":{"9:17":{"method_name":"c","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,17],"end":[9,21],"bytes":[281,285]},"callee":"can://typescript/dataflow-app/src/chain.ts/c"},"@entry":{"kind":"entry","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,22],"bytes":[267,286]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,16],"bytes":[289,302]}},"@exit":{"kind":"exit","span":{"start":[8,1],"end":[11,2],"bytes":[226,304]}},"@formal_in:0":{"kind":"formal_in","of":"y"},"@formal_out":{"kind":"formal_out","of":"$ret"},"9:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"9:3"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3"}},"cfg":[{"src":"@entry","dst":"9:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"10:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"9:3"},{"src":"9:3","dst":"10:3"}],"ddg":[{"src":"@entry","dst":"9:3","var":"y","prov":["reaching-defs"]},{"src":"10:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"9:3","dst":"10:3","var":"fromC","prov":["reaching-defs"]}],"summary":[{"src":"9:3/actual_in:0","dst":"9:3/actual_out"}]},"a":{"name":"a","signature":"src/chain.a","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":19,"end_column":28}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/a","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]},"body":{"14:17":{"method_name":"b","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,17],"end":[14,21],"bytes":[361,365]},"callee":"can://typescript/dataflow-app/src/chain.ts/b"},"@entry":{"kind":"entry","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,22],"bytes":[347,366]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,16],"bytes":[434,447]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[16,2],"bytes":[306,449]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"},"14:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:3"},"14:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:3"}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"14:3","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"x","prov":["reaching-defs"]},{"src":"14:3","dst":"15:3","var":"fromB","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"14:3/actual_in:0","dst":"14:3/actual_out"}]},"viaOtherFile":{"name":"viaOtherFile","signature":"src/chain.viaOtherFile","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":18,"end_line":18,"start_column":30,"end_column":39}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]},"body":{"19:10":{"method_name":"increment","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,10],"end":[19,22],"bytes":[510,522]},"callee":"can://typescript/dataflow-app/src/util.ts/increment"},"@entry":{"kind":"entry","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,23],"bytes":[503,523]}},"@exit":{"kind":"exit","span":{"start":[18,1],"end":[20,2],"bytes":[451,575]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3"}},"cfg":[{"src":"@entry","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"19:3"}],"ddg":[{"src":"@entry","dst":"19:3","var":"x","prov":["reaching-defs"]},{"src":"19:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"19:3/actual_in:0","dst":"19:3/actual_out"}]},"isEven":{"name":"isEven","signature":"src/chain.isEven","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":22,"end_line":22,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isEven","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]},"body":{"24:10":{"method_name":"isOdd","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,10],"end":[24,22],"bytes":[659,671]},"callee":"can://typescript/dataflow-app/src/chain.ts/isOdd"},"@entry":{"kind":"entry","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]}},"23:3":{"kind":"statement","span":{"start":[23,3],"end":[23,28],"bytes":[624,649]}},"23:16":{"kind":"statement","span":{"start":[23,16],"end":[23,28],"bytes":[637,649]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,23],"bytes":[652,672]}},"@exit":{"kind":"exit","span":{"start":[22,1],"end":[25,2],"bytes":[577,723]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"},"24:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"24:3"},"24:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"24:3"}},"cfg":[{"src":"@entry","dst":"23:3","kind":"fallthrough"},{"src":"23:16","dst":"@exit","kind":"return"},{"src":"23:3","dst":"23:16","kind":"true"},{"src":"23:3","dst":"24:3","kind":"false"},{"src":"24:3","dst":"@exit","kind":"exception"},{"src":"24:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"23:3"},{"src":"23:3","dst":"23:16"},{"src":"23:3","dst":"24:3"}],"ddg":[{"src":"@entry","dst":"23:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"24:3","var":"n","prov":["reaching-defs"]},{"src":"23:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"24:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"24:3/actual_in:0","dst":"24:3/actual_out"}]},"isOdd":{"name":"isOdd","signature":"src/chain.isOdd","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":27,"end_line":27,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/chain.ts/isOdd","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]},"body":{"29:10":{"method_name":"isEven","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,10],"end":[29,23],"bytes":[807,820]},"callee":"can://typescript/dataflow-app/src/chain.ts/isEven"},"@entry":{"kind":"entry","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]}},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,29],"bytes":[771,797]}},"28:16":{"kind":"statement","span":{"start":[28,16],"end":[28,29],"bytes":[784,797]}},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[29,24],"bytes":[800,821]}},"@exit":{"kind":"exit","span":{"start":[27,1],"end":[30,2],"bytes":[725,823]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"},"29:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"29:3"},"29:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"29:3"}},"cfg":[{"src":"@entry","dst":"28:3","kind":"fallthrough"},{"src":"28:16","dst":"@exit","kind":"return"},{"src":"28:3","dst":"28:16","kind":"true"},{"src":"28:3","dst":"29:3","kind":"false"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"28:3"},{"src":"28:3","dst":"28:16"},{"src":"28:3","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"28:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"29:3","var":"n","prov":["reaching-defs"]},{"src":"28:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"29:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"29:3/actual_in:0","dst":"29:3/actual_out"}]}},"fields":{}},"src/closures.ts":{"source":"/** Closure capture and copy aliasing. */\n\nexport function makeCounter(start: number): () => number {\n let count = start;\n const inc = (): number => {\n count = count + 1; // writes the captured local\n return count;\n };\n return inc;\n}\n\nexport function useAlias(): number {\n const p = { f: 1 };\n const q = p; // q and p alias the same object\n q.f = 42; // write through q ...\n return p.f; // ... must reach this read through p\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Closure capture and copy aliasing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/closures.ts","kind":"module","span":{"start":[1,1],"end":[18,1],"bytes":[0,441]},"types":{},"functions":{"makeCounter":{"name":"makeCounter","signature":"src/closures.makeCounter","comments":[{"content":"Closure capture and copy aliasing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":42}],"decorators":[],"parameters":[{"name":"start","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":29,"end_column":42}],"type_parameters":[],"return_type":"() => number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,21],"bytes":[104,122]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[8,5],"bytes":[125,227]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,14],"bytes":[230,241]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[10,2],"bytes":[43,243]}},"@formal_in:0":{"kind":"formal_in","of":"start"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"inc":{"name":"inc","signature":"src/closures.makeCounter.inc","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/makeCounter/inc","span":{"start":[5,9],"end":[8,4],"bytes":[131,226]},"body":{"@entry":{"kind":"entry","span":{"start":[5,15],"end":[8,4],"bytes":[137,226]}},"6:5":{"kind":"statement","span":{"start":[6,5],"end":[6,23],"bytes":[157,175]}},"7:5":{"kind":"statement","span":{"start":[7,5],"end":[7,18],"bytes":[209,222]}},"@exit":{"kind":"exit","span":{"start":[5,15],"end":[8,4],"bytes":[137,226]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"6:5","kind":"fallthrough"},{"src":"6:5","dst":"7:5","kind":"fallthrough"},{"src":"7:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"6:5"},{"src":"@entry","dst":"7:5"}],"ddg":[{"src":"@entry","dst":"6:5","var":"count","prov":["reaching-defs"]},{"src":"@entry","dst":"7:5","var":"count","prov":["reaching-defs"]},{"src":"6:5","dst":"7:5","var":"count","prov":["reaching-defs"]},{"src":"7:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"4:3","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:3"},{"src":"@entry","dst":"5:3"},{"src":"@entry","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"4:3","var":"start","prov":["reaching-defs"]},{"src":"4:3","dst":"5:3","var":"count","prov":["reaching-defs"]},{"src":"5:3","dst":"9:3","var":"inc","prov":["reaching-defs"]},{"src":"9:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"useAlias":{"name":"useAlias","signature":"src/closures.useAlias","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/closures.ts/useAlias","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]},"body":{"@entry":{"kind":"entry","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,22],"bytes":[284,303]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,15],"bytes":[306,318]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,12],"bytes":[354,363]}},"16:3":{"kind":"statement","span":{"start":[16,3],"end":[16,14],"bytes":[389,400]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[17,2],"bytes":[245,440]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"},{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"15:3"},{"src":"@entry","dst":"16:3"}],"ddg":[{"src":"13:3","dst":"14:3","var":"p","prov":["reaching-defs"]},{"src":"14:3","dst":"16:3","var":"p.f","prov":["reaching-defs"]},{"src":"15:3","dst":"16:3","var":"p.f","prov":["reaching-defs"]},{"src":"16:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/flow.ts":{"source":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */\n\nexport function classify(n: number): string {\n let label = \"none\";\n if (n > 0) {\n label = \"pos\";\n } else {\n label = \"neg\";\n }\n return label;\n}\n\nexport function sumTo(n: number): number {\n let acc = 0;\n for (let i = 0; i < n; i++) {\n acc = acc + i; // loop-carried dependency: acc feeds itself around the back edge\n }\n return acc;\n}\n\nexport function early(n: number): number {\n if (n < 0) {\n return -1; // early return (multi-exit normalization)\n }\n const r = n * 2;\n return r;\n}\n\nexport function parse(s: string): number {\n const v = Number(s);\n if (Number.isNaN(v)) {\n throw new Error(`bad input: ${s}`);\n }\n return v;\n}\n\nexport function guarded(s: string): number {\n let out = 0;\n try {\n out = parse(s); // may throw → exception edge into the catch node\n } catch (e) {\n out = -1;\n } finally {\n touch(out);\n }\n return out;\n}\n\nexport function touch(x: number): void {\n void x;\n}\n\nexport function pickDay(d: number): string {\n let name = \"\";\n switch (d) {\n case 0:\n name = \"sun\";\n break;\n case 6:\n name = \"sat\";\n break;\n default:\n name = \"weekday\";\n }\n return name;\n}\n\nexport function spin(): number {\n let ticks = 0;\n while (true) {\n ticks = ticks + 1; // infinite loop: the dead loop-exit edge keeps EXIT reachable\n if (ticks > 3) {\n break;\n }\n }\n return ticks;\n}\n\nexport function shadow(): number {\n const x = 1;\n {\n const x = 2; // shadows the outer x — must NOT leak DDG edges across scopes\n touch(x);\n }\n return x;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/flow.ts","kind":"module","span":{"start":[1,1],"end":[87,1],"bytes":[0,1634]},"types":{},"functions":{"classify":{"name":"classify","signature":"src/flow.classify","comments":[{"content":"Intraprocedural constructs: branches, loops, early return, exceptions, switch, shadowing.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":97}],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/classify","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,22],"bytes":[146,165]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[9,4],"bytes":[168,233]}},"6:5":{"kind":"statement","span":{"start":[6,5],"end":[6,19],"bytes":[185,199]}},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,19],"bytes":[215,229]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,16],"bytes":[236,249]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[11,2],"bytes":[98,251]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"},{"src":"4:3","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"6:5","kind":"true"},{"src":"5:3","dst":"8:5","kind":"false"},{"src":"6:5","dst":"10:3","kind":"fallthrough"},{"src":"8:5","dst":"10:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"10:3"},{"src":"@entry","dst":"4:3"},{"src":"@entry","dst":"5:3"},{"src":"5:3","dst":"6:5"},{"src":"5:3","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"5:3","var":"n","prov":["reaching-defs"]},{"src":"10:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"6:5","dst":"10:3","var":"label","prov":["reaching-defs"]},{"src":"8:5","dst":"10:3","var":"label","prov":["reaching-defs"]}],"summary":[]},"sumTo":{"name":"sumTo","signature":"src/flow.sumTo","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/sumTo","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]},"body":{"@entry":{"kind":"entry","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[14,15],"bytes":[298,310]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[17,4],"bytes":[313,431]}},"16:5":{"kind":"statement","span":{"start":[16,5],"end":[16,19],"bytes":[347,361]}},"18:3":{"kind":"statement","span":{"start":[18,3],"end":[18,14],"bytes":[434,445]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[19,2],"bytes":[253,447]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"16:5","kind":"true"},{"src":"15:3","dst":"18:3","kind":"false"},{"src":"16:5","dst":"15:3","kind":"loop_back"},{"src":"18:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"15:3"},{"src":"@entry","dst":"18:3"},{"src":"15:3","dst":"16:5"}],"ddg":[{"src":"@entry","dst":"15:3","var":"n","prov":["reaching-defs"]},{"src":"14:3","dst":"16:5","var":"acc","prov":["reaching-defs"]},{"src":"14:3","dst":"18:3","var":"acc","prov":["reaching-defs"]},{"src":"15:3","dst":"15:3","var":"i","prov":["reaching-defs"]},{"src":"15:3","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"16:5","var":"acc","prov":["reaching-defs"]},{"src":"16:5","dst":"18:3","var":"acc","prov":["reaching-defs"]},{"src":"18:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"early":{"name":"early","signature":"src/flow.early","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/early","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]},"body":{"@entry":{"kind":"entry","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]}},"22:3":{"kind":"statement","span":{"start":[22,3],"end":[24,4],"bytes":[494,568]}},"23:5":{"kind":"statement","span":{"start":[23,5],"end":[23,15],"bytes":[511,521]}},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[25,19],"bytes":[571,587]}},"26:3":{"kind":"statement","span":{"start":[26,3],"end":[26,12],"bytes":[590,599]}},"@exit":{"kind":"exit","span":{"start":[21,1],"end":[27,2],"bytes":[449,601]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"23:5","kind":"true"},{"src":"22:3","dst":"25:3","kind":"false"},{"src":"23:5","dst":"@exit","kind":"return"},{"src":"25:3","dst":"26:3","kind":"fallthrough"},{"src":"26:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"22:3"},{"src":"22:3","dst":"23:5"},{"src":"22:3","dst":"25:3"},{"src":"22:3","dst":"26:3"}],"ddg":[{"src":"@entry","dst":"22:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"25:3","var":"n","prov":["reaching-defs"]},{"src":"23:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"25:3","dst":"26:3","var":"r","prov":["reaching-defs"]},{"src":"26:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"parse":{"name":"parse","signature":"src/flow.parse","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":29,"end_line":29,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/parse","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]},"body":{"30:13":{"method_name":"Number","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,13],"end":[30,22],"bytes":[658,667]},"callee":null},"31:7":{"method_name":"isNaN","receiver_expr":"Number","receiver_type":"NumberConstructor","argument_types":["number"],"type_arguments":[],"return_type":"boolean","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,7],"end":[31,22],"bytes":[675,690]},"callee":"can://typescript/dataflow-app/@external/(builtin)/isNaN"},"32:11":{"method_name":"Error","argument_types":["string"],"type_arguments":[],"return_type":"Error","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[32,11],"end":[32,39],"bytes":[704,732]},"callee":null},"@entry":{"kind":"entry","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]}},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,23],"bytes":[648,668]}},"31:3":{"kind":"statement","span":{"start":[31,3],"end":[33,4],"bytes":[671,737]}},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,40],"bytes":[698,733]}},"34:3":{"kind":"statement","span":{"start":[34,3],"end":[34,12],"bytes":[740,749]}},"@exit":{"kind":"exit","span":{"start":[29,1],"end":[35,2],"bytes":[603,751]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"},"30:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:3"},"30:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:3"},"31:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:3"},"31:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:3"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5"}},"cfg":[{"src":"@entry","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"exception"},{"src":"30:3","dst":"31:3","kind":"fallthrough"},{"src":"31:3","dst":"@exit","kind":"exception"},{"src":"31:3","dst":"32:5","kind":"true"},{"src":"31:3","dst":"34:3","kind":"false"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"34:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"30:3"},{"src":"30:3","dst":"31:3"},{"src":"31:3","dst":"32:5"},{"src":"31:3","dst":"34:3"}],"ddg":[{"src":"@entry","dst":"30:3","var":"s","prov":["reaching-defs"]},{"src":"@entry","dst":"32:5","var":"s","prov":["reaching-defs"]},{"src":"30:3","dst":"31:3","var":"v","prov":["reaching-defs"]},{"src":"30:3","dst":"34:3","var":"v","prov":["reaching-defs"]},{"src":"34:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"30:3/actual_in:0","dst":"30:3/actual_out"},{"src":"31:3/actual_in:0","dst":"31:3/actual_out"},{"src":"32:5/actual_in:0","dst":"32:5/actual_out"}]},"guarded":{"name":"guarded","signature":"src/flow.guarded","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/guarded","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]},"body":{"40:11":{"method_name":"parse","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,11],"end":[40,19],"bytes":[831,839]},"callee":"can://typescript/dataflow-app/src/flow.ts/parse"},"44:5":{"method_name":"touch","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[44,5],"end":[44,15],"bytes":[939,949]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"},"@entry":{"kind":"entry","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]}},"38:3":{"kind":"statement","span":{"start":[38,3],"end":[38,15],"bytes":[800,812]}},"40:5":{"kind":"statement","span":{"start":[40,5],"end":[40,20],"bytes":[825,840]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[43,4],"bytes":[895,924]}},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[42,14],"bytes":[911,920]}},"46:3":{"kind":"statement","span":{"start":[46,3],"end":[46,14],"bytes":[957,968]}},"@exit":{"kind":"exit","span":{"start":[37,1],"end":[47,2],"bytes":[753,970]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5"},"44:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"44:5"},"44:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"44:5"}},"cfg":[{"src":"@entry","dst":"38:3","kind":"fallthrough"},{"src":"38:3","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"41:5","kind":"exception"},{"src":"40:5","dst":"44:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"44:5","kind":"fallthrough"},{"src":"44:5","dst":"@exit","kind":"exception"},{"src":"44:5","dst":"46:3","kind":"fallthrough"},{"src":"46:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"38:3"},{"src":"@entry","dst":"40:5"},{"src":"@entry","dst":"44:5"},{"src":"40:5","dst":"41:5"},{"src":"40:5","dst":"42:5"},{"src":"44:5","dst":"46:3"}],"ddg":[{"src":"@entry","dst":"40:5","var":"s","prov":["reaching-defs"]},{"src":"40:5","dst":"44:5","var":"out","prov":["reaching-defs"]},{"src":"40:5","dst":"46:3","var":"out","prov":["reaching-defs"]},{"src":"42:5","dst":"44:5","var":"out","prov":["reaching-defs"]},{"src":"42:5","dst":"46:3","var":"out","prov":["reaching-defs"]},{"src":"46:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"40:5/actual_in:0","dst":"40:5/actual_out"}]},"touch":{"name":"touch","signature":"src/flow.touch","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":49,"end_line":49,"start_column":23,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/touch","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]},"body":{"@entry":{"kind":"entry","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]}},"50:3":{"kind":"statement","span":{"start":[50,3],"end":[50,10],"bytes":[1015,1022]}},"@exit":{"kind":"exit","span":{"start":[49,1],"end":[51,2],"bytes":[972,1024]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"50:3","kind":"fallthrough"},{"src":"50:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"50:3"}],"ddg":[{"src":"@entry","dst":"50:3","var":"x","prov":["reaching-defs"]}],"summary":[]},"pickDay":{"name":"pickDay","signature":"src/flow.pickDay","comments":[],"decorators":[],"parameters":[{"name":"d","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":53,"end_line":53,"start_column":25,"end_column":34}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/pickDay","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]},"body":{"@entry":{"kind":"entry","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]}},"54:3":{"kind":"statement","span":{"start":[54,3],"end":[54,17],"bytes":[1073,1087]}},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[64,4],"bytes":[1090,1233]}},"57:7":{"kind":"statement","span":{"start":[57,7],"end":[57,20],"bytes":[1121,1134]}},"58:7":{"kind":"statement","span":{"start":[58,7],"end":[58,13],"bytes":[1141,1147]}},"60:7":{"kind":"statement","span":{"start":[60,7],"end":[60,20],"bytes":[1166,1179]}},"61:7":{"kind":"statement","span":{"start":[61,7],"end":[61,13],"bytes":[1186,1192]}},"63:7":{"kind":"statement","span":{"start":[63,7],"end":[63,24],"bytes":[1212,1229]}},"65:3":{"kind":"statement","span":{"start":[65,3],"end":[65,15],"bytes":[1236,1248]}},"@exit":{"kind":"exit","span":{"start":[53,1],"end":[66,2],"bytes":[1026,1250]}},"@formal_in:0":{"kind":"formal_in","of":"d"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"57:7","kind":"switch_case"},{"src":"55:3","dst":"60:7","kind":"switch_case"},{"src":"55:3","dst":"63:7","kind":"switch_case"},{"src":"57:7","dst":"58:7","kind":"fallthrough"},{"src":"58:7","dst":"65:3","kind":"break"},{"src":"60:7","dst":"61:7","kind":"fallthrough"},{"src":"61:7","dst":"65:3","kind":"break"},{"src":"63:7","dst":"65:3","kind":"fallthrough"},{"src":"65:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"54:3"},{"src":"@entry","dst":"55:3"},{"src":"@entry","dst":"65:3"},{"src":"55:3","dst":"57:7"},{"src":"55:3","dst":"58:7"},{"src":"55:3","dst":"60:7"},{"src":"55:3","dst":"61:7"},{"src":"55:3","dst":"63:7"}],"ddg":[{"src":"@entry","dst":"55:3","var":"d","prov":["reaching-defs"]},{"src":"57:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"60:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"63:7","dst":"65:3","var":"name","prov":["reaching-defs"]},{"src":"65:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"spin":{"name":"spin","signature":"src/flow.spin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":3,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/spin","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]},"body":{"@entry":{"kind":"entry","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]}},"69:3":{"kind":"statement","span":{"start":[69,3],"end":[69,17],"bytes":[1287,1301]}},"70:3":{"kind":"statement","span":{"start":[70,3],"end":[75,4],"bytes":[1304,1448]}},"71:5":{"kind":"statement","span":{"start":[71,5],"end":[71,23],"bytes":[1323,1341]}},"72:5":{"kind":"statement","span":{"start":[72,5],"end":[74,6],"bytes":[1409,1444]}},"73:7":{"kind":"statement","span":{"start":[73,7],"end":[73,13],"bytes":[1432,1438]}},"76:3":{"kind":"statement","span":{"start":[76,3],"end":[76,16],"bytes":[1451,1464]}},"@exit":{"kind":"exit","span":{"start":[68,1],"end":[77,2],"bytes":[1252,1466]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"69:3","kind":"fallthrough"},{"src":"69:3","dst":"70:3","kind":"fallthrough"},{"src":"70:3","dst":"71:5","kind":"true"},{"src":"70:3","dst":"76:3","kind":"false"},{"src":"71:5","dst":"72:5","kind":"fallthrough"},{"src":"72:5","dst":"70:3","kind":"loop_back"},{"src":"72:5","dst":"73:7","kind":"true"},{"src":"73:7","dst":"76:3","kind":"break"},{"src":"76:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"69:3"},{"src":"@entry","dst":"70:3"},{"src":"@entry","dst":"76:3"},{"src":"70:3","dst":"71:5"},{"src":"70:3","dst":"72:5"},{"src":"72:5","dst":"70:3"},{"src":"72:5","dst":"73:7"}],"ddg":[{"src":"69:3","dst":"71:5","var":"ticks","prov":["reaching-defs"]},{"src":"69:3","dst":"76:3","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"71:5","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"72:5","var":"ticks","prov":["reaching-defs"]},{"src":"71:5","dst":"76:3","var":"ticks","prov":["reaching-defs"]},{"src":"76:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"shadow":{"name":"shadow","signature":"src/flow.shadow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/flow.ts/shadow","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]},"body":{"83:5":{"method_name":"touch","argument_types":["2"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[83,5],"end":[83,13],"bytes":[1606,1614]},"callee":"can://typescript/dataflow-app/src/flow.ts/touch"},"@entry":{"kind":"entry","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]}},"80:3":{"kind":"statement","span":{"start":[80,3],"end":[80,15],"bytes":[1505,1517]}},"82:5":{"kind":"statement","span":{"start":[82,5],"end":[82,17],"bytes":[1526,1538]}},"85:3":{"kind":"statement","span":{"start":[85,3],"end":[85,12],"bytes":[1622,1631]}},"@exit":{"kind":"exit","span":{"start":[79,1],"end":[86,2],"bytes":[1468,1633]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"83:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"83:5"},"83:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"83:5"}},"cfg":[{"src":"@entry","dst":"80:3","kind":"fallthrough"},{"src":"80:3","dst":"82:5","kind":"fallthrough"},{"src":"82:5","dst":"83:5","kind":"fallthrough"},{"src":"83:5","dst":"@exit","kind":"exception"},{"src":"83:5","dst":"85:3","kind":"fallthrough"},{"src":"85:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"80:3"},{"src":"@entry","dst":"82:5"},{"src":"@entry","dst":"83:5"},{"src":"83:5","dst":"85:3"}],"ddg":[{"src":"80:3","dst":"85:3","var":"x","prov":["reaching-defs"]},{"src":"82:5","dst":"83:5","var":"x","prov":["reaching-defs"]},{"src":"85:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/hierarchy.ts":{"source":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */\n\nexport interface Shape {\n area(): number;\n}\n\nexport interface Labeled {\n readonly label: string;\n}\n\nexport interface ColoredShape extends Shape {\n readonly color: string;\n}\n\nexport class Rectangle implements Shape {\n constructor(\n protected readonly width: number,\n protected readonly height: number,\n ) {}\n\n area(): number {\n return this.width * this.height;\n }\n}\n\nexport class Square extends Rectangle implements Labeled {\n readonly label = \"square\";\n\n constructor(side: number) {\n super(side, side);\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\n * projection, including interface→interface EXTENDS (`ColoredShape extends Shape`). */","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts","kind":"module","span":{"start":[1,1],"end":[34,1],"bytes":[0,712]},"types":{"Rectangle":{"name":"Rectangle","signature":"src/hierarchy.Rectangle","comments":[],"decorators":[],"base_classes":["src/hierarchy.Shape"],"implements_types":["src/hierarchy.Shape"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle","kind":"class","span":{"start":[16,1],"end":[25,2],"bytes":[359,562]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Rectangle.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]},"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]}},"23:5":{"kind":"statement","span":{"start":[23,5],"end":[23,37],"bytes":[524,556]}},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[24,4],"bytes":[503,560]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"23:5","kind":"fallthrough"},{"src":"23:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"23:5"}],"ddg":[{"src":"@entry","dst":"23:5","var":"this.height","prov":["reaching-defs"]},{"src":"@entry","dst":"23:5","var":"this.width","prov":["reaching-defs"]},{"src":"23:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/hierarchy.Rectangle.constructor","comments":[],"decorators":[],"parameters":[{"name":"width","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":18,"end_line":18,"start_column":5,"end_column":37},{"name":"height","type":"number","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"protected","decorators":[],"start_line":19,"end_line":19,"start_column":5,"end_column":38}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]},"body":{"@entry":{"kind":"entry","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]}},"@exit":{"kind":"exit","span":{"start":[17,3],"end":[20,7],"bytes":[403,499]}},"@formal_in:0":{"kind":"formal_in","of":"width"},"@formal_in:1":{"kind":"formal_in","of":"height"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"width":{"name":"width","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width","kind":"field"},"height":{"name":"height","type":"number","comments":[],"decorators":[],"accessibility":"protected","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height","kind":"field"}},"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]},"Square":{"name":"Square","signature":"src/hierarchy.Square","comments":[],"decorators":[],"base_classes":["src/hierarchy.Rectangle","src/hierarchy.Labeled"],"implements_types":["src/hierarchy.Labeled"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square","kind":"class","span":{"start":[27,1],"end":[33,2],"bytes":[564,711]},"callables":{"constructor":{"name":"constructor","signature":"src/hierarchy.Square.constructor","comments":[],"decorators":[],"parameters":[{"name":"side","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":30,"end_line":30,"start_column":15,"end_column":27}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]},"body":{"31:5":{"method_name":"super","argument_types":["number","number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,22],"bytes":[687,704]},"callee":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor"},"@entry":{"kind":"entry","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]}},"@exit":{"kind":"exit","span":{"start":[30,3],"end":[32,4],"bytes":[655,709]}},"@formal_in:0":{"kind":"formal_in","of":"side"},"@formal_out":{"kind":"formal_out","of":"$ret"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5"},"31:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"31:5"}},"cfg":[{"src":"@entry","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"31:5"}],"ddg":[{"src":"@entry","dst":"31:5","var":"side","prov":["reaching-defs"]}],"summary":[]}},"fields":{"label":{"name":"label","type":"\"square\"","comments":[],"decorators":[],"initializer":"\"square\"","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Square/label","kind":"field","span":{"start":[28,3],"end":[28,29],"bytes":[625,651]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Rectangle"],"implements_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Labeled"]},"Shape":{"name":"Shape","signature":"src/hierarchy.Shape","comments":[{"content":"A minimal first-party class/interface hierarchy — exercises the Neo4j EXTENDS/IMPLEMENTS\nprojection, including interface→interface EXTENDS (`ColoredShape extends Shape`).","is_docstring":true,"start_line":1,"end_line":2,"start_column":1,"end_column":88}],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape","kind":"interface","span":{"start":[4,1],"end":[6,2],"bytes":[182,226]},"callables":{"area":{"name":"area","signature":"src/hierarchy.Shape.area","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/hierarchy.ts/Shape/area","span":{"start":[5,3],"end":[5,18],"bytes":[209,224]},"body":{}}},"fields":{}},"Labeled":{"name":"Labeled","signature":"src/hierarchy.Labeled","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled","kind":"interface","span":{"start":[8,1],"end":[10,2],"bytes":[228,282]},"callables":{},"fields":{"label":{"name":"label","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label","kind":"field","span":{"start":[9,3],"end":[9,26],"bytes":[257,280]}}}},"ColoredShape":{"name":"ColoredShape","signature":"src/hierarchy.ColoredShape","comments":[],"base_classes":["src/hierarchy.Shape"],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape","kind":"interface","span":{"start":[12,1],"end":[14,2],"bytes":[284,357]},"callables":{},"fields":{"color":{"name":"color","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color","kind":"field","span":{"start":[13,3],"end":[13,26],"bytes":[332,355]}}},"extends_ids":["can://typescript/dataflow-app/src/hierarchy.ts/Shape"]}},"functions":{},"fields":{}},"src/main.ts":{"source":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */\nimport { a } from \"./chain\";\nimport { bump, readCounter } from \"./state\";\n\nexport function main(): number {\n bump(3);\n const r = a(readCounter());\n return r;\n}\n","imports":[{"module":"./chain","name":"a","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":29},{"module":"./state","name":"bump","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45},{"module":"./state","name":"readCounter","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":45}],"exports":[],"comments":[{"content":"/** Multi-file flow: state and chain wired together (cross-module SDG edges). */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":81}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/main.ts","kind":"module","span":{"start":[1,1],"end":[10,1],"bytes":[0,244]},"types":{},"functions":{"main":{"name":"main","signature":"src/main.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/main.ts/main","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]},"body":{"6:3":{"method_name":"bump","argument_types":["3"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[6,3],"end":[6,10],"bytes":[191,198]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"7:13":{"method_name":"a","argument_types":["number"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,13],"end":[7,29],"bytes":[212,228]},"callee":"can://typescript/dataflow-app/src/chain.ts/a"},"7:15":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,15],"end":[7,28],"bytes":[214,227]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"},"@entry":{"kind":"entry","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,30],"bytes":[202,229]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,12],"bytes":[232,241]}},"@exit":{"kind":"exit","span":{"start":[5,1],"end":[9,2],"bytes":[156,243]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3"},"6:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"6:3"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3"},"6:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"6:3"}},"cfg":[{"src":"@entry","dst":"6:3","kind":"fallthrough"},{"src":"6:3","dst":"@exit","kind":"exception"},{"src":"6:3","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"6:3"},{"src":"6:3","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"6:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"@entry","dst":"7:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"6:3","dst":"@formal_out","var":"src/state.counter","prov":["reaching-defs"]},{"src":"6:3","dst":"7:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"r","prov":["reaching-defs"]},{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"7:3","dst":"7:3","var":"src/state.counter"},{"src":"7:3/actual_in:0","dst":"7:3/actual_out"}]}},"fields":{}},"src/state.ts":{"source":"/** Module-level global state: written in one function, read in another. */\n\nexport let counter = 0;\n\nexport function bump(by: number): void {\n counter = counter + by; // global write\n}\n\nexport function readCounter(): number {\n return counter; // global read that flows to the return value\n}\n\nexport function churn(by: number): number {\n bump(by); // transitive global write lands on this callsite node\n return readCounter(); // transitive global read\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Module-level global state: written in one function, read in another. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":76}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/state.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,458]},"types":{},"functions":{"bump":{"name":"bump","signature":"src/state.bump","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":5,"end_line":5,"start_column":22,"end_column":32}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/bump","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]},"body":{"@entry":{"kind":"entry","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]}},"6:3":{"kind":"statement","span":{"start":[6,3],"end":[6,26],"bytes":[145,168]}},"@exit":{"kind":"exit","span":{"start":[5,1],"end":[7,2],"bytes":[102,186]}},"@formal_in:0":{"kind":"formal_in","of":"by"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"6:3","kind":"fallthrough"},{"src":"6:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"6:3"}],"ddg":[{"src":"@entry","dst":"6:3","var":"by","prov":["reaching-defs"]},{"src":"@entry","dst":"6:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"6:3","dst":"@formal_out","var":"src/state.counter","prov":["reaching-defs"]}],"summary":[]},"readCounter":{"name":"readCounter","signature":"src/state.readCounter","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/readCounter","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]},"body":{"@entry":{"kind":"entry","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]}},"10:3":{"kind":"statement","span":{"start":[10,3],"end":[10,18],"bytes":[230,245]}},"@exit":{"kind":"exit","span":{"start":[9,1],"end":[11,2],"bytes":[188,293]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"10:3","kind":"fallthrough"},{"src":"10:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"10:3"}],"ddg":[{"src":"@entry","dst":"10:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"10:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"churn":{"name":"churn","signature":"src/state.churn","comments":[],"decorators":[],"parameters":[{"name":"by","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":23,"end_column":33}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/state.ts/churn","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]},"body":{"14:3":{"method_name":"bump","argument_types":["number"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,3],"end":[14,11],"bytes":[341,349]},"callee":"can://typescript/dataflow-app/src/state.ts/bump"},"15:10":{"method_name":"readCounter","argument_types":[],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,23],"bytes":[415,428]},"callee":"can://typescript/dataflow-app/src/state.ts/readCounter"},"@entry":{"kind":"entry","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,24],"bytes":[408,429]}},"@exit":{"kind":"exit","span":{"start":[13,1],"end":[16,2],"bytes":[295,457]}},"@formal_in:0":{"kind":"formal_in","of":"by"},"@formal_out":{"kind":"formal_out","of":"$ret"},"14:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:3"},"14:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:3"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3"}},"cfg":[{"src":"@entry","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"@exit","kind":"exception"},{"src":"14:3","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:3"},{"src":"14:3","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"14:3","var":"by","prov":["reaching-defs"]},{"src":"@entry","dst":"14:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"@entry","dst":"15:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"14:3","dst":"@formal_out","var":"src/state.counter","prov":["reaching-defs"]},{"src":"14:3","dst":"15:3","var":"src/state.counter","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3","dst":"15:3","var":"src/state.counter"}]}},"fields":{"counter":{"name":"counter","type":"number","initializer":"0","scope":"module","declaration_kind":"let","is_readonly":false,"is_exported":true,"id":"can://typescript/dataflow-app/src/state.ts/counter","kind":"field","span":{"start":[3,12],"end":[3,23],"bytes":[88,99]}}}},"src/susp.ts":{"source":"/** Suspension points (await/yield) and intra-statement expression control flow. */\n\nexport async function compute(x: number): Promise {\n return x * 2;\n}\n\nexport async function fetchTotal(x: number): Promise {\n const a = await compute(x); // await_resume edge out of this statement\n return a + 1;\n}\n\nexport function* numbers(n: number): Generator {\n let i = 0;\n while (i < n) {\n yield i; // yield (suspend/resume) edge\n i = i + 1;\n }\n return n;\n}\n\nexport function shortCircuit(a: { f?: number } | null, b: number): number {\n const v = (a && a.f) || b; // short-circuit stays intra-statement (documented rule)\n const w = a?.f ?? b; // optional chaining likewise\n return v + w;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Suspension points (await/yield) and intra-statement expression control flow. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/susp.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,735]},"types":{},"functions":{"compute":{"name":"compute","signature":"src/susp.compute","comments":[{"content":"Suspension points (await/yield) and intra-statement expression control flow.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":84}],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":31,"end_column":40}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/compute","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]},"body":{"@entry":{"kind":"entry","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]}},"4:3":{"kind":"statement","span":{"start":[4,3],"end":[4,16],"bytes":[147,160]}},"@exit":{"kind":"exit","span":{"start":[3,1],"end":[5,2],"bytes":[85,162]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"4:3","kind":"fallthrough"},{"src":"4:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:3"}],"ddg":[{"src":"@entry","dst":"4:3","var":"x","prov":["reaching-defs"]},{"src":"4:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"fetchTotal":{"name":"fetchTotal","signature":"src/susp.fetchTotal","comments":[],"decorators":[],"parameters":[{"name":"x","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":34,"end_column":43}],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]},"body":{"8:19":{"method_name":"compute","argument_types":["number"],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,19],"end":[8,29],"bytes":[245,255]},"callee":"can://typescript/dataflow-app/src/susp.ts/compute"},"@entry":{"kind":"entry","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,30],"bytes":[229,256]}},"9:3":{"kind":"statement","span":{"start":[9,3],"end":[9,16],"bytes":[302,315]}},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[10,2],"bytes":[164,317]}},"@formal_in:0":{"kind":"formal_in","of":"x"},"@formal_out":{"kind":"formal_out","of":"$ret"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3"}},"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"await_resume"},{"src":"9:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"},{"src":"8:3","dst":"9:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"x","prov":["reaching-defs"]},{"src":"8:3","dst":"9:3","var":"a","prov":["reaching-defs"]},{"src":"9:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:3/actual_in:0","dst":"8:3/actual_out"}]},"numbers":{"name":"numbers","signature":"src/susp.numbers","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"Generator","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":true,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/numbers","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]},"body":{"@entry":{"kind":"entry","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,13],"bytes":[395,405]}},"14:3":{"kind":"statement","span":{"start":[14,3],"end":[17,4],"bytes":[408,486]}},"15:5":{"kind":"statement","span":{"start":[15,5],"end":[15,13],"bytes":[428,436]}},"16:5":{"kind":"statement","span":{"start":[16,5],"end":[16,15],"bytes":[472,482]}},"18:3":{"kind":"statement","span":{"start":[18,3],"end":[18,12],"bytes":[489,498]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[19,2],"bytes":[319,500]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"14:3","kind":"fallthrough"},{"src":"14:3","dst":"15:5","kind":"true"},{"src":"14:3","dst":"18:3","kind":"false"},{"src":"15:5","dst":"16:5","kind":"yield"},{"src":"16:5","dst":"14:3","kind":"loop_back"},{"src":"18:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"},{"src":"@entry","dst":"14:3"},{"src":"@entry","dst":"18:3"},{"src":"14:3","dst":"15:5"},{"src":"14:3","dst":"16:5"}],"ddg":[{"src":"@entry","dst":"14:3","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"18:3","var":"n","prov":["reaching-defs"]},{"src":"13:3","dst":"14:3","var":"i","prov":["reaching-defs"]},{"src":"13:3","dst":"15:5","var":"i","prov":["reaching-defs"]},{"src":"13:3","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"14:3","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"15:5","var":"i","prov":["reaching-defs"]},{"src":"16:5","dst":"16:5","var":"i","prov":["reaching-defs"]},{"src":"18:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"shortCircuit":{"name":"shortCircuit","signature":"src/susp.shortCircuit","comments":[],"decorators":[],"parameters":[{"name":"a","type":"{ f?: number } | null","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":30,"end_column":54},{"name":"b","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":21,"end_line":21,"start_column":56,"end_column":65}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":4,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/susp.ts/shortCircuit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]},"body":{"@entry":{"kind":"entry","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]}},"22:3":{"kind":"statement","span":{"start":[22,3],"end":[22,29],"bytes":[580,606]}},"23:3":{"kind":"statement","span":{"start":[23,3],"end":[23,23],"bytes":[666,686]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,16],"bytes":[719,732]}},"@exit":{"kind":"exit","span":{"start":[21,1],"end":[25,2],"bytes":[502,734]}},"@formal_in:0":{"kind":"formal_in","of":"a"},"@formal_in:1":{"kind":"formal_in","of":"b"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"23:3","kind":"fallthrough"},{"src":"23:3","dst":"24:3","kind":"fallthrough"},{"src":"24:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"22:3"},{"src":"@entry","dst":"23:3"},{"src":"@entry","dst":"24:3"}],"ddg":[{"src":"@entry","dst":"22:3","var":"a","prov":["reaching-defs"]},{"src":"@entry","dst":"22:3","var":"a.f","prov":["reaching-defs"]},{"src":"@entry","dst":"22:3","var":"b","prov":["reaching-defs"]},{"src":"@entry","dst":"23:3","var":"a.f","prov":["reaching-defs"]},{"src":"@entry","dst":"23:3","var":"b","prov":["reaching-defs"]},{"src":"22:3","dst":"24:3","var":"v","prov":["reaching-defs"]},{"src":"23:3","dst":"24:3","var":"w","prov":["reaching-defs"]},{"src":"24:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/taint.ts":{"source":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */\n\nexport function source(): string {\n return \"user-input\";\n}\n\nexport function sanitize(s: string): string {\n return s.replace(/dangerous/g, \"\");\n}\n\nexport function sink(s: string): void {\n void s;\n}\n\nexport function unsafeFlow(): void {\n const s = source();\n sink(s);\n}\n\nexport function safeFlow(): void {\n const s = sanitize(source());\n sink(s);\n}\n","imports":[],"exports":[],"comments":[{"content":"/**\n * Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n * (issue #2 PR E); the fixture carries the flows now so that PR only adds the query.\n */","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/taint.ts","kind":"module","span":{"start":[1,1],"end":[27,1],"bytes":[0,536]},"types":{},"functions":{"source":{"name":"source","signature":"src/taint.source","comments":[{"content":"Source → sink pair (one raw, one sanitized). The taint client is a staged follow-up\n(issue #2 PR E); the fixture carries the flows now so that PR only adds the query.","is_docstring":true,"start_line":1,"end_line":4,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/source","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]},"body":{"@entry":{"kind":"entry","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,23],"bytes":[219,239]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[8,2],"bytes":[182,241]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"}],"ddg":[{"src":"7:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"sanitize":{"name":"sanitize","signature":"src/taint.sanitize","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":26,"end_column":35}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sanitize","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]},"body":{"11:10":{"method_name":"replace","receiver_expr":"s","receiver_type":"string","argument_types":["RegExp","\"\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[11,10],"end":[11,37],"bytes":[298,325]},"callee":"can://typescript/dataflow-app/@external/(builtin)/replace"},"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,38],"bytes":[291,326]}},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[243,328]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3"},"11:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"11:3"}},"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"11:3","var":"s.replace","prov":["reaching-defs"]},{"src":"11:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"11:3/actual_in:0","dst":"11:3/actual_out"},{"src":"11:3/actual_in:1","dst":"11:3/actual_out"}]},"sink":{"name":"sink","signature":"src/taint.sink","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":22,"end_column":31}],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/sink","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]},"body":{"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,10],"bytes":[372,379]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[330,381]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"s","prov":["reaching-defs"]}],"summary":[]},"unsafeFlow":{"name":"unsafeFlow","signature":"src/taint.unsafeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]},"body":{"19:13":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,13],"end":[19,21],"bytes":[432,440]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"20:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,3],"end":[20,10],"bytes":[444,451]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"},"@entry":{"kind":"entry","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,22],"bytes":[422,441]}},"@exit":{"kind":"exit","span":{"start":[18,1],"end":[21,2],"bytes":[383,454]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"20:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:3"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3"},"20:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:3"}},"cfg":[{"src":"@entry","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"19:3"},{"src":"19:3","dst":"20:3"}],"ddg":[{"src":"19:3","dst":"20:3","var":"s","prov":["reaching-defs"]}],"summary":[]},"safeFlow":{"name":"safeFlow","signature":"src/taint.safeFlow","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/taint.ts/safeFlow","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]},"body":{"24:13":{"method_name":"sanitize","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,13],"end":[24,31],"bytes":[503,521]},"callee":"can://typescript/dataflow-app/src/taint.ts/sanitize"},"24:22":{"method_name":"source","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[24,22],"end":[24,30],"bytes":[512,520]},"callee":"can://typescript/dataflow-app/src/taint.ts/source"},"25:3":{"method_name":"sink","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,3],"end":[25,10],"bytes":[525,532]},"callee":"can://typescript/dataflow-app/src/taint.ts/sink"},"@entry":{"kind":"entry","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]}},"24:3":{"kind":"statement","span":{"start":[24,3],"end":[24,32],"bytes":[493,522]}},"@exit":{"kind":"exit","span":{"start":[23,1],"end":[26,2],"bytes":[456,535]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"24:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"24:3"},"24:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"24:3"},"25:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:3"},"25:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:3"}},"cfg":[{"src":"@entry","dst":"24:3","kind":"fallthrough"},{"src":"24:3","dst":"@exit","kind":"exception"},{"src":"24:3","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"24:3"},{"src":"24:3","dst":"25:3"}],"ddg":[{"src":"24:3","dst":"25:3","var":"s","prov":["reaching-defs"]}],"summary":[{"src":"24:3/actual_in:0","dst":"24:3/actual_out"}]}},"fields":{}},"src/util.ts":{"source":"export function increment(v: number): number {\n return v + 1;\n}\n","imports":[],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/dataflow-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[4,1],"bytes":[0,65]},"types":{},"functions":{"increment":{"name":"increment","signature":"src/util.increment","comments":[],"decorators":[],"parameters":[{"name":"v","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":1,"end_line":1,"start_column":27,"end_column":36}],"type_parameters":[],"return_type":"number","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/dataflow-app/src/util.ts/increment","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]},"body":{"@entry":{"kind":"entry","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]}},"2:3":{"kind":"statement","span":{"start":[2,3],"end":[2,16],"bytes":[49,62]}},"@exit":{"kind":"exit","span":{"start":[1,1],"end":[3,2],"bytes":[0,64]}},"@formal_in:0":{"kind":"formal_in","of":"v"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"2:3","kind":"fallthrough"},{"src":"2:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"2:3"}],"ddg":[{"src":"@entry","dst":"2:3","var":"v","prov":["reaching-defs"]},{"src":"2:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}}},"call_graph":[{"src":"can://typescript/dataflow-app/src/chain.ts/b","dst":"can://typescript/dataflow-app/src/chain.ts/c","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/a","dst":"can://typescript/dataflow-app/src/chain.ts/b","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile","dst":"can://typescript/dataflow-app/src/util.ts/increment","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd","dst":"can://typescript/dataflow-app/src/chain.ts/isEven","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/parse","dst":"can://typescript/dataflow-app/@external/(builtin)/isNaN","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/parse","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/flow.ts/shadow","dst":"can://typescript/dataflow-app/src/flow.ts/touch","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/chain.ts/a","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/main.ts/main","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/bump","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/state.ts/churn","dst":"can://typescript/dataflow-app/src/state.ts/readCounter","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/susp.ts/fetchTotal","dst":"can://typescript/dataflow-app/src/susp.ts/compute","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/sanitize","dst":"can://typescript/dataflow-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sanitize","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/source","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow","dst":"can://typescript/dataflow-app/src/taint.ts/sink","prov":["tsc","jelly"],"weight":2}],"param_in":[{"src":"can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/b@formal_in:0"},{"src":"can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/c@formal_in:0"},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0"},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0"},{"src":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0","dst":"can://typescript/dataflow-app/src/util.ts/increment@formal_in:0"},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0","dst":"can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0"},{"src":"can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0","dst":"can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0"},{"src":"can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0","dst":"can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0"},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0"},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1"},{"src":"can://typescript/dataflow-app/src/main.ts/main@6:3","dst":"can://typescript/dataflow-app/src/state.ts/bump@entry","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0","dst":"can://typescript/dataflow-app/src/state.ts/bump@formal_in:0"},{"src":"can://typescript/dataflow-app/src/main.ts/main@7:3","dst":"can://typescript/dataflow-app/src/state.ts/readCounter@entry","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0","dst":"can://typescript/dataflow-app/src/chain.ts/a@formal_in:0"},{"src":"can://typescript/dataflow-app/src/state.ts/churn@14:3","dst":"can://typescript/dataflow-app/src/state.ts/bump@entry","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0","dst":"can://typescript/dataflow-app/src/state.ts/bump@formal_in:0"},{"src":"can://typescript/dataflow-app/src/state.ts/churn@15:3","dst":"can://typescript/dataflow-app/src/state.ts/readCounter@entry","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0","dst":"can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0"},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0","dst":"can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0"},{"src":"can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0","dst":"can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0"},{"src":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0","dst":"can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0"}],"param_out":[{"src":"can://typescript/dataflow-app/src/chain.ts/a@formal_out","dst":"can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out"},{"src":"can://typescript/dataflow-app/src/chain.ts/b@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out"},{"src":"can://typescript/dataflow-app/src/chain.ts/c@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out"},{"src":"can://typescript/dataflow-app/src/chain.ts/isEven@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out"},{"src":"can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out"},{"src":"can://typescript/dataflow-app/src/flow.ts/parse@formal_out","dst":"can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out"},{"src":"can://typescript/dataflow-app/src/flow.ts/touch@formal_out","dst":"can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out"},{"src":"can://typescript/dataflow-app/src/flow.ts/touch@formal_out","dst":"can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out"},{"src":"can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out","dst":"can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out"},{"src":"can://typescript/dataflow-app/src/state.ts/bump@formal_out","dst":"can://typescript/dataflow-app/src/main.ts/main@6:3","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/state.ts/bump@formal_out","dst":"can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out"},{"src":"can://typescript/dataflow-app/src/state.ts/bump@formal_out","dst":"can://typescript/dataflow-app/src/state.ts/churn@14:3","var":"src/state.counter"},{"src":"can://typescript/dataflow-app/src/state.ts/bump@formal_out","dst":"can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out"},{"src":"can://typescript/dataflow-app/src/state.ts/readCounter@formal_out","dst":"can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out"},{"src":"can://typescript/dataflow-app/src/state.ts/readCounter@formal_out","dst":"can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out"},{"src":"can://typescript/dataflow-app/src/susp.ts/compute@formal_out","dst":"can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/sink@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/sink@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/source@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out"},{"src":"can://typescript/dataflow-app/src/taint.ts/source@formal_out","dst":"can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out"},{"src":"can://typescript/dataflow-app/src/util.ts/increment@formal_out","dst":"can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out"}],"external_symbols":{"can://typescript/dataflow-app/@external/(builtin)/isNaN":{"id":"can://typescript/dataflow-app/@external/(builtin)/isNaN","kind":"external","module":"(builtin)","name":"isNaN"},"can://typescript/dataflow-app/@external/(builtin)/replace":{"id":"can://typescript/dataflow-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"}},"synthesized_callables":{}}} \ No newline at end of file diff --git a/test/goldens/dataflow-app.cypher b/test/goldens/dataflow-app.cypher deleted file mode 100644 index 8765769..0000000 --- a/test/goldens/dataflow-app.cypher +++ /dev/null @@ -1,1303 +0,0 @@ - - - - - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/chain.ts', p: {}}, - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/closures.ts', p: {}}, - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/flow.ts', p: {}}, - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/hierarchy.ts', p: {}}, - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/main.ts', p: {}}, - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/state.ts', p: {}}, - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/susp.ts', p: {}}, - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/taint.ts', p: {}}, - {f: 'can://typescript/dataflow-app', t: 'can://typescript/dataflow-app/src/util.ts', p: {}} - {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/a', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/b', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/c', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/isEven', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:17', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a', t: 'can://typescript/dataflow-app/src/chain.ts/b', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:17', t: 'can://typescript/dataflow-app/src/chain.ts/b', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', k: 'fromB|reaching-defs', p: {var: 'fromB', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/b@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', t: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@entry', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@entry', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@entry', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:17', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b', t: 'can://typescript/dataflow-app/src/chain.ts/c', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:17', t: 'can://typescript/dataflow-app/src/chain.ts/c', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', k: 'fromC|reaching-defs', p: {var: 'fromC', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', t: 'can://typescript/dataflow-app/src/chain.ts/b@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/c@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@entry', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@entry', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', k: 'y|reaching-defs', p: {var: 'y', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@entry', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c', t: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', t: 'can://typescript/dataflow-app/src/chain.ts/c@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', t: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c@entry', t: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c@entry', t: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', k: 'z|reaching-defs', p: {var: 'z', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c@entry', t: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:10', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:10', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isEven', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:10', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:10', t: 'can://typescript/dataflow-app/src/chain.ts/isEven', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', t: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:10', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', t: 'can://typescript/dataflow-app/src/util.ts/increment', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:10', t: 'can://typescript/dataflow-app/src/util.ts/increment', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', t: 'can://typescript/dataflow-app/src/util.ts/increment@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', k: 'count|reaching-defs', p: {var: 'count', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', k: 'count|reaching-defs', p: {var: 'count', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', k: 'count|reaching-defs', p: {var: 'count', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', k: 'count|reaching-defs', p: {var: 'count', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', k: 'inc|reaching-defs', p: {var: 'inc', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', k: 'start|reaching-defs', p: {var: 'start', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', t: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', k: 'p|reaching-defs', p: {var: 'p', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', k: 'p.f|reaching-defs', p: {var: 'p.f', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', k: 'p.f|reaching-defs', p: {var: 'p.f', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', t: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/classify', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/early', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/guarded', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/parse', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/shadow', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/spin', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify', t: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', t: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', k: 'label|reaching-defs', p: {var: 'label', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', k: 'label|reaching-defs', p: {var: 'label', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', t: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early', t: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', t: 'can://typescript/dataflow-app/src/flow.ts/early@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', t: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', k: 'r|reaching-defs', p: {var: 'r', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', t: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@entry', t: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@entry', t: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@entry', t: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/early@entry', t: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:11', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/parse', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:11', t: 'can://typescript/dataflow-app/src/flow.ts/parse', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:13', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:11', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse', t: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', k: 'v|reaching-defs', p: {var: 'v', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', k: 'v|reaching-defs', p: {var: 'v', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@31:7', t: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', t: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', t: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', t: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', k: 'switch_case', p: {kind: 'switch_case'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', k: 'switch_case', p: {kind: 'switch_case'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', k: 'switch_case', p: {kind: 'switch_case'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'break', p: {kind: 'break'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'break', p: {kind: 'break'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', k: 'd|reaching-defs', p: {var: 'd', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', t: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', t: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0', t: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin', t: 'can://typescript/dataflow-app/src/flow.ts/spin@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', k: 'ticks|reaching-defs', p: {var: 'ticks', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', k: 'loop_back', p: {kind: 'loop_back'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', t: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', k: 'break', p: {kind: 'break'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', t: 'can://typescript/dataflow-app/src/flow.ts/spin@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', t: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', t: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', t: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', t: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', k: 'acc|reaching-defs', p: {var: 'acc', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', k: 'acc|reaching-defs', p: {var: 'acc', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', k: 'loop_back', p: {kind: 'loop_back'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', k: 'acc|reaching-defs', p: {var: 'acc', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', k: 'acc|reaching-defs', p: {var: 'acc', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', t: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch', t: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', t: 'can://typescript/dataflow-app/src/flow.ts/touch@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', t: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', t: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', t: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', t: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', t: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', t: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', k: 'this.height|reaching-defs', p: {var: 'this.height', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', k: 'this.width|reaching-defs', p: {var: 'this.width', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape/area', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', p: {}} - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', p: {}} - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', p: {}} - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/label', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1', p: {}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', k: 'side|reaching-defs', p: {var: 'side', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', t: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts', t: 'can://typescript/dataflow-app/src/main.ts/main', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/chain.ts/a', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:13', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:15', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@8:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3', t: 'can://typescript/dataflow-app/src/state.ts/bump@entry', p: {var: 'src/state.counter'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:13', t: 'can://typescript/dataflow-app/src/chain.ts/a', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:15', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', p: {var: 'src/state.counter'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@8:3', k: 'r|reaching-defs', p: {var: 'r', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@8:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/main.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', p: {var: 'src/state.counter'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', t: 'can://typescript/dataflow-app/src/chain.ts/a@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@8:3', t: 'can://typescript/dataflow-app/src/main.ts/main@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@8:3', t: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@entry', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@entry', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@entry', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/main.ts/main@entry', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts', t: 'can://typescript/dataflow-app/src/state.ts/churn', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts', t: 'can://typescript/dataflow-app/src/state.ts/counter', p: {}} - {f: 'can://typescript/dataflow-app/src/state.ts', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', t: 'can://typescript/dataflow-app/src/state.ts/bump@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@entry', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', k: 'by|reaching-defs', p: {var: 'by', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@entry', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@entry', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@entry', t: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3', p: {var: 'src/state.counter'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', t: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', p: {var: 'src/state.counter'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:10', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/bump', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/bump@entry', p: {var: 'src/state.counter'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0', t: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:10', t: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', p: {var: 'src/state.counter'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', p: {var: 'src/state.counter'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', k: 'by|reaching-defs', p: {var: 'by', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/churn@entry', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', k: 'src/state.counter|reaching-defs', p: {var: 'src/state.counter', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', t: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', t: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', t: 'can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts', t: 'can://typescript/dataflow-app/src/susp.ts/compute', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts', t: 'can://typescript/dataflow-app/src/susp.ts/numbers', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute', t: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', t: 'can://typescript/dataflow-app/src/susp.ts/compute@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', t: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', t: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', t: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', t: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/compute', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:19', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:19', t: 'can://typescript/dataflow-app/src/susp.ts/compute', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', k: 'await_resume', p: {kind: 'await_resume'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', k: 'a|reaching-defs', p: {var: 'a', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', t: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', k: 'x|reaching-defs', p: {var: 'x', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', t: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', k: 'yield', p: {kind: 'yield'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'loop_back', p: {kind: 'loop_back'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', k: 'i|reaching-defs', p: {var: 'i', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', t: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:1', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', k: 'v|reaching-defs', p: {var: 'v', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', k: 'w|reaching-defs', p: {var: 'w', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', k: 'a.f|reaching-defs', p: {var: 'a.f', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', k: 'a|reaching-defs', p: {var: 'a', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', k: 'b|reaching-defs', p: {var: 'b', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', k: 'a.f|reaching-defs', p: {var: 'a.f', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', k: 'b|reaching-defs', p: {var: 'b', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', t: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:13', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:22', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:13', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:22', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/@external/(builtin)/replace', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:10', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:1', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:10', t: 'can://typescript/dataflow-app/@external/(builtin)/replace', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:1', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', p: {}} - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', k: 's.replace|reaching-defs', p: {var: 's.replace', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink', t: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', t: 'can://typescript/dataflow-app/src/taint.ts/sink@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', t: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source', t: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source', t: 'can://typescript/dataflow-app/src/taint.ts/source@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source', t: 'can://typescript/dataflow-app/src/taint.ts/source@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source', t: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', t: 'can://typescript/dataflow-app/src/taint.ts/source@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', t: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source@entry', t: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source@entry', t: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {weight: 2, prov: ['tsc', 'jelly']}} - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:13', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@formal_out', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:13', t: 'can://typescript/dataflow-app/src/taint.ts/source', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', t: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {}} - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0', t: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', p: {}} - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', t: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/util.ts', t: 'can://typescript/dataflow-app/src/util.ts/increment', p: {}} - {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', p: {}}, - {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@entry', p: {}}, - {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@exit', p: {}}, - {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@formal_in:0', p: {}}, - {f: 'can://typescript/dataflow-app/src/util.ts/increment', t: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', p: {}} - {f: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', t: 'can://typescript/dataflow-app/src/util.ts/increment@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', t: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/dataflow-app/src/util.ts/increment@entry', t: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', k: 'fallthrough', p: {kind: 'fallthrough'}} - {f: 'can://typescript/dataflow-app/src/util.ts/increment@entry', t: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', k: 'v|reaching-defs', p: {var: 'v', prov: ['reaching-defs']}} - {f: 'can://typescript/dataflow-app/src/util.ts/increment@entry', t: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', p: {}} - {f: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', t: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', p: {}} - {k: 'can://typescript/dataflow-app', p: {id: 'can://typescript/dataflow-app', schema_version: '2.1.0', language: 'typescript', max_level: 4, k_limit: 3, analyzer_name: 'codeanalyzer-typescript', analyzer_version: '1.0.0'}} - {k: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', p: {id: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', kind: 'external', name: 'isNaN', module: '(builtin)'}}, - {k: 'can://typescript/dataflow-app/@external/(builtin)/replace', p: {id: 'can://typescript/dataflow-app/@external/(builtin)/replace', kind: 'external', name: 'replace', module: '(builtin)'}} - {k: 'can://typescript/dataflow-app/src/chain.ts', p: {id: 'can://typescript/dataflow-app/src/chain.ts', kind: 'module', name: 'src/chain.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 31, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a', kind: 'function', signature: 'src/chain.a', name: 'a', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 13, end_line: 16, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@14:17', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@14:17', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/b', start_line: 14, end_line: 14, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@14:3', kind: 'statement', start_line: 14, end_line: 14, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '14:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@14:3/actual_out', kind: 'actual_out', of: '$ret', parent: '14:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@entry', kind: 'entry', start_line: 13, end_line: 16, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@exit', kind: 'exit', start_line: 13, end_line: 16, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/a@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b', kind: 'function', signature: 'src/chain.b', name: 'b', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 8, end_line: 11, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@10:3', kind: 'statement', start_line: 10, end_line: 10, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@9:17', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@9:17', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/c', start_line: 9, end_line: 9, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@9:3', kind: 'statement', start_line: 9, end_line: 9, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '9:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@9:3/actual_out', kind: 'actual_out', of: '$ret', parent: '9:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@entry', kind: 'entry', start_line: 8, end_line: 11, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@exit', kind: 'exit', start_line: 8, end_line: 11, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@formal_in:0', kind: 'formal_in', of: 'y', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/b@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/c', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c', kind: 'function', signature: 'src/chain.c', name: 'c', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 4, end_line: 6, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@5:3', kind: 'statement', start_line: 5, end_line: 5, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/c@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@entry', kind: 'entry', start_line: 4, end_line: 6, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/c@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@exit', kind: 'exit', start_line: 4, end_line: 6, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/c@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@formal_in:0', kind: 'formal_in', of: 'z', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/c@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven', kind: 'function', signature: 'src/chain.isEven', name: 'isEven', return_type: 'boolean', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 22, end_line: 25, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:16', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@23:3', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:10', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:10', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/isOdd', start_line: 24, end_line: 24, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3', kind: 'statement', start_line: 24, end_line: 24, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '24:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@24:3/actual_out', kind: 'actual_out', of: '$ret', parent: '24:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@entry', kind: 'entry', start_line: 22, end_line: 25, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@exit', kind: 'exit', start_line: 22, end_line: 25, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isEven@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd', kind: 'function', signature: 'src/chain.isOdd', name: 'isOdd', return_type: 'boolean', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 27, end_line: 30, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:16', kind: 'statement', start_line: 28, end_line: 28, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@28:3', kind: 'statement', start_line: 28, end_line: 28, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:10', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:10', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/isEven', start_line: 29, end_line: 29, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3', kind: 'statement', start_line: 29, end_line: 29, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '29:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@29:3/actual_out', kind: 'actual_out', of: '$ret', parent: '29:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@entry', kind: 'entry', start_line: 27, end_line: 30, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@exit', kind: 'exit', start_line: 27, end_line: 30, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/isOdd@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile', kind: 'function', signature: 'src/chain.viaOtherFile', name: 'viaOtherFile', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 18, end_line: 20, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:10', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:10', kind: 'call', callee: 'can://typescript/dataflow-app/src/util.ts/increment', start_line: 19, end_line: 19, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3', kind: 'statement', start_line: 19, end_line: 19, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '19:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@19:3/actual_out', kind: 'actual_out', of: '$ret', parent: '19:3', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@entry', kind: 'entry', start_line: 18, end_line: 20, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@exit', kind: 'exit', start_line: 18, end_line: 20, _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_out', p: {id: 'can://typescript/dataflow-app/src/chain.ts/viaOtherFile@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/chain.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts', p: {id: 'can://typescript/dataflow-app/src/closures.ts', kind: 'module', name: 'src/closures.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 18, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter', kind: 'function', signature: 'src/closures.makeCounter', name: 'makeCounter', return_type: '() => number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 3, end_line: 10, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc', kind: 'arrow', signature: 'src/closures.makeCounter.inc', name: 'inc', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 5, end_line: 8, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@6:5', kind: 'statement', start_line: 6, end_line: 6, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@7:5', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@entry', kind: 'entry', start_line: 5, end_line: 8, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@exit', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@exit', kind: 'exit', start_line: 5, end_line: 8, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@formal_out', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter/inc@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@4:3', kind: 'statement', start_line: 4, end_line: 4, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@5:3', kind: 'statement', start_line: 5, end_line: 8, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@9:3', kind: 'statement', start_line: 9, end_line: 9, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@entry', kind: 'entry', start_line: 3, end_line: 10, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@exit', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@exit', kind: 'exit', start_line: 3, end_line: 10, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_in:0', kind: 'formal_in', of: 'start', _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_out', p: {id: 'can://typescript/dataflow-app/src/closures.ts/makeCounter@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias', kind: 'function', signature: 'src/closures.useAlias', name: 'useAlias', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 12, end_line: 17, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@13:3', kind: 'statement', start_line: 13, end_line: 13, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@14:3', kind: 'statement', start_line: 14, end_line: 14, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@16:3', kind: 'statement', start_line: 16, end_line: 16, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@entry', kind: 'entry', start_line: 12, end_line: 17, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@exit', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@exit', kind: 'exit', start_line: 12, end_line: 17, _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/closures.ts/useAlias@formal_out', p: {id: 'can://typescript/dataflow-app/src/closures.ts/useAlias@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/closures.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts', p: {id: 'can://typescript/dataflow-app/src/flow.ts', kind: 'module', name: 'src/flow.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 87, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify', kind: 'function', signature: 'src/flow.classify', name: 'classify', return_type: 'string', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 3, end_line: 11, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@10:3', kind: 'statement', start_line: 10, end_line: 10, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@4:3', kind: 'statement', start_line: 4, end_line: 4, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@5:3', kind: 'statement', start_line: 5, end_line: 9, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@6:5', kind: 'statement', start_line: 6, end_line: 6, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@8:5', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@entry', kind: 'entry', start_line: 3, end_line: 11, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@exit', kind: 'exit', start_line: 3, end_line: 11, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/classify@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early', kind: 'function', signature: 'src/flow.early', name: 'early', return_type: 'number', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 21, end_line: 27, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@22:3', kind: 'statement', start_line: 22, end_line: 24, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@23:5', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@25:3', kind: 'statement', start_line: 25, end_line: 25, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@26:3', kind: 'statement', start_line: 26, end_line: 26, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@entry', kind: 'entry', start_line: 21, end_line: 27, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@exit', kind: 'exit', start_line: 21, end_line: 27, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/early@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded', kind: 'function', signature: 'src/flow.guarded', name: 'guarded', return_type: 'number', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 37, end_line: 47, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@38:3', kind: 'statement', start_line: 38, end_line: 38, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:11', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:11', kind: 'call', callee: 'can://typescript/dataflow-app/src/flow.ts/parse', start_line: 40, end_line: 40, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5', kind: 'statement', start_line: 40, end_line: 40, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '40:5', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@40:5/actual_out', kind: 'actual_out', of: '$ret', parent: '40:5', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@41:5', kind: 'statement', start_line: 41, end_line: 43, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@42:5', kind: 'statement', start_line: 42, end_line: 42, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5', kind: 'call', callee: 'can://typescript/dataflow-app/src/flow.ts/touch', start_line: 44, end_line: 44, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '44:5', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@44:5/actual_out', kind: 'actual_out', of: '$ret', parent: '44:5', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@46:3', kind: 'statement', start_line: 46, end_line: 46, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@entry', kind: 'entry', start_line: 37, end_line: 47, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@exit', kind: 'exit', start_line: 37, end_line: 47, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/guarded@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse', kind: 'function', signature: 'src/flow.parse', name: 'parse', return_type: 'number', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 29, end_line: 35, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@30:13', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@30:13', kind: 'call', start_line: 30, end_line: 30, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3', kind: 'statement', start_line: 30, end_line: 30, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '30:3', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@30:3/actual_out', kind: 'actual_out', of: '$ret', parent: '30:3', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3', kind: 'statement', start_line: 31, end_line: 33, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '31:3', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@31:3/actual_out', kind: 'actual_out', of: '$ret', parent: '31:3', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@31:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@31:7', kind: 'call', callee: 'can://typescript/dataflow-app/@external/(builtin)/isNaN', start_line: 31, end_line: 31, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@32:11', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@32:11', kind: 'call', start_line: 32, end_line: 32, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5', kind: 'statement', start_line: 32, end_line: 32, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '32:5', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@32:5/actual_out', kind: 'actual_out', of: '$ret', parent: '32:5', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@34:3', kind: 'statement', start_line: 34, end_line: 34, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@entry', kind: 'entry', start_line: 29, end_line: 35, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@exit', kind: 'exit', start_line: 29, end_line: 35, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/parse@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay', kind: 'function', signature: 'src/flow.pickDay', name: 'pickDay', return_type: 'string', cyclomatic_complexity: 3, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 53, end_line: 66, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@54:3', kind: 'statement', start_line: 54, end_line: 54, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@55:3', kind: 'statement', start_line: 55, end_line: 64, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@57:7', kind: 'statement', start_line: 57, end_line: 57, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@58:7', kind: 'statement', start_line: 58, end_line: 58, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@60:7', kind: 'statement', start_line: 60, end_line: 60, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@61:7', kind: 'statement', start_line: 61, end_line: 61, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@63:7', kind: 'statement', start_line: 63, end_line: 63, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@65:3', kind: 'statement', start_line: 65, end_line: 65, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@entry', kind: 'entry', start_line: 53, end_line: 66, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@exit', kind: 'exit', start_line: 53, end_line: 66, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_in:0', kind: 'formal_in', of: 'd', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/pickDay@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow', kind: 'function', signature: 'src/flow.shadow', name: 'shadow', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 79, end_line: 86, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@80:3', kind: 'statement', start_line: 80, end_line: 80, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@82:5', kind: 'statement', start_line: 82, end_line: 82, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5', kind: 'call', callee: 'can://typescript/dataflow-app/src/flow.ts/touch', start_line: 83, end_line: 83, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '83:5', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@83:5/actual_out', kind: 'actual_out', of: '$ret', parent: '83:5', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@85:3', kind: 'statement', start_line: 85, end_line: 85, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@entry', kind: 'entry', start_line: 79, end_line: 86, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@exit', kind: 'exit', start_line: 79, end_line: 86, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/shadow@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/shadow@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin', kind: 'function', signature: 'src/flow.spin', name: 'spin', return_type: 'number', cyclomatic_complexity: 3, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 68, end_line: 77, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@69:3', kind: 'statement', start_line: 69, end_line: 69, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@70:3', kind: 'statement', start_line: 70, end_line: 75, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@71:5', kind: 'statement', start_line: 71, end_line: 71, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@72:5', kind: 'statement', start_line: 72, end_line: 74, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@73:7', kind: 'statement', start_line: 73, end_line: 73, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@76:3', kind: 'statement', start_line: 76, end_line: 76, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@entry', kind: 'entry', start_line: 68, end_line: 77, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@exit', kind: 'exit', start_line: 68, end_line: 77, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/spin@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/spin@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo', kind: 'function', signature: 'src/flow.sumTo', name: 'sumTo', return_type: 'number', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 13, end_line: 19, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@14:3', kind: 'statement', start_line: 14, end_line: 14, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@15:3', kind: 'statement', start_line: 15, end_line: 17, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@16:5', kind: 'statement', start_line: 16, end_line: 16, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@18:3', kind: 'statement', start_line: 18, end_line: 18, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@entry', kind: 'entry', start_line: 13, end_line: 19, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@exit', kind: 'exit', start_line: 13, end_line: 19, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/sumTo@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/touch', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch', kind: 'function', signature: 'src/flow.touch', name: 'touch', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 49, end_line: 51, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@50:3', kind: 'statement', start_line: 50, end_line: 50, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@entry', kind: 'entry', start_line: 49, end_line: 51, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/touch@exit', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@exit', kind: 'exit', start_line: 49, end_line: 51, _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', p: {id: 'can://typescript/dataflow-app/src/flow.ts/touch@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/flow.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts', kind: 'module', name: 'src/hierarchy.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 34, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape', kind: 'interface', signature: 'src/hierarchy.ColoredShape', name: 'ColoredShape', base_classes: ['src/hierarchy.Shape'], is_exported: true, is_ambient: false, start_line: 12, end_line: 14}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/ColoredShape/color', kind: 'field', name: 'color', type: 'string', start_line: 13, end_line: 13, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled', kind: 'interface', signature: 'src/hierarchy.Labeled', name: 'Labeled', is_exported: true, is_ambient: false, start_line: 8, end_line: 10}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Labeled/label', kind: 'field', name: 'label', type: 'string', start_line: 9, end_line: 9, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle', kind: 'class', signature: 'src/hierarchy.Rectangle', name: 'Rectangle', base_classes: ['src/hierarchy.Shape'], implements_types: ['src/hierarchy.Shape'], is_abstract: false, is_exported: true, is_ambient: false, start_line: 16, end_line: 25}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area', kind: 'method', signature: 'src/hierarchy.Rectangle.area', name: 'area', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 22, end_line: 24, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@23:5', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@entry', kind: 'entry', start_line: 22, end_line: 24, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@exit', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@exit', kind: 'exit', start_line: 22, end_line: 24, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@formal_out', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/area@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', kind: 'constructor', signature: 'src/hierarchy.Rectangle.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 17, end_line: 20, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@entry', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@entry', kind: 'entry', start_line: 17, end_line: 20, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@exit', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@exit', kind: 'exit', start_line: 17, end_line: 20, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:0', kind: 'formal_in', of: 'width', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_in:1', kind: 'formal_in', of: 'height', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/height', kind: 'field', name: 'height', type: 'number', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/width', kind: 'field', name: 'width', type: 'number', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape', kind: 'interface', signature: 'src/hierarchy.Shape', name: 'Shape', is_exported: true, is_ambient: false, start_line: 4, end_line: 6}} - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape/area', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Shape/area', kind: 'method', signature: 'src/hierarchy.Shape.area', name: 'area', return_type: 'number', cyclomatic_complexity: 0, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 5, end_line: 5, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square', kind: 'class', signature: 'src/hierarchy.Square', name: 'Square', base_classes: ['src/hierarchy.Rectangle', 'src/hierarchy.Labeled'], implements_types: ['src/hierarchy.Labeled'], is_abstract: false, is_exported: true, is_ambient: false, start_line: 27, end_line: 33}} - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor', kind: 'constructor', signature: 'src/hierarchy.Square.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 30, end_line: 32, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5', kind: 'call', callee: 'can://typescript/dataflow-app/src/hierarchy.ts/Rectangle/constructor', start_line: 31, end_line: 31, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '31:5', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '31:5', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@31:5/actual_out', kind: 'actual_out', of: '$ret', parent: '31:5', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@entry', kind: 'entry', start_line: 30, end_line: 32, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@exit', kind: 'exit', start_line: 30, end_line: 32, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_in:0', kind: 'formal_in', of: 'side', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_out', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/label', p: {id: 'can://typescript/dataflow-app/src/hierarchy.ts/Square/label', kind: 'field', name: 'label', type: '"square"', start_line: 28, end_line: 28, _module: 'src/hierarchy.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts', p: {id: 'can://typescript/dataflow-app/src/main.ts', kind: 'module', name: 'src/main.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 10, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main', p: {id: 'can://typescript/dataflow-app/src/main.ts/main', kind: 'function', signature: 'src/main.main', name: 'main', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 5, end_line: 9, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@6:3', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@6:3', kind: 'call', callee: 'can://typescript/dataflow-app/src/state.ts/bump', start_line: 6, end_line: 6, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '6:3', _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@6:3/actual_out', kind: 'actual_out', of: '$ret', parent: '6:3', _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@7:13', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:13', kind: 'call', callee: 'can://typescript/dataflow-app/src/chain.ts/a', start_line: 7, end_line: 7, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@7:15', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:15', kind: 'call', callee: 'can://typescript/dataflow-app/src/state.ts/readCounter', start_line: 7, end_line: 7, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@7:3', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:3', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '7:3', _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@7:3/actual_out', kind: 'actual_out', of: '$ret', parent: '7:3', _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@8:3', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@8:3', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@entry', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@entry', kind: 'entry', start_line: 5, end_line: 9, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@exit', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@exit', kind: 'exit', start_line: 5, end_line: 9, _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', p: {id: 'can://typescript/dataflow-app/src/main.ts/main@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/main.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts', p: {id: 'can://typescript/dataflow-app/src/state.ts', kind: 'module', name: 'src/state.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 17, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/bump', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump', kind: 'function', signature: 'src/state.bump', name: 'bump', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 5, end_line: 7, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@6:3', kind: 'statement', start_line: 6, end_line: 6, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/bump@entry', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@entry', kind: 'entry', start_line: 5, end_line: 7, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/bump@exit', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@exit', kind: 'exit', start_line: 5, end_line: 7, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@formal_in:0', kind: 'formal_in', of: 'by', _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/bump@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn', kind: 'function', signature: 'src/state.churn', name: 'churn', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 13, end_line: 16, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@14:3', kind: 'call', callee: 'can://typescript/dataflow-app/src/state.ts/bump', start_line: 14, end_line: 14, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '14:3', _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@14:3/actual_out', kind: 'actual_out', of: '$ret', parent: '14:3', _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@15:10', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@15:10', kind: 'call', callee: 'can://typescript/dataflow-app/src/state.ts/readCounter', start_line: 15, end_line: 15, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@15:3/actual_out', kind: 'actual_out', of: '$ret', parent: '15:3', _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@entry', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@entry', kind: 'entry', start_line: 13, end_line: 16, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@exit', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@exit', kind: 'exit', start_line: 13, end_line: 16, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@formal_in:0', kind: 'formal_in', of: 'by', _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/churn@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/counter', p: {id: 'can://typescript/dataflow-app/src/state.ts/counter', kind: 'field', name: 'counter', type: 'number', start_line: 3, end_line: 3, _module: 'src/state.ts'}} - {k: 'can://typescript/dataflow-app/src/state.ts/readCounter', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter', kind: 'function', signature: 'src/state.readCounter', name: 'readCounter', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 9, end_line: 11, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter@10:3', kind: 'statement', start_line: 10, end_line: 10, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter@entry', kind: 'entry', start_line: 9, end_line: 11, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/readCounter@exit', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter@exit', kind: 'exit', start_line: 9, end_line: 11, _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', p: {id: 'can://typescript/dataflow-app/src/state.ts/readCounter@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/state.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts', p: {id: 'can://typescript/dataflow-app/src/susp.ts', kind: 'module', name: 'src/susp.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 26, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/compute', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute', kind: 'function', signature: 'src/susp.compute', name: 'compute', return_type: 'Promise', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: true, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 3, end_line: 5, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@4:3', kind: 'statement', start_line: 4, end_line: 4, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@entry', kind: 'entry', start_line: 3, end_line: 5, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/compute@exit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@exit', kind: 'exit', start_line: 3, end_line: 5, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/compute@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal', kind: 'function', signature: 'src/susp.fetchTotal', name: 'fetchTotal', return_type: 'Promise', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: true, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 7, end_line: 10, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:19', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:19', kind: 'call', callee: 'can://typescript/dataflow-app/src/susp.ts/compute', start_line: 8, end_line: 8, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '8:3', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@8:3/actual_out', kind: 'actual_out', of: '$ret', parent: '8:3', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@9:3', kind: 'statement', start_line: 9, end_line: 9, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@entry', kind: 'entry', start_line: 7, end_line: 10, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@exit', kind: 'exit', start_line: 7, end_line: 10, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_in:0', kind: 'formal_in', of: 'x', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/fetchTotal@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers', kind: 'function', signature: 'src/susp.numbers', name: 'numbers', return_type: 'Generator', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: true, is_exported: true, is_ambient: false, is_implicit: false, start_line: 12, end_line: 19, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@13:3', kind: 'statement', start_line: 13, end_line: 13, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@14:3', kind: 'statement', start_line: 14, end_line: 17, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@15:5', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@16:5', kind: 'statement', start_line: 16, end_line: 16, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@18:3', kind: 'statement', start_line: 18, end_line: 18, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@entry', kind: 'entry', start_line: 12, end_line: 19, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@exit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@exit', kind: 'exit', start_line: 12, end_line: 19, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/numbers@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit', kind: 'function', signature: 'src/susp.shortCircuit', name: 'shortCircuit', return_type: 'number', cyclomatic_complexity: 4, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 21, end_line: 25, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@22:3', kind: 'statement', start_line: 22, end_line: 22, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@23:3', kind: 'statement', start_line: 23, end_line: 23, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@24:3', kind: 'statement', start_line: 24, end_line: 24, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@entry', kind: 'entry', start_line: 21, end_line: 25, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@exit', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@exit', kind: 'exit', start_line: 21, end_line: 25, _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:0', kind: 'formal_in', of: 'a', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:1', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_in:1', kind: 'formal_in', of: 'b', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_out', p: {id: 'can://typescript/dataflow-app/src/susp.ts/shortCircuit@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/susp.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts', p: {id: 'can://typescript/dataflow-app/src/taint.ts', kind: 'module', name: 'src/taint.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 27, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow', kind: 'function', signature: 'src/taint.safeFlow', name: 'safeFlow', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 23, end_line: 26, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:13', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:13', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/sanitize', start_line: 24, end_line: 24, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:22', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:22', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/source', start_line: 24, end_line: 24, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3', kind: 'statement', start_line: 24, end_line: 24, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '24:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@24:3/actual_out', kind: 'actual_out', of: '$ret', parent: '24:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/sink', start_line: 25, end_line: 25, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '25:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@25:3/actual_out', kind: 'actual_out', of: '$ret', parent: '25:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@entry', kind: 'entry', start_line: 23, end_line: 26, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@exit', kind: 'exit', start_line: 23, end_line: 26, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/safeFlow@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize', kind: 'function', signature: 'src/taint.sanitize', name: 'sanitize', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 10, end_line: 12, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:10', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:10', kind: 'call', callee: 'can://typescript/dataflow-app/@external/(builtin)/replace', start_line: 11, end_line: 11, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3', kind: 'statement', start_line: 11, end_line: 11, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '11:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:1', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '11:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@11:3/actual_out', kind: 'actual_out', of: '$ret', parent: '11:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@entry', kind: 'entry', start_line: 10, end_line: 12, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@exit', kind: 'exit', start_line: 10, end_line: 12, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sanitize@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sink', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink', kind: 'function', signature: 'src/taint.sink', name: 'sink', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 14, end_line: 16, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@entry', kind: 'entry', start_line: 14, end_line: 16, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sink@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@exit', kind: 'exit', start_line: 14, end_line: 16, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/sink@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/source', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source', kind: 'function', signature: 'src/taint.source', name: 'source', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 6, end_line: 8, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source@7:3', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/source@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source@entry', kind: 'entry', start_line: 6, end_line: 8, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/source@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source@exit', kind: 'exit', start_line: 6, end_line: 8, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/source@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow', kind: 'function', signature: 'src/taint.unsafeFlow', name: 'unsafeFlow', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 18, end_line: 21, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:13', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:13', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/source', start_line: 19, end_line: 19, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3', kind: 'statement', start_line: 19, end_line: 19, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@19:3/actual_out', kind: 'actual_out', of: '$ret', parent: '19:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3', kind: 'call', callee: 'can://typescript/dataflow-app/src/taint.ts/sink', start_line: 20, end_line: 20, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '20:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@20:3/actual_out', kind: 'actual_out', of: '$ret', parent: '20:3', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@entry', kind: 'entry', start_line: 18, end_line: 21, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@exit', kind: 'exit', start_line: 18, end_line: 21, _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@formal_out', p: {id: 'can://typescript/dataflow-app/src/taint.ts/unsafeFlow@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/taint.ts'}}, - {k: 'can://typescript/dataflow-app/src/util.ts', p: {id: 'can://typescript/dataflow-app/src/util.ts', kind: 'module', name: 'src/util.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 4, _module: 'src/util.ts'}} - {k: 'can://typescript/dataflow-app/src/util.ts/increment', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment', kind: 'function', signature: 'src/util.increment', name: 'increment', return_type: 'number', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 1, end_line: 3, _module: 'src/util.ts'}} - {k: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@2:3', kind: 'statement', start_line: 2, end_line: 2, _module: 'src/util.ts'}}, - {k: 'can://typescript/dataflow-app/src/util.ts/increment@entry', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@entry', kind: 'entry', start_line: 1, end_line: 3, _module: 'src/util.ts'}}, - {k: 'can://typescript/dataflow-app/src/util.ts/increment@exit', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@exit', kind: 'exit', start_line: 1, end_line: 3, _module: 'src/util.ts'}}, - {k: 'can://typescript/dataflow-app/src/util.ts/increment@formal_in:0', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@formal_in:0', kind: 'formal_in', of: 'v', _module: 'src/util.ts'}}, - {k: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', p: {id: 'can://typescript/dataflow-app/src/util.ts/increment@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}} -// ── constraints & indexes ── -// ── nodes ── -// ── relationships ── -// ── wipe this project's prior subgraph (external targets are shared) ── -CREATE CONSTRAINT application_id IF NOT EXISTS FOR (x:Application) REQUIRE x.id IS UNIQUE; -CREATE CONSTRAINT cannode_id IF NOT EXISTS FOR (x:CanNode) REQUIRE x.id IS UNIQUE; -CREATE INDEX callable_name IF NOT EXISTS FOR (c:TSCallable) ON (c.name); -CREATE INDEX cannode_kind IF NOT EXISTS FOR (n:CanNode) ON (n.kind); -CREATE INDEX cannode_module IF NOT EXISTS FOR (n:CanNode) ON (n._module); -DETACH DELETE x, m, a; -MATCH (a:Application {id: 'can://typescript/dataflow-app'}) -MATCH (a:Application {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MERGE (a)-[r:TS_CALLS]->(b) -MERGE (a)-[r:TS_CDG]->(b) -MERGE (a)-[r:TS_CFG_NEXT {_k: row.k}]->(b) -MERGE (a)-[r:TS_DDG {_k: row.k}]->(b) -MERGE (a)-[r:TS_DECLARES]->(b) -MERGE (a)-[r:TS_EXTENDS]->(b) -MERGE (a)-[r:TS_HAS_BODY_NODE]->(b) -MERGE (a)-[r:TS_HAS_FIELD]->(b) -MERGE (a)-[r:TS_HAS_METHOD]->(b) -MERGE (a)-[r:TS_HAS_MODULE]->(b) -MERGE (a)-[r:TS_IMPLEMENTS]->(b) -MERGE (a)-[r:TS_PARAM_IN]->(b) -MERGE (a)-[r:TS_PARAM_OUT]->(b) -MERGE (a)-[r:TS_RESOLVES_TO]->(b) -MERGE (a)-[r:TS_SUMMARY]->(b) -MERGE (n:Application {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -OPTIONAL MATCH (a)-[:TS_HAS_MODULE]->(m:TSModule) -OPTIONAL MATCH (m)-[:TS_DECLARES|TS_HAS_METHOD|TS_HAS_FIELD|TS_HAS_BODY_NODE*1..]->(x) -SET n += row.p, n:TSApplication; -SET n += row.p, n:TSBodyNode; -SET n += row.p, n:TSCallable; -SET n += row.p, n:TSClass; -SET n += row.p, n:TSExternal; -SET n += row.p, n:TSField; -SET n += row.p, n:TSInterface; -SET n += row.p, n:TSModule; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row \ No newline at end of file diff --git a/test/goldens/sample-app-a1.json b/test/goldens/sample-app-a1.json deleted file mode 100644 index 1a03271..0000000 --- a/test/goldens/sample-app-a1.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"types":{"UserController":{"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","qualified_name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"callables":{"show":{"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","qualified_name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/show","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"body":{"20:18":{"method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":null},"21:12":{"method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":null}}},"list":{"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/list","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"body":{"26:12":{"method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":null}}},"constructor":{"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"body":{}}},"fields":{"service":{"name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController/service","kind":"field"}}}},"functions":{"Controller":{"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller/","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"body":{}}}},"Get":{"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get/","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"body":{}}}},"Param":{"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param/","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"body":{}}}}},"fields":{}},"src/external-calls.ts":{"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3089]},"types":{},"functions":{"readsConfig":{"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/readsConfig","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]},"body":{"15:10":{"method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[938,973]},"callee":null}}},"makesCommand":{"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesCommand","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]},"body":{"27:15":{"method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1617,1630]},"callee":null},"28:3":{"method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1634,1669]},"callee":null},"28:3/2":{"method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1634,1649]},"callee":null},"29:3":{"method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1673,1702]},"callee":null}}},"makesDriver":{"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesDriver","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]},"body":{"39:10":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2044,2076]},"callee":null}}},"makesSession":{"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesSession","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]},"body":{"52:13":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2800,2866]},"callee":null},"52:46":{"method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2833,2865]},"callee":null},"53:13":{"method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2880,2891]},"callee":null},"54:3":{"method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2895,2908]},"callee":null}}},"unsafeEval":{"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]},"body":{"60:10":{"method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3076,3085]},"callee":null}}}},"fields":{}},"src/external.ts":{"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,578]},"types":{},"functions":{"fingerprint":{"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/fingerprint","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]},"body":{"7:14":{"method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[340,352]},"callee":null},"8:10":{"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[363,425]},"callee":null},"8:10/2":{"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[363,406]},"callee":null},"8:10/3":{"method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[363,383]},"callee":null}}},"extensionOf":{"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/extensionOf","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]},"body":{"15:10":{"method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[556,574]},"callee":null}}}},"fields":{}},"src/index.ts":{"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37}],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"types":{},"functions":{"main":{"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/index.ts/main","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"body":{"7:19":{"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":null},"8:3":{"method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":null},"9:3":{"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":null},"11:22":{"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":null},"12:3":{"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":null},"13:3":{"method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":null},"16:3":{"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":null},"16:12":{"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":null},"17:3":{"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":null},"17:12":{"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":null},"19:16":{"method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":null},"20:19":{"method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":null},"21:3":{"method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":null},"21:3/2":{"method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":null},"21:3/3":{"method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":null},"22:3":{"method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":null}}}},"fields":{}},"src/models.ts":{"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"types":{"Entity":{"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"is_abstract":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"callables":{"describe":{"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"id":"can://typescript/sample-app/src/models.ts/Entity/describe","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Entity/constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"body":{}}},"fields":{"id":{"name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Entity/id","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Identifiable"]},"User":{"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"callables":{"describe":{"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/describe","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"body":{}},"recordLogin":{"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/recordLogin","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"body":{"40:5":{"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":null}}},"isAdmin#get":{"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"kind":"getter","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/isAdmin","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"body":{}}},"fields":{"loginCount":{"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]}},"instances":{"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]}},"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/name","kind":"field"},"role":{"name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/role","kind":"field"}},"extends_ids":["can://typescript/sample-app/src/models.ts/Entity"],"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Robot":{"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"callables":{"describe":{"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/describe","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Robot/name","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Identifiable":{"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"callables":{},"fields":{"id":{"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]}}}},"Named":{"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"callables":{"describe":{"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Named/describe","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]}}}},"Role":{"name":"Role","signature":"src/models.Role","comments":[],"is_const":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"fields":{"Admin":{"name":"Admin","value":"admin","id":"can://typescript/sample-app/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]}},"Member":{"name":"Member","value":"member","id":"can://typescript/sample-app/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]}},"Guest":{"name":"Guest","value":"guest","id":"can://typescript/sample-app/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]}}}},"Flag":{"name":"Flag","signature":"src/models.Flag","comments":[],"is_const":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"fields":{"None":{"name":"None","value":"0","id":"can://typescript/sample-app/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]}},"Active":{"name":"Active","value":"1","id":"can://typescript/sample-app/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]}}}},"UserId":{"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]}}},"functions":{},"fields":{}},"src/services.ts":{"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"types":{"UserService":{"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"callables":{"create":{"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/create","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"body":{"25:16":{"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":null},"26:18":{"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":null},"27:5":{"method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":null}}},"createGuest":{"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/createGuest","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"body":{"32:18":{"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":null},"33:12":{"method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":null}}},"describeAll":{"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"body":{"37:12":{"method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":null}},"callables":{"":{"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"body":{}}}},"loginAll":{"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/loginAll","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"body":{"43:22":{"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":null}}},"constructor":{"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"body":{}}},"fields":{"users":{"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]}},"startId":{"name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/startId","kind":"field"}}}},"functions":{"makeGuestName":{"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/makeGuestName","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"body":{}},"announce":{"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/announce","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"body":{"13:10":{"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":null}}},"nextId":{"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/nextId","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"body":{}}},"fields":{}},"src/util.ts":{"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"types":{"StringUtil":{"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"types":{"Builder":{"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"callables":{"add":{"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"body":{"14:7":{"method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":null},"14:23":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":null}}},"build":{"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"body":{"18:14":{"method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":null}}},"constructor":{"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"body":{}}},"fields":{"parts":{"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]}}}}},"functions":{"repeat":{"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"body":{"4:12":{"method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":null},"4:12/2":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":null}}},"slug":{"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/slug","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"body":{"8:12":{"method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":null},"8:12/2":{"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":null}}}},"fields":{}}},"functions":{"classify":{"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"body":{"30:15":{"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":null},"31:5":{"method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":null}},"callables":{"keyOf":{"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify/keyOf","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"body":{"26:12":{"method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":null}}}}}},"fields":{}}},"call_graph":[],"param_in":[],"param_out":[]}} \ No newline at end of file diff --git a/test/goldens/sample-app-a2.json b/test/goldens/sample-app-a2.json deleted file mode 100644 index e78e079..0000000 --- a/test/goldens/sample-app-a2.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"types":{"UserController":{"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","qualified_name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"callables":{"show":{"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","qualified_name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/show","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"body":{"20:18":{"method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"21:12":{"method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/sample-app/src/models.ts/User/describe"}}},"list":{"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/list","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"body":{"26:12":{"method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/sample-app/src/services.ts/UserService/describeAll"}}},"constructor":{"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"body":{}}},"fields":{"service":{"name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController/service","kind":"field"}}}},"functions":{"Controller":{"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller/","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"body":{}}}},"Get":{"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get/","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"body":{}}}},"Param":{"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"body":{},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param/","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"body":{}}}}},"fields":{}},"src/external-calls.ts":{"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3089]},"types":{},"functions":{"readsConfig":{"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/readsConfig","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]},"body":{"15:10":{"method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[938,973]},"callee":"can://typescript/sample-app/@external/node:fs/readFileSync"}}},"makesCommand":{"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesCommand","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]},"body":{"27:15":{"method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1617,1630]},"callee":"can://typescript/sample-app/@external/commander/Command"},"28:3":{"method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1634,1669]},"callee":"can://typescript/sample-app/@external/commander/description"},"28:3/2":{"method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1634,1649]},"callee":"can://typescript/sample-app/@external/commander/name"},"29:3":{"method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1673,1702]},"callee":"can://typescript/sample-app/@external/commander/parse"}}},"makesDriver":{"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesDriver","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]},"body":{"39:10":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2044,2076]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"}}},"makesSession":{"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesSession","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]},"body":{"52:13":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2800,2866]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"52:46":{"method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2833,2865]},"callee":"can://typescript/sample-app/@external/neo4j-driver/basic"},"53:13":{"method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2880,2891]},"callee":"can://typescript/sample-app/@external/neo4j-driver-core/session"},"54:3":{"method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2895,2908]},"callee":"can://typescript/sample-app/@external/neo4j-driver/rxSession"}}},"unsafeEval":{"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]},"body":{"60:10":{"method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3076,3085]},"callee":"can://typescript/sample-app/@external/(builtin)/eval"}}}},"fields":{}},"src/external.ts":{"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,578]},"types":{},"functions":{"fingerprint":{"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/fingerprint","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]},"body":{"7:14":{"method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[340,352]},"callee":"can://typescript/sample-app/@external/node:crypto/randomUUID"},"8:10":{"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[363,425]},"callee":null},"8:10/2":{"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[363,406]},"callee":null},"8:10/3":{"method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[363,383]},"callee":"can://typescript/sample-app/@external/node:crypto/createHash"}}},"extensionOf":{"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/extensionOf","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]},"body":{"15:10":{"method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[556,574]},"callee":"can://typescript/sample-app/@external/node:path/extname"}}}},"fields":{}},"src/index.ts":{"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37}],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"types":{},"functions":{"main":{"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/index.ts/main","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"body":{"7:19":{"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/sample-app/src/services.ts/UserService/constructor"},"8:3":{"method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"9:3":{"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/sample-app/src/services.ts/UserService/createGuest"},"11:22":{"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/constructor"},"12:3":{"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/list"},"13:3":{"method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/show"},"16:3":{"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"16:12":{"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"17:3":{"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"17:12":{"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/sample-app/src/models.ts/Robot/constructor"},"19:16":{"method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/repeat"},"20:19":{"method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor"},"21:3":{"method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build"},"21:3/2":{"method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"21:3/3":{"method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"22:3":{"method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/sample-app/@external/(builtin)/log"}}}},"fields":{}},"src/models.ts":{"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"types":{"Entity":{"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"is_abstract":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"callables":{"describe":{"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"id":"can://typescript/sample-app/src/models.ts/Entity/describe","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Entity/constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"body":{}}},"fields":{"id":{"name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Entity/id","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Identifiable"]},"User":{"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"callables":{"describe":{"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/describe","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"body":{}},"recordLogin":{"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/recordLogin","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"body":{"40:5":{"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/sample-app/src/models.ts/Entity/constructor"}}},"isAdmin#get":{"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"kind":"getter","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/isAdmin","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"body":{}}},"fields":{"loginCount":{"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]}},"instances":{"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]}},"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/name","kind":"field"},"role":{"name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/role","kind":"field"}},"extends_ids":["can://typescript/sample-app/src/models.ts/Entity"],"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Robot":{"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"callables":{"describe":{"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/describe","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Robot/name","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Identifiable":{"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"callables":{},"fields":{"id":{"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]}}}},"Named":{"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"callables":{"describe":{"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Named/describe","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]}}}},"Role":{"name":"Role","signature":"src/models.Role","comments":[],"is_const":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"fields":{"Admin":{"name":"Admin","value":"admin","id":"can://typescript/sample-app/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]}},"Member":{"name":"Member","value":"member","id":"can://typescript/sample-app/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]}},"Guest":{"name":"Guest","value":"guest","id":"can://typescript/sample-app/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]}}}},"Flag":{"name":"Flag","signature":"src/models.Flag","comments":[],"is_const":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"fields":{"None":{"name":"None","value":"0","id":"can://typescript/sample-app/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]}},"Active":{"name":"Active","value":"1","id":"can://typescript/sample-app/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]}}}},"UserId":{"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]}}},"functions":{},"fields":{}},"src/services.ts":{"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"types":{"UserService":{"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"callables":{"create":{"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/create","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"body":{"25:16":{"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/sample-app/src/services.ts/nextId"},"26:18":{"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"27:5":{"method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/sample-app/@external/(builtin)/push"}}},"createGuest":{"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/createGuest","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"body":{"32:18":{"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/sample-app/src/services.ts/makeGuestName"},"33:12":{"method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"}}},"describeAll":{"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"body":{"37:12":{"method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/sample-app/@external/(builtin)/map"}},"callables":{"":{"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"body":{}}}},"loginAll":{"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/loginAll","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"body":{"43:22":{"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/sample-app/src/models.ts/User/recordLogin"}}},"constructor":{"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"body":{}}},"fields":{"users":{"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]}},"startId":{"name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/startId","kind":"field"}}}},"functions":{"makeGuestName":{"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/makeGuestName","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"body":{}},"announce":{"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/announce","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"body":{"13:10":{"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/sample-app/src/models.ts/Named/describe"}}},"nextId":{"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/nextId","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"body":{}}},"fields":{}},"src/util.ts":{"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"types":{"StringUtil":{"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"types":{"Builder":{"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"callables":{"add":{"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"body":{"14:7":{"method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"14:23":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"}}},"build":{"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"body":{"18:14":{"method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/sample-app/@external/(builtin)/join"}}},"constructor":{"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"body":{}}},"fields":{"parts":{"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]}}}}},"functions":{"repeat":{"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"body":{"4:12":{"method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/sample-app/@external/(builtin)/repeat"},"4:12/2":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"}}},"slug":{"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/slug","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"body":{"8:12":{"method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/sample-app/@external/(builtin)/replace"},"8:12/2":{"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/sample-app/@external/(builtin)/toLowerCase"}}}},"fields":{}}},"functions":{"classify":{"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"body":{"30:15":{"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/sample-app/src/util.ts/classify/keyOf"},"31:5":{"method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/sample-app/@external/(builtin)/push"}},"callables":{"keyOf":{"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify/keyOf","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"body":{"26:12":{"method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/sample-app/@external/(builtin)/charAt"}}}}}},"fields":{}}},"call_graph":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/external-calls.ts/readsConfig","dst":"can://typescript/sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesDriver","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","dst":"can://typescript/sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/extensionOf","dst":"can://typescript/sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/list","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/announce","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/models.ts/User/constructor","dst":"can://typescript/sample-app/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Robot/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/services.ts/nextId","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/makeGuestName","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/loginAll","dst":"can://typescript/sample-app/src/models.ts/User/recordLogin","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/src/util.ts/classify/keyOf","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/classify/keyOf","dst":"can://typescript/sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Param","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["jelly"],"weight":1}],"param_in":[],"param_out":[],"external_symbols":{"can://typescript/sample-app/@external/node:fs/readFileSync":{"id":"can://typescript/sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://typescript/sample-app/@external/commander/Command":{"id":"can://typescript/sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://typescript/sample-app/@external/commander/description":{"id":"can://typescript/sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://typescript/sample-app/@external/commander/name":{"id":"can://typescript/sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://typescript/sample-app/@external/commander/parse":{"id":"can://typescript/sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://typescript/sample-app/@external/neo4j-driver/driver":{"id":"can://typescript/sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://typescript/sample-app/@external/neo4j-driver/basic":{"id":"can://typescript/sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://typescript/sample-app/@external/neo4j-driver-core/session":{"id":"can://typescript/sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://typescript/sample-app/@external/neo4j-driver/rxSession":{"id":"can://typescript/sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://typescript/sample-app/@external/(builtin)/eval":{"id":"can://typescript/sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://typescript/sample-app/@external/node:crypto/randomUUID":{"id":"can://typescript/sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://typescript/sample-app/@external/node:crypto/createHash":{"id":"can://typescript/sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://typescript/sample-app/@external/node:path/extname":{"id":"can://typescript/sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://typescript/sample-app/@external/(builtin)/log":{"id":"can://typescript/sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/sample-app/@external/(builtin)/push":{"id":"can://typescript/sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/sample-app/@external/(builtin)/map":{"id":"can://typescript/sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/sample-app/@external/(builtin)/charAt":{"id":"can://typescript/sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/sample-app/@external/(builtin)/repeat":{"id":"can://typescript/sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/sample-app/@external/(builtin)/replace":{"id":"can://typescript/sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/sample-app/@external/(builtin)/toLowerCase":{"id":"can://typescript/sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/sample-app/@external/(builtin)/join":{"id":"can://typescript/sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/sample-app/src/controllers.ts/Controller@5:10":{"id":"can://typescript/sample-app/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Get@8:10":{"id":"can://typescript/sample-app/src/controllers.ts/Get/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Param@11:10":{"id":"can://typescript/sample-app/src/controllers.ts/Param/","kind":"callable"},"can://typescript/sample-app/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/sample-app-a3.json b/test/goldens/sample-app-a3.json deleted file mode 100644 index 98a91c4..0000000 --- a/test/goldens/sample-app-a3.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"types":{"UserController":{"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","qualified_name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"callables":{"show":{"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","qualified_name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/show","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"body":{"20:18":{"method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"21:12":{"method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/sample-app/src/models.ts/User/describe"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]}},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]}},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]}},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]}}},"cfg":[{"src":"@entry","dst":"20:5","kind":"fallthrough"},{"src":"20:5","dst":"@exit","kind":"exception"},{"src":"20:5","dst":"21:5","kind":"fallthrough"},{"src":"21:5","dst":"@exit","kind":"exception"},{"src":"21:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:5"},{"src":"20:5","dst":"21:5"}],"ddg":[{"src":"@entry","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"this.service.create","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]}]},"list":{"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/list","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"body":{"26:12":{"method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/sample-app/src/services.ts/UserService/describeAll"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]}},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]}}},"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"this.service.describeAll","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]}},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"service":{"name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController/service","kind":"field"}}}},"functions":{"Controller":{"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]}}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller/","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]}},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]}},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]}}},"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[]}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[]},"Get":{"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]}},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]}}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get/","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]}},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]}},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]}}},"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[]}},"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[]},"Param":{"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]}},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]}}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param/","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]}},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]}},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]}}},"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[]}},"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[]}},"fields":{}},"src/external-calls.ts":{"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3089]},"types":{},"functions":{"readsConfig":{"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/readsConfig","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]},"body":{"15:10":{"method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[938,973]},"callee":"can://typescript/sample-app/@external/node:fs/readFileSync"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,46],"bytes":[931,974]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]}}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[]},"makesCommand":{"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesCommand","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]},"body":{"27:15":{"method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1617,1630]},"callee":"can://typescript/sample-app/@external/commander/Command"},"28:3":{"method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1634,1669]},"callee":"can://typescript/sample-app/@external/commander/description"},"28:3/2":{"method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1634,1649]},"callee":"can://typescript/sample-app/@external/commander/name"},"29:3":{"method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1673,1702]},"callee":"can://typescript/sample-app/@external/commander/parse"},"@entry":{"kind":"entry","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]}},"27:3":{"kind":"statement","span":{"start":[27,3],"end":[27,29],"bytes":[1605,1631]}},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,14],"bytes":[1706,1717]}},"@exit":{"kind":"exit","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]}}},"cfg":[{"src":"@entry","dst":"27:3","kind":"fallthrough"},{"src":"27:3","dst":"@exit","kind":"exception"},{"src":"27:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"@exit","kind":"exception"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"27:3"},{"src":"27:3","dst":"28:3"},{"src":"28:3","dst":"29:3"},{"src":"29:3","dst":"30:3"}],"ddg":[{"src":"27:3","dst":"28:3","var":"cmd.name","prov":["reaching-defs"]},{"src":"27:3","dst":"29:3","var":"cmd.parse","prov":["reaching-defs"]},{"src":"27:3","dst":"30:3","var":"cmd","prov":["reaching-defs"]}]},"makesDriver":{"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesDriver","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]},"body":{"39:10":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2044,2076]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"@entry":{"kind":"entry","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]}},"39:3":{"kind":"statement","span":{"start":[39,3],"end":[39,43],"bytes":[2037,2077]}},"@exit":{"kind":"exit","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]}}},"cfg":[{"src":"@entry","dst":"39:3","kind":"fallthrough"},{"src":"39:3","dst":"@exit","kind":"exception"},{"src":"39:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"39:3"}],"ddg":[]},"makesSession":{"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesSession","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]},"body":{"52:13":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2800,2866]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"52:46":{"method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2833,2865]},"callee":"can://typescript/sample-app/@external/neo4j-driver/basic"},"53:13":{"method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2880,2891]},"callee":"can://typescript/sample-app/@external/neo4j-driver-core/session"},"54:3":{"method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2895,2908]},"callee":"can://typescript/sample-app/@external/neo4j-driver/rxSession"},"@entry":{"kind":"entry","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]}},"52:3":{"kind":"statement","span":{"start":[52,3],"end":[52,80],"bytes":[2790,2867]}},"53:3":{"kind":"statement","span":{"start":[53,3],"end":[53,25],"bytes":[2870,2892]}},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[55,12],"bytes":[2912,2921]}},"@exit":{"kind":"exit","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]}}},"cfg":[{"src":"@entry","dst":"52:3","kind":"fallthrough"},{"src":"52:3","dst":"@exit","kind":"exception"},{"src":"52:3","dst":"53:3","kind":"fallthrough"},{"src":"53:3","dst":"@exit","kind":"exception"},{"src":"53:3","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"@exit","kind":"exception"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"52:3"},{"src":"52:3","dst":"53:3"},{"src":"53:3","dst":"54:3"},{"src":"54:3","dst":"55:3"}],"ddg":[{"src":"52:3","dst":"53:3","var":"d.session","prov":["reaching-defs"]},{"src":"52:3","dst":"54:3","var":"d.rxSession","prov":["reaching-defs"]},{"src":"53:3","dst":"55:3","var":"s","prov":["reaching-defs"]}]},"unsafeEval":{"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]},"body":{"60:10":{"method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3076,3085]},"callee":"can://typescript/sample-app/@external/(builtin)/eval"},"@entry":{"kind":"entry","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]}},"60:3":{"kind":"statement","span":{"start":[60,3],"end":[60,20],"bytes":[3069,3086]}},"@exit":{"kind":"exit","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]}}},"cfg":[{"src":"@entry","dst":"60:3","kind":"fallthrough"},{"src":"60:3","dst":"@exit","kind":"exception"},{"src":"60:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"60:3"}],"ddg":[{"src":"@entry","dst":"60:3","var":"raw","prov":["reaching-defs"]}]}},"fields":{}},"src/external.ts":{"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,578]},"types":{},"functions":{"fingerprint":{"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/fingerprint","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]},"body":{"7:14":{"method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[340,352]},"callee":"can://typescript/sample-app/@external/node:crypto/randomUUID"},"8:10":{"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[363,425]},"callee":null},"8:10/2":{"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[363,406]},"callee":null},"8:10/3":{"method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[363,383]},"callee":"can://typescript/sample-app/@external/node:crypto/createHash"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,27],"bytes":[329,353]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[10,20],"bytes":[356,426]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]}}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"id","prov":["reaching-defs"]}]},"extensionOf":{"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/extensionOf","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]},"body":{"15:10":{"method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[556,574]},"callee":"can://typescript/sample-app/@external/node:path/extname"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,29],"bytes":[549,575]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]}}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"file","prov":["reaching-defs"]}]}},"fields":{}},"src/index.ts":{"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37}],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"types":{},"functions":{"main":{"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/index.ts/main","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"body":{"7:19":{"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/sample-app/src/services.ts/UserService/constructor"},"8:3":{"method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"9:3":{"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/sample-app/src/services.ts/UserService/createGuest"},"11:22":{"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/constructor"},"12:3":{"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/list"},"13:3":{"method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/show"},"16:3":{"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"16:12":{"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"17:3":{"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"17:12":{"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/sample-app/src/models.ts/Robot/constructor"},"19:16":{"method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/repeat"},"20:19":{"method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor"},"21:3":{"method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build"},"21:3/2":{"method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"21:3/3":{"method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"22:3":{"method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/sample-app/@external/(builtin)/log"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]}},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]}}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"12:3","kind":"fallthrough"},{"src":"12:3","dst":"@exit","kind":"exception"},{"src":"12:3","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"exception"},{"src":"16:3","dst":"17:3","kind":"fallthrough"},{"src":"17:3","dst":"@exit","kind":"exception"},{"src":"17:3","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"21:3","kind":"fallthrough"},{"src":"21:3","dst":"@exit","kind":"exception"},{"src":"21:3","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"@exit","kind":"exception"},{"src":"22:3","dst":"@exit","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"11:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"11:3","dst":"12:3"},{"src":"12:3","dst":"13:3"},{"src":"13:3","dst":"16:3"},{"src":"16:3","dst":"17:3"},{"src":"17:3","dst":"19:3"},{"src":"19:3","dst":"20:3"},{"src":"20:3","dst":"21:3"},{"src":"21:3","dst":"22:3"},{"src":"7:3","dst":"8:3"},{"src":"8:3","dst":"9:3"},{"src":"9:3","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"8:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"9:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"11:3","dst":"12:3","var":"controller.list","prov":["reaching-defs"]},{"src":"11:3","dst":"13:3","var":"controller.show","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"service.create","prov":["reaching-defs"]},{"src":"7:3","dst":"9:3","var":"service.createGuest","prov":["reaching-defs"]}]}},"fields":{}},"src/models.ts":{"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"types":{"Entity":{"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"is_abstract":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"callables":{"describe":{"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"id":"can://typescript/sample-app/src/models.ts/Entity/describe","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Entity/constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]}},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"id":{"name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Entity/id","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Identifiable"]},"User":{"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"callables":{"describe":{"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/describe","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]}},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]}},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]}}},"cfg":[{"src":"@entry","dst":"49:5","kind":"fallthrough"},{"src":"49:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"49:5"}],"ddg":[{"src":"@entry","dst":"49:5","var":"this.name","prov":["reaching-defs"]},{"src":"@entry","dst":"49:5","var":"this.role","prov":["reaching-defs"]}]},"recordLogin":{"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/recordLogin","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]}},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]}},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]}},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]}}},"cfg":[{"src":"@entry","dst":"53:5","kind":"fallthrough"},{"src":"53:5","dst":"54:5","kind":"fallthrough"},{"src":"54:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"53:5"},{"src":"@entry","dst":"54:5"}],"ddg":[{"src":"@entry","dst":"53:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"@entry","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"53:5","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"body":{"40:5":{"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/sample-app/src/models.ts/Entity/constructor"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]}},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]}}},"cfg":[{"src":"@entry","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"@exit","kind":"exception"},{"src":"40:5","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"40:5"},{"src":"40:5","dst":"41:5"}],"ddg":[{"src":"@entry","dst":"40:5","var":"id","prov":["reaching-defs"]}]},"isAdmin#get":{"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"kind":"getter","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/isAdmin","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]}},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]}},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]}}},"cfg":[{"src":"@entry","dst":"45:5","kind":"fallthrough"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"45:5"}],"ddg":[{"src":"@entry","dst":"45:5","var":"this.role","prov":["reaching-defs"]}]}},"fields":{"loginCount":{"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]}},"instances":{"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]}},"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/name","kind":"field"},"role":{"name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/role","kind":"field"}},"extends_ids":["can://typescript/sample-app/src/models.ts/Entity"],"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Robot":{"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"callables":{"describe":{"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/describe","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]}},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]}},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]}}},"cfg":[{"src":"@entry","dst":"62:5","kind":"fallthrough"},{"src":"62:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"62:5"}],"ddg":[{"src":"@entry","dst":"62:5","var":"this.name","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]}},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Robot/name","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Identifiable":{"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"callables":{},"fields":{"id":{"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]}}}},"Named":{"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"callables":{"describe":{"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Named/describe","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]}}}},"Role":{"name":"Role","signature":"src/models.Role","comments":[],"is_const":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"fields":{"Admin":{"name":"Admin","value":"admin","id":"can://typescript/sample-app/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]}},"Member":{"name":"Member","value":"member","id":"can://typescript/sample-app/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]}},"Guest":{"name":"Guest","value":"guest","id":"can://typescript/sample-app/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]}}}},"Flag":{"name":"Flag","signature":"src/models.Flag","comments":[],"is_const":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"fields":{"None":{"name":"None","value":"0","id":"can://typescript/sample-app/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]}},"Active":{"name":"Active","value":"1","id":"can://typescript/sample-app/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]}}}},"UserId":{"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]}}},"functions":{},"fields":{}},"src/services.ts":{"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"types":{"UserService":{"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"callables":{"create":{"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/create","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"body":{"25:16":{"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/sample-app/src/services.ts/nextId"},"26:18":{"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"27:5":{"method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]}},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]}},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]}},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]}}},"cfg":[{"src":"@entry","dst":"25:5","kind":"fallthrough"},{"src":"25:5","dst":"@exit","kind":"exception"},{"src":"25:5","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"27:5","kind":"fallthrough"},{"src":"27:5","dst":"@exit","kind":"exception"},{"src":"27:5","dst":"28:5","kind":"fallthrough"},{"src":"28:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:5"},{"src":"25:5","dst":"26:5"},{"src":"26:5","dst":"27:5"},{"src":"27:5","dst":"28:5"}],"ddg":[{"src":"@entry","dst":"25:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@entry","dst":"27:5","var":"this.users.push","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"26:5","dst":"27:5","var":"user","prov":["reaching-defs"]},{"src":"26:5","dst":"28:5","var":"user","prov":["reaching-defs"]}]},"createGuest":{"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/createGuest","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"body":{"32:18":{"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/sample-app/src/services.ts/makeGuestName"},"33:12":{"method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]}},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]}},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]}},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]}}},"cfg":[{"src":"@entry","dst":"32:5","kind":"fallthrough"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"32:5","dst":"33:5","kind":"fallthrough"},{"src":"33:5","dst":"@exit","kind":"exception"},{"src":"33:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"32:5"},{"src":"32:5","dst":"33:5"}],"ddg":[{"src":"@entry","dst":"32:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"this.create","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5","var":"name","prov":["reaching-defs"]}]},"describeAll":{"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"body":{"37:12":{"method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/sample-app/@external/(builtin)/map"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]}},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]}},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]}}},"callables":{"":{"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"body":{"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]}},"37:34":{"kind":"statement","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]}},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]}}},"cfg":[{"src":"@entry","dst":"37:34","kind":"fallthrough"},{"src":"37:34","dst":"@exit","kind":"exception"},{"src":"37:34","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:34"}],"ddg":[{"src":"@entry","dst":"37:34","var":"u.describe","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"37:5","kind":"fallthrough"},{"src":"37:5","dst":"@exit","kind":"exception"},{"src":"37:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:5"}],"ddg":[{"src":"@entry","dst":"37:5","var":"this.users.map","prov":["reaching-defs"]}]},"loginAll":{"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/loginAll","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"body":{"43:22":{"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/sample-app/src/models.ts/User/recordLogin"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]}},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]}},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]}},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]}},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]}}},"cfg":[{"src":"@entry","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"43:7","kind":"true"},{"src":"42:5","dst":"45:5","kind":"false"},{"src":"43:7","dst":"@exit","kind":"exception"},{"src":"43:7","dst":"42:5","kind":"loop_back"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"41:5"},{"src":"@entry","dst":"42:5"},{"src":"42:5","dst":"43:7"},{"src":"42:5","dst":"45:5"},{"src":"43:7","dst":"42:5"}],"ddg":[{"src":"@entry","dst":"42:5","var":"this.users","prov":["reaching-defs"]},{"src":"41:5","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"41:5","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"42:5","dst":"43:7","var":"u.recordLogin","prov":["reaching-defs"]},{"src":"43:7","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"43:7","dst":"45:5","var":"total","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]}},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]}}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"users":{"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]}},"startId":{"name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/startId","kind":"field"}}}},"functions":{"makeGuestName":{"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/makeGuestName","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]}}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"seed","prov":["reaching-defs"]}]},"announce":{"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/announce","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"body":{"13:10":{"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/sample-app/src/models.ts/Named/describe"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]}}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]}]},"nextId":{"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/nextId","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]}},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]}},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]}}},"cfg":[{"src":"@entry","dst":"17:46","kind":"fallthrough"},{"src":"17:46","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:46"}],"ddg":[{"src":"@entry","dst":"17:46","var":"n","prov":["reaching-defs"]}]}},"fields":{}},"src/util.ts":{"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"types":{"StringUtil":{"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"types":{"Builder":{"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"callables":{"add":{"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"body":{"14:7":{"method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"14:23":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]}},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]}},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]}}},"cfg":[{"src":"@entry","dst":"14:7","kind":"fallthrough"},{"src":"14:7","dst":"@exit","kind":"exception"},{"src":"14:7","dst":"15:7","kind":"fallthrough"},{"src":"15:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:7"},{"src":"14:7","dst":"15:7"}],"ddg":[{"src":"@entry","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@entry","dst":"14:7","var":"this.parts.push","prov":["reaching-defs"]},{"src":"@entry","dst":"15:7","var":"this","prov":["reaching-defs"]}]},"build":{"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"body":{"18:14":{"method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/sample-app/@external/(builtin)/join"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]}},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]}},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]}}},"cfg":[{"src":"@entry","dst":"18:7","kind":"fallthrough"},{"src":"18:7","dst":"@exit","kind":"exception"},{"src":"18:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"18:7"}],"ddg":[{"src":"@entry","dst":"18:7","var":"this.parts.join","prov":["reaching-defs"]}]},"constructor":{"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"body":{}}},"fields":{"parts":{"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]}}}}},"functions":{"repeat":{"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"body":{"4:12":{"method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/sample-app/@external/(builtin)/repeat"},"4:12/2":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]}},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]}},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]}}},"cfg":[{"src":"@entry","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"4:5","var":"s","prov":["reaching-defs"]}]},"slug":{"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/slug","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"body":{"8:12":{"method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/sample-app/@external/(builtin)/replace"},"8:12/2":{"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/sample-app/@external/(builtin)/toLowerCase"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]}},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]}},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]}}},"cfg":[{"src":"@entry","dst":"8:5","kind":"fallthrough"},{"src":"8:5","dst":"@exit","kind":"exception"},{"src":"8:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]}]}},"fields":{}}},"functions":{"classify":{"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"body":{"30:15":{"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/sample-app/src/util.ts/classify/keyOf"},"31:5":{"method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]}},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]}},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]}},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]}},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]}},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]}}},"callables":{"keyOf":{"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify/keyOf","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"body":{"26:12":{"method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/sample-app/@external/(builtin)/charAt"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]}},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}}},"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]}]}},"cfg":[{"src":"@entry","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"30:5","kind":"true"},{"src":"29:3","dst":"33:3","kind":"false"},{"src":"30:5","dst":"@exit","kind":"exception"},{"src":"30:5","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"29:3","kind":"loop_back"},{"src":"33:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:3"},{"src":"25:3","dst":"28:3"},{"src":"25:3","dst":"29:3"},{"src":"29:3","dst":"30:5"},{"src":"29:3","dst":"33:3"},{"src":"30:5","dst":"31:5"},{"src":"31:5","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"28:3","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"28:3","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"31:5","var":"item","prov":["reaching-defs"]},{"src":"30:5","dst":"31:5","var":"k","prov":["reaching-defs"]},{"src":"31:5","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"31:5","dst":"33:3","var":"out","prov":["reaching-defs"]}]}},"fields":{}}},"call_graph":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/external-calls.ts/readsConfig","dst":"can://typescript/sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesDriver","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","dst":"can://typescript/sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/extensionOf","dst":"can://typescript/sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/list","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/announce","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/models.ts/User/constructor","dst":"can://typescript/sample-app/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Robot/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/services.ts/nextId","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/makeGuestName","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/loginAll","dst":"can://typescript/sample-app/src/models.ts/User/recordLogin","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/src/util.ts/classify/keyOf","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/classify/keyOf","dst":"can://typescript/sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Param","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["jelly"],"weight":1}],"param_in":[],"param_out":[],"external_symbols":{"can://typescript/sample-app/@external/node:fs/readFileSync":{"id":"can://typescript/sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://typescript/sample-app/@external/commander/Command":{"id":"can://typescript/sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://typescript/sample-app/@external/commander/description":{"id":"can://typescript/sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://typescript/sample-app/@external/commander/name":{"id":"can://typescript/sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://typescript/sample-app/@external/commander/parse":{"id":"can://typescript/sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://typescript/sample-app/@external/neo4j-driver/driver":{"id":"can://typescript/sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://typescript/sample-app/@external/neo4j-driver/basic":{"id":"can://typescript/sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://typescript/sample-app/@external/neo4j-driver-core/session":{"id":"can://typescript/sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://typescript/sample-app/@external/neo4j-driver/rxSession":{"id":"can://typescript/sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://typescript/sample-app/@external/(builtin)/eval":{"id":"can://typescript/sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://typescript/sample-app/@external/node:crypto/randomUUID":{"id":"can://typescript/sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://typescript/sample-app/@external/node:crypto/createHash":{"id":"can://typescript/sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://typescript/sample-app/@external/node:path/extname":{"id":"can://typescript/sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://typescript/sample-app/@external/(builtin)/log":{"id":"can://typescript/sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/sample-app/@external/(builtin)/push":{"id":"can://typescript/sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/sample-app/@external/(builtin)/map":{"id":"can://typescript/sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/sample-app/@external/(builtin)/charAt":{"id":"can://typescript/sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/sample-app/@external/(builtin)/repeat":{"id":"can://typescript/sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/sample-app/@external/(builtin)/replace":{"id":"can://typescript/sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/sample-app/@external/(builtin)/toLowerCase":{"id":"can://typescript/sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/sample-app/@external/(builtin)/join":{"id":"can://typescript/sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/sample-app/src/controllers.ts/Controller@5:10":{"id":"can://typescript/sample-app/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Get@8:10":{"id":"can://typescript/sample-app/src/controllers.ts/Get/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Param@11:10":{"id":"can://typescript/sample-app/src/controllers.ts/Param/","kind":"callable"},"can://typescript/sample-app/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/sample-app-a4.json b/test/goldens/sample-app-a4.json deleted file mode 100644 index b4aaff7..0000000 --- a/test/goldens/sample-app-a4.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":"2.1.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"GOLDEN"},"application":{"id":"can://typescript/sample-app","kind":"application","symbol_table":{"src/controllers.ts":{"source":"import { UserService } from \"./services\";\n\n// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.\nfunction Controller(prefix: string): ClassDecorator {\n return () => undefined;\n}\nfunction Get(path: string): MethodDecorator {\n return () => undefined;\n}\nfunction Param(name: string): ParameterDecorator {\n return () => undefined;\n}\n\n@Controller(\"/users\")\nexport class UserController {\n constructor(private readonly service: UserService) {}\n\n @Get(\"/:id\")\n show(@Param(\"id\") id: string): string {\n const user = this.service.create(id);\n return user.describe();\n }\n\n @Get(\"/\")\n list(): string[] {\n return this.service.describeAll();\n }\n}\n","imports":[{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":42}],"exports":[],"comments":[{"content":"// Minimal decorator factories (NestJS/Angular-flavored) to exercise structured TSDecorator capture.","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":101}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"types":{"UserController":{"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"name":"Controller","qualified_name":"Controller","positional_arguments":["\"/users\""],"keyword_arguments":{},"start_line":14,"end_line":14,"start_column":1,"end_column":22}],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"callables":{"show":{"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/:id\""],"keyword_arguments":{},"start_line":18,"end_line":18,"start_column":3,"end_column":15}],"parameters":[{"name":"id","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[{"name":"Param","qualified_name":"Param","positional_arguments":["\"id\""],"keyword_arguments":{},"start_line":19,"end_line":19,"start_column":8,"end_column":20}],"start_line":19,"end_line":19,"start_column":8,"end_column":31}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/show","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"body":{"20:18":{"method_name":"create","receiver_expr":"this.service","receiver_type":"UserService","argument_types":["string"],"type_arguments":[],"return_type":"import(\"./models\").User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"21:12":{"method_name":"describe","receiver_expr":"user","receiver_type":"import(\"./models\").User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/sample-app/src/models.ts/User/describe"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]}},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]}},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]}},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]}},"@formal_in:0":{"kind":"formal_in","of":"id"},"@formal_out":{"kind":"formal_out","of":"$ret"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5"}},"cfg":[{"src":"@entry","dst":"20:5","kind":"fallthrough"},{"src":"20:5","dst":"@exit","kind":"exception"},{"src":"20:5","dst":"21:5","kind":"fallthrough"},{"src":"21:5","dst":"@exit","kind":"exception"},{"src":"21:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"20:5"},{"src":"20:5","dst":"21:5"}],"ddg":[{"src":"@entry","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"20:5","var":"this.service.create","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"20:5","dst":"20:5","var":"src/services.nextId"},{"src":"20:5/actual_in:0","dst":"20:5/actual_out"}]},"list":{"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"name":"Get","qualified_name":"Get","positional_arguments":["\"/\""],"keyword_arguments":{},"start_line":24,"end_line":24,"start_column":3,"end_column":12}],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/list","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"body":{"26:12":{"method_name":"describeAll","receiver_expr":"this.service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/sample-app/src/services.ts/UserService/describeAll"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]}},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5"}},"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"this.service.describeAll","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/controllers.UserController.constructor","comments":[],"decorators":[],"parameters":[{"name":"service","type":"UserService","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":16,"end_line":16,"start_column":15,"end_column":52}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]}},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]}},"@formal_in:0":{"kind":"formal_in","of":"service"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/controllers.ts/UserController/service","kind":"field"}}}},"functions":{"Controller":{"name":"Controller","signature":"src/controllers.Controller","comments":[],"decorators":[],"parameters":[{"name":"prefix","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":21,"end_column":35}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]}},"@formal_in:0":{"kind":"formal_in","of":"prefix"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Controller/","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]}},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]}},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[{"src":"5:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Get":{"name":"Get","signature":"src/controllers.Get","comments":[],"decorators":[],"parameters":[{"name":"path","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":14,"end_column":26}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]}},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]}},"@formal_in:0":{"kind":"formal_in","of":"path"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Get/","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]}},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]}},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[{"src":"8:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"Param":{"name":"Param","signature":"src/controllers.Param","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":10,"end_line":10,"start_column":16,"end_column":28}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]}},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]}},"@formal_in:0":{"kind":"formal_in","of":"name"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"callables":{"":{"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/controllers.ts/Param/","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]}},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]}},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[{"src":"11:16","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[{"src":"11:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/external-calls.ts":{"source":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,\n// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the\n// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom\n// fallback (phantoms.ts) can't reach on its own:\n// - a member call on a receiver that is itself external-typed but NOT an import binding\n// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing\n// to key off of — only the checker knows its type comes from node_modules).\n// - a bare global from lib.*.d.ts with no import at all (`eval`).\nimport { readFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport neo4j from \"neo4j-driver\";\n\n/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */\nexport function readsConfig(): string {\n return readFileSync(\"config.json\", \"utf8\");\n}\n\n/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */\nexport function makesCommand(): Command {\n const cmd = new Command();\n cmd.name(\"cli\").description(\"demo\");\n cmd.parse([\"node\", \"cli.js\"]);\n return cmd;\n}\n\n/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */\nexport function makesDriver(): unknown {\n return neo4j.driver(\"bolt://localhost\");\n}\n\n/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */\nexport function makesSession(): unknown {\n const d = neo4j.driver(\"bolt://localhost\", neo4j.auth.basic(\"user\", \"pass\"));\n const s = d.session();\n d.rxSession();\n return s;\n}\n\n/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */\nexport function unsafeEval(raw: string): unknown {\n return eval(raw);\n}\n","imports":[{"module":"node:fs","name":"readFileSync","is_type_only":false,"import_kind":"named","start_line":9,"end_line":9,"start_column":1,"end_column":40},{"module":"commander","name":"Command","is_type_only":false,"import_kind":"named","start_line":10,"end_line":10,"start_column":1,"end_column":37},{"module":"neo4j-driver","name":"neo4j","is_type_only":false,"import_kind":"default","start_line":11,"end_line":11,"start_column":1,"end_column":34}],"exports":[],"comments":[{"content":"// Exercises checker-known external targets (#53): calls the tsc resolver CAN map to a declaration,","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":100},{"content":"// but that declaration lives outside the project (a node_modules package or the TS stdlib), so the","is_docstring":false,"start_line":2,"end_line":2,"start_column":1,"end_column":100},{"content":"// resolver's `allSignatures` gate used to drop them. These are cases the import-index phantom","is_docstring":false,"start_line":3,"end_line":3,"start_column":1,"end_column":95},{"content":"// fallback (phantoms.ts) can't reach on its own:","is_docstring":false,"start_line":4,"end_line":4,"start_column":1,"end_column":50},{"content":"// - a member call on a receiver that is itself external-typed but NOT an import binding","is_docstring":false,"start_line":5,"end_line":5,"start_column":1,"end_column":91},{"content":"// (`cmd` below is a local `const`, not an `import`, so the syntactic index has nothing","is_docstring":false,"start_line":6,"end_line":6,"start_column":1,"end_column":92},{"content":"// to key off of — only the checker knows its type comes from node_modules).","is_docstring":false,"start_line":7,"end_line":7,"start_column":1,"end_column":81},{"content":"// - a bare global from lib.*.d.ts with no import at all (`eval`).","is_docstring":false,"start_line":8,"end_line":8,"start_column":1,"end_column":69},{"content":"/** named-import bare call → phantom via the existing import-index fallback (unchanged by #53). */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99},{"content":"/**\n * `new Command()` resolves through the checker path (#53): commander self-types, so the checker\n * lands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\n * import-index fallback would name it identically (named import of `Command` from `commander`),\n * so both paths agree — the checker path just wins by running first. The member calls below are\n * the case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\n * syntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.\n */","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4},{"content":"/**\n * default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\n * has a *callable* default export — neo4j-driver's default is an object — so a default-import\n * member call stands in for the `express()`-style bare default call.)\n */","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4},{"content":"/**\n * Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\n * the checker can attribute these. Each line pins a different declaration kind in the framework's\n * .d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n * - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n * - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n * - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n * access, not an import binding, so the fallback can't reach it either)\n */","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4},{"content":"/** a lib.*.d.ts global with no import at all — only the checker can classify its home. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external-calls.ts","kind":"module","span":{"start":[1,1],"end":[62,1],"bytes":[0,3089]},"types":{},"functions":{"readsConfig":{"name":"readsConfig","signature":"src/external-calls.readsConfig","comments":[{"content":"named-import bare call → phantom via the existing import-index fallback (unchanged by #53).","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":99}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/readsConfig","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]},"body":{"15:10":{"method_name":"readFileSync","argument_types":["\"config.json\"","\"utf8\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,45],"bytes":[938,973]},"callee":"can://typescript/sample-app/@external/node:fs/readFileSync"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,46],"bytes":[931,974]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[889,976]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3"},"15:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"15:3"}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"},{"src":"15:3/actual_in:1","dst":"15:3/actual_out"}]},"makesCommand":{"name":"makesCommand","signature":"src/external-calls.makesCommand","comments":[{"content":"`new Command()` resolves through the checker path (#53): commander self-types, so the checker\nlands on its ClassDeclaration in node_modules → external constructor `commander.Command`. The\nimport-index fallback would name it identically (named import of `Command` from `commander`),\nso both paths agree — the checker path just wins by running first. The member calls below are\nthe case ONLY the checker can reach: `cmd` is a local `const`, not an import binding, so the\nsyntactic index has nothing to key off of for `cmd.name`/`cmd.description`/`cmd.parse`.","is_docstring":true,"start_line":18,"end_line":25,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Command","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesCommand","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]},"body":{"27:15":{"method_name":"Command","argument_types":[],"type_arguments":[],"return_type":"Command","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[27,15],"end":[27,28],"bytes":[1617,1630]},"callee":"can://typescript/sample-app/@external/commander/Command"},"28:3":{"method_name":"description","receiver_expr":"cmd.name(\"cli\")","receiver_type":"Command","argument_types":["\"demo\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,38],"bytes":[1634,1669]},"callee":"can://typescript/sample-app/@external/commander/description"},"28:3/2":{"method_name":"name","receiver_expr":"cmd","receiver_type":"Command","argument_types":["\"cli\""],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[28,3],"end":[28,18],"bytes":[1634,1649]},"callee":"can://typescript/sample-app/@external/commander/name"},"29:3":{"method_name":"parse","receiver_expr":"cmd","receiver_type":"Command","argument_types":["string[]"],"type_arguments":[],"return_type":"Command","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[29,3],"end":[29,32],"bytes":[1673,1702]},"callee":"can://typescript/sample-app/@external/commander/parse"},"@entry":{"kind":"entry","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]}},"27:3":{"kind":"statement","span":{"start":[27,3],"end":[27,29],"bytes":[1605,1631]}},"30:3":{"kind":"statement","span":{"start":[30,3],"end":[30,14],"bytes":[1706,1717]}},"@exit":{"kind":"exit","span":{"start":[26,1],"end":[31,2],"bytes":[1561,1719]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"28:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"28:3"},"28:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"28:3"},"29:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"29:3"},"29:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"29:3"}},"cfg":[{"src":"@entry","dst":"27:3","kind":"fallthrough"},{"src":"27:3","dst":"@exit","kind":"exception"},{"src":"27:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"@exit","kind":"exception"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"@exit","kind":"exception"},{"src":"29:3","dst":"30:3","kind":"fallthrough"},{"src":"30:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"27:3"},{"src":"27:3","dst":"28:3"},{"src":"28:3","dst":"29:3"},{"src":"29:3","dst":"30:3"}],"ddg":[{"src":"27:3","dst":"28:3","var":"cmd.name","prov":["reaching-defs"]},{"src":"27:3","dst":"29:3","var":"cmd.parse","prov":["reaching-defs"]},{"src":"27:3","dst":"30:3","var":"cmd","prov":["reaching-defs"]},{"src":"30:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"28:3/actual_in:0","dst":"28:3/actual_out"},{"src":"29:3/actual_in:0","dst":"29:3/actual_out"}]},"makesDriver":{"name":"makesDriver","signature":"src/external-calls.makesDriver","comments":[{"content":"default-import member call → external `neo4j-driver.driver`. (No direct dependency of this repo\nhas a *callable* default export — neo4j-driver's default is an object — so a default-import\nmember call stands in for the `express()`-style bare default call.)","is_docstring":true,"start_line":33,"end_line":37,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesDriver","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]},"body":{"39:10":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\""],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[39,10],"end":[39,42],"bytes":[2044,2076]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"@entry":{"kind":"entry","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]}},"39:3":{"kind":"statement","span":{"start":[39,3],"end":[39,43],"bytes":[2037,2077]}},"@exit":{"kind":"exit","span":{"start":[38,1],"end":[40,2],"bytes":[1994,2079]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"39:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"39:3"},"39:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"39:3"}},"cfg":[{"src":"@entry","dst":"39:3","kind":"fallthrough"},{"src":"39:3","dst":"@exit","kind":"exception"},{"src":"39:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"39:3"}],"ddg":[{"src":"39:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"39:3/actual_in:0","dst":"39:3/actual_out"}]},"makesSession":{"name":"makesSession","signature":"src/external-calls.makesSession","comments":[{"content":"Member calls on a LOCAL receiver of external type — the fallback has no binding for `d`, so only\nthe checker can attribute these. Each line pins a different declaration kind in the framework's\n.d.ts, the Express/RxJS pattern from #53 (`res.json(...)`, `observable.subscribe(...)`):\n - `d.session()` → MethodDeclaration (in neo4j-driver-core, where the decl actually lives)\n - `d.rxSession()` → function-typed PropertyDeclaration (`rxSession: (cfg?) => RxSession`)\n - `neo4j.auth.basic()` → PropertySignature on a nested receiver (`neo4j.auth` is a property\n access, not an import binding, so the fallback can't reach it either)","is_docstring":true,"start_line":42,"end_line":50,"start_column":1,"end_column":4}],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/makesSession","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]},"body":{"52:13":{"method_name":"driver","receiver_expr":"neo4j","receiver_type":"{ authTokenManagers: import(\"neo4j-driver-core\").AuthTokenManagers; driver: typeof import(\"neo4j-driver\").driver; hasReachableServer: typeof import(\"neo4j-driver\").hasReachableServer; int: typeof import(\"neo4j-driver-core\").Integer.fromValue; isInt: typeof import(\"neo4j-driver-core\").Integer.isInteger; integer: { toNumber: typeof import(\"neo4j-driver-core\").Integer.toNumber; toString: typeof impor","argument_types":["\"bolt://localhost\"","import(\"neo4j-driver-core/types/types\").AuthToken"],"type_arguments":[],"return_type":"import(\"neo4j-driver\").Driver","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,13],"end":[52,79],"bytes":[2800,2866]},"callee":"can://typescript/sample-app/@external/neo4j-driver/driver"},"52:46":{"method_name":"basic","receiver_expr":"neo4j.auth","receiver_type":"{ basic: (username: string, password: string, realm?: string) => import(\"neo4j-driver\").AuthToken; kerberos: (base64EncodedTicket: string) => import(\"neo4j-driver\").AuthToken; bearer: (base64EncodedToken: string) => import(\"neo4j-driver\").AuthToken; custom: (principal: string, credentials: string, realm: string, scheme: string, parameters?: import(\"neo4j-driver/types/query-runner\").Parameters) => ","argument_types":["\"user\"","\"pass\""],"type_arguments":[],"return_type":"import(\"neo4j-driver-core/types/types\").AuthToken","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[52,46],"end":[52,78],"bytes":[2833,2865]},"callee":"can://typescript/sample-app/@external/neo4j-driver/basic"},"53:13":{"method_name":"session","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver-core\").Session","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[53,13],"end":[53,24],"bytes":[2880,2891]},"callee":"can://typescript/sample-app/@external/neo4j-driver-core/session"},"54:3":{"method_name":"rxSession","receiver_expr":"d","receiver_type":"import(\"neo4j-driver\").Driver","argument_types":[],"type_arguments":[],"return_type":"import(\"neo4j-driver\").RxSession","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[54,3],"end":[54,16],"bytes":[2895,2908]},"callee":"can://typescript/sample-app/@external/neo4j-driver/rxSession"},"@entry":{"kind":"entry","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]}},"52:3":{"kind":"statement","span":{"start":[52,3],"end":[52,80],"bytes":[2790,2867]}},"53:3":{"kind":"statement","span":{"start":[53,3],"end":[53,25],"bytes":[2870,2892]}},"55:3":{"kind":"statement","span":{"start":[55,3],"end":[55,12],"bytes":[2912,2921]}},"@exit":{"kind":"exit","span":{"start":[51,1],"end":[56,2],"bytes":[2746,2923]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"52:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"52:3"},"52:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"52:3"},"52:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"52:3"}},"cfg":[{"src":"@entry","dst":"52:3","kind":"fallthrough"},{"src":"52:3","dst":"@exit","kind":"exception"},{"src":"52:3","dst":"53:3","kind":"fallthrough"},{"src":"53:3","dst":"@exit","kind":"exception"},{"src":"53:3","dst":"54:3","kind":"fallthrough"},{"src":"54:3","dst":"@exit","kind":"exception"},{"src":"54:3","dst":"55:3","kind":"fallthrough"},{"src":"55:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"52:3"},{"src":"52:3","dst":"53:3"},{"src":"53:3","dst":"54:3"},{"src":"54:3","dst":"55:3"}],"ddg":[{"src":"52:3","dst":"53:3","var":"d.session","prov":["reaching-defs"]},{"src":"52:3","dst":"54:3","var":"d.rxSession","prov":["reaching-defs"]},{"src":"53:3","dst":"55:3","var":"s","prov":["reaching-defs"]},{"src":"55:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"52:3/actual_in:0","dst":"52:3/actual_out"},{"src":"52:3/actual_in:1","dst":"52:3/actual_out"}]},"unsafeEval":{"name":"unsafeEval","signature":"src/external-calls.unsafeEval","comments":[{"content":"a lib.*.d.ts global with no import at all — only the checker can classify its home.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":91}],"decorators":[],"parameters":[{"name":"raw","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":59,"end_line":59,"start_column":28,"end_column":39}],"type_parameters":[],"return_type":"unknown","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]},"body":{"60:10":{"method_name":"eval","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[60,10],"end":[60,19],"bytes":[3076,3085]},"callee":"can://typescript/sample-app/@external/(builtin)/eval"},"@entry":{"kind":"entry","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]}},"60:3":{"kind":"statement","span":{"start":[60,3],"end":[60,20],"bytes":[3069,3086]}},"@exit":{"kind":"exit","span":{"start":[59,1],"end":[61,2],"bytes":[3016,3088]}},"@formal_in:0":{"kind":"formal_in","of":"raw"},"@formal_out":{"kind":"formal_out","of":"$ret"},"60:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"60:3"},"60:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"60:3"}},"cfg":[{"src":"@entry","dst":"60:3","kind":"fallthrough"},{"src":"60:3","dst":"@exit","kind":"exception"},{"src":"60:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"60:3"}],"ddg":[{"src":"@entry","dst":"60:3","var":"raw","prov":["reaching-defs"]},{"src":"60:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"60:3/actual_in:0","dst":"60:3/actual_out"}]}},"fields":{}},"src/external.ts":{"source":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.\nimport { createHash, randomUUID } from \"node:crypto\";\nimport * as path from \"node:path\";\n\n/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */\nexport function fingerprint(name: string): string {\n const id = randomUUID();\n return createHash(\"sha256\")\n .update(name + id)\n .digest(\"hex\");\n}\n\n/** Namespace-import member call → phantom node:path.extname. */\nexport function extensionOf(file: string): string {\n return path.extname(file);\n}\n","imports":[{"module":"node:crypto","name":"createHash","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:crypto","name":"randomUUID","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":54},{"module":"node:path","name":"*","alias":"path","is_type_only":false,"import_kind":"namespace","start_line":3,"end_line":3,"start_column":1,"end_column":35}],"exports":[],"comments":[{"content":"// Exercises phantom (external) nodes: calls into Node builtins via named + namespace imports.","is_docstring":false,"start_line":1,"end_line":1,"start_column":1,"end_column":95},{"content":"/** Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash. */","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90},{"content":"/** Namespace-import member call → phantom node:path.extname. */","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/external.ts","kind":"module","span":{"start":[1,1],"end":[17,1],"bytes":[0,578]},"types":{},"functions":{"fingerprint":{"name":"fingerprint","signature":"src/external.fingerprint","comments":[{"content":"Bare named-import calls → phantom node:crypto.randomUUID / node:crypto.createHash.","is_docstring":true,"start_line":5,"end_line":5,"start_column":1,"end_column":90}],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":6,"end_line":6,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/fingerprint","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]},"body":{"7:14":{"method_name":"randomUUID","argument_types":[],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[7,14],"end":[7,26],"bytes":[340,352]},"callee":"can://typescript/sample-app/@external/node:crypto/randomUUID"},"8:10":{"method_name":"digest","receiver_expr":"createHash(\"sha256\")\n .update(name + id)","receiver_type":"any","argument_types":["\"hex\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[10,19],"bytes":[363,425]},"callee":null},"8:10/2":{"method_name":"update","receiver_expr":"createHash(\"sha256\")","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[9,23],"bytes":[363,406]},"callee":null},"8:10/3":{"method_name":"createHash","argument_types":["\"sha256\""],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,10],"end":[8,30],"bytes":[363,383]},"callee":"can://typescript/sample-app/@external/node:crypto/createHash"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,27],"bytes":[329,353]}},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[10,20],"bytes":[356,426]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[11,2],"bytes":[275,428]}},"@formal_in:0":{"kind":"formal_in","of":"name"},"@formal_out":{"kind":"formal_out","of":"$ret"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3"}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"7:3","dst":"8:3"}],"ddg":[{"src":"@entry","dst":"8:3","var":"name","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"id","prov":["reaching-defs"]},{"src":"8:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:3/actual_in:0","dst":"8:3/actual_out"}]},"extensionOf":{"name":"extensionOf","signature":"src/external.extensionOf","comments":[{"content":"Namespace-import member call → phantom node:path.extname.","is_docstring":true,"start_line":13,"end_line":13,"start_column":1,"end_column":65}],"decorators":[],"parameters":[{"name":"file","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":14,"end_line":14,"start_column":29,"end_column":41}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/external.ts/extensionOf","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]},"body":{"15:10":{"method_name":"extname","receiver_expr":"path","receiver_type":"any","argument_types":["string"],"type_arguments":[],"return_type":"any","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[15,10],"end":[15,28],"bytes":[556,574]},"callee":"can://typescript/sample-app/@external/node:path/extname"},"@entry":{"kind":"entry","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]}},"15:3":{"kind":"statement","span":{"start":[15,3],"end":[15,29],"bytes":[549,575]}},"@exit":{"kind":"exit","span":{"start":[14,1],"end":[16,2],"bytes":[495,577]}},"@formal_in:0":{"kind":"formal_in","of":"file"},"@formal_out":{"kind":"formal_out","of":"$ret"},"15:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"15:3"},"15:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"15:3"}},"cfg":[{"src":"@entry","dst":"15:3","kind":"fallthrough"},{"src":"15:3","dst":"@exit","kind":"exception"},{"src":"15:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"15:3"}],"ddg":[{"src":"@entry","dst":"15:3","var":"file","prov":["reaching-defs"]},{"src":"15:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"15:3/actual_in:0","dst":"15:3/actual_out"}]}},"fields":{}},"src/index.ts":{"source":"import { UserController } from \"./controllers\";\nimport { Robot, Role, User } from \"./models\";\nimport { UserService, announce } from \"./services\";\nimport { StringUtil } from \"./util\";\n\nexport function main(): void {\n const service = new UserService(100);\n service.create(\"Ada\", Role.Admin);\n service.createGuest();\n\n const controller = new UserController(service);\n controller.list();\n controller.show(\"42\");\n\n // interface-typed dispatch — RTA should expand announce -> {User,Robot}.describe\n announce(new User(1, \"Ada\", Role.Admin));\n announce(new Robot(\"r2d2\"));\n\n const slug = StringUtil.repeat(\"hello world\", 2);\n const builder = new StringUtil.Builder();\n builder.add(\"a\").add(\"b\").build();\n console.log(slug);\n}\n\nmain();\n","imports":[{"module":"./controllers","name":"UserController","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":48},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37}],"exports":[],"comments":[],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"types":{},"functions":{"main":{"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/index.ts/main","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"body":{"7:19":{"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/sample-app/src/services.ts/UserService/constructor"},"8:3":{"method_name":"create","receiver_expr":"service","receiver_type":"UserService","argument_types":["\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"9:3":{"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/sample-app/src/services.ts/UserService/createGuest"},"11:22":{"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/constructor"},"12:3":{"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/list"},"13:3":{"method_name":"show","receiver_expr":"controller","receiver_type":"UserController","argument_types":["\"42\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/sample-app/src/controllers.ts/UserController/show"},"16:3":{"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"16:12":{"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"17:3":{"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/sample-app/src/services.ts/announce"},"17:12":{"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/sample-app/src/models.ts/Robot/constructor"},"19:16":{"method_name":"repeat","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":["\"hello world\"","2"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/repeat"},"20:19":{"method_name":"Builder","receiver_expr":"StringUtil","receiver_type":"typeof StringUtil","argument_types":[],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor"},"21:3":{"method_name":"build","receiver_expr":"builder.add(\"a\").add(\"b\")","receiver_type":"StringUtil.Builder","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build"},"21:3/2":{"method_name":"add","receiver_expr":"builder.add(\"a\")","receiver_type":"StringUtil.Builder","argument_types":["\"b\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"21:3/3":{"method_name":"add","receiver_expr":"builder","receiver_type":"StringUtil.Builder","argument_types":["\"a\""],"type_arguments":[],"return_type":"StringUtil.Builder","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add"},"22:3":{"method_name":"log","receiver_expr":"console","receiver_type":"Console","argument_types":["string"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/sample-app/@external/(builtin)/log"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]}},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]}},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]}},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]}},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]}},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3"}},"cfg":[{"src":"@entry","dst":"7:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"exception"},{"src":"11:3","dst":"12:3","kind":"fallthrough"},{"src":"12:3","dst":"@exit","kind":"exception"},{"src":"12:3","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"16:3","kind":"fallthrough"},{"src":"16:3","dst":"@exit","kind":"exception"},{"src":"16:3","dst":"17:3","kind":"fallthrough"},{"src":"17:3","dst":"@exit","kind":"exception"},{"src":"17:3","dst":"19:3","kind":"fallthrough"},{"src":"19:3","dst":"@exit","kind":"exception"},{"src":"19:3","dst":"20:3","kind":"fallthrough"},{"src":"20:3","dst":"@exit","kind":"exception"},{"src":"20:3","dst":"21:3","kind":"fallthrough"},{"src":"21:3","dst":"@exit","kind":"exception"},{"src":"21:3","dst":"22:3","kind":"fallthrough"},{"src":"22:3","dst":"@exit","kind":"exception"},{"src":"22:3","dst":"@exit","kind":"fallthrough"},{"src":"7:3","dst":"@exit","kind":"exception"},{"src":"7:3","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"exception"},{"src":"8:3","dst":"9:3","kind":"fallthrough"},{"src":"9:3","dst":"@exit","kind":"exception"},{"src":"9:3","dst":"11:3","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"7:3"},{"src":"11:3","dst":"12:3"},{"src":"12:3","dst":"13:3"},{"src":"13:3","dst":"16:3"},{"src":"16:3","dst":"17:3"},{"src":"17:3","dst":"19:3"},{"src":"19:3","dst":"20:3"},{"src":"20:3","dst":"21:3"},{"src":"21:3","dst":"22:3"},{"src":"7:3","dst":"8:3"},{"src":"8:3","dst":"9:3"},{"src":"9:3","dst":"11:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"8:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"9:3","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"11:3","dst":"12:3","var":"controller.list","prov":["reaching-defs"]},{"src":"11:3","dst":"13:3","var":"controller.show","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"8:3","var":"service.create","prov":["reaching-defs"]},{"src":"7:3","dst":"9:3","var":"service.createGuest","prov":["reaching-defs"]}],"summary":[{"src":"13:3","dst":"13:3","var":"src/services.nextId"},{"src":"13:3/actual_in:0","dst":"13:3/actual_out"},{"src":"16:3/actual_in:0","dst":"16:3/actual_out"},{"src":"17:3/actual_in:0","dst":"17:3/actual_out"},{"src":"19:3/actual_in:0","dst":"19:3/actual_out"},{"src":"19:3/actual_in:1","dst":"19:3/actual_out"},{"src":"22:3/actual_in:0","dst":"22:3/actual_out"},{"src":"8:3","dst":"8:3","var":"src/services.nextId"},{"src":"8:3/actual_in:0","dst":"8:3/actual_out"},{"src":"8:3/actual_in:1","dst":"8:3/actual_out"},{"src":"9:3","dst":"9:3","var":"src/services.nextId"}]}},"fields":{}},"src/models.ts":{"source":"/** Domain models for the sample app. */\n\nexport interface Identifiable {\n readonly id: T;\n}\n\nexport interface Named {\n name: string;\n describe(): string;\n}\n\nexport type UserId = string | number;\n\nexport enum Role {\n Admin = \"admin\",\n Member = \"member\",\n Guest = \"guest\",\n}\n\nexport const enum Flag {\n None = 0,\n Active = 1,\n}\n\n/** A user of the system. */\nexport abstract class Entity implements Identifiable {\n constructor(public readonly id: ID) {}\n abstract describe(): string;\n}\n\nexport class User extends Entity implements Named {\n private loginCount = 0;\n static instances = 0;\n\n constructor(\n id: UserId,\n public name: string,\n private role: Role = Role.Member,\n ) {\n super(id);\n User.instances++;\n }\n\n get isAdmin(): boolean {\n return this.role === Role.Admin;\n }\n\n describe(): string {\n return `${this.name} (${this.role})`;\n }\n\n async recordLogin(): Promise {\n this.loginCount += 1;\n return this.loginCount;\n }\n}\n\n/** A second, unrelated implementer of Named — drives RTA subtype expansion. */\nexport class Robot implements Named {\n constructor(public name: string) {}\n describe(): string {\n return `robot:${this.name}`;\n }\n}\n","imports":[],"exports":[],"comments":[{"content":"/** Domain models for the sample app. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41},{"content":"/** A user of the system. */","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29},{"content":"/** A second, unrelated implementer of Named — drives RTA subtype expansion. */","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"types":{"Entity":{"name":"Entity","signature":"src/models.Entity","comments":[{"content":"A user of the system.","is_docstring":true,"start_line":25,"end_line":25,"start_column":1,"end_column":29}],"decorators":[],"base_classes":["src/models.Identifiable"],"implements_types":["src/models.Identifiable"],"type_parameters":[{"name":"ID","default":"string"}],"is_abstract":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"callables":{"describe":{"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":true,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[{"parameters":[],"return_type":"string","type_parameters":[],"start_line":28,"end_line":28}],"id":"can://typescript/sample-app/src/models.ts/Entity/describe","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"body":{}},"constructor":{"name":"constructor","signature":"src/models.Entity.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"ID","is_optional":false,"is_rest":false,"is_readonly":true,"accessibility":"public","decorators":[],"start_line":27,"end_line":27,"start_column":15,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Entity/constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]}},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]}},"@formal_in:0":{"kind":"formal_in","of":"id"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Entity/id","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Identifiable"]},"User":{"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"callables":{"describe":{"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/describe","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]}},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]}},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"49:5","kind":"fallthrough"},{"src":"49:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"49:5"}],"ddg":[{"src":"@entry","dst":"49:5","var":"this.name","prov":["reaching-defs"]},{"src":"@entry","dst":"49:5","var":"this.role","prov":["reaching-defs"]},{"src":"49:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"recordLogin":{"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/recordLogin","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]}},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]}},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]}},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"53:5","kind":"fallthrough"},{"src":"53:5","dst":"54:5","kind":"fallthrough"},{"src":"54:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"53:5"},{"src":"@entry","dst":"54:5"}],"ddg":[{"src":"@entry","dst":"53:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"@entry","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"53:5","dst":"54:5","var":"this.loginCount","prov":["reaching-defs"]},{"src":"54:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/models.User.constructor","comments":[],"decorators":[],"parameters":[{"name":"id","type":"UserId","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":36,"end_line":36,"start_column":5,"end_column":15},{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":37,"end_line":37,"start_column":5,"end_column":24},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"accessibility":"private","decorators":[],"start_line":38,"end_line":38,"start_column":5,"end_column":37}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"body":{"40:5":{"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/sample-app/src/models.ts/Entity/constructor"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]}},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]}},"@formal_in:0":{"kind":"formal_in","of":"id"},"@formal_in:1":{"kind":"formal_in","of":"name"},"@formal_in:2":{"kind":"formal_in","of":"role"},"@formal_out":{"kind":"formal_out","of":"$ret"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5"}},"cfg":[{"src":"@entry","dst":"40:5","kind":"fallthrough"},{"src":"40:5","dst":"@exit","kind":"exception"},{"src":"40:5","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"@exit","kind":"fallthrough"}],"cdg":[{"src":"@entry","dst":"40:5"},{"src":"40:5","dst":"41:5"}],"ddg":[{"src":"@entry","dst":"40:5","var":"id","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"kind":"getter","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"accessor_kind":"getter","overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/User/isAdmin","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]}},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]}},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"45:5","kind":"fallthrough"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"45:5"}],"ddg":[{"src":"@entry","dst":"45:5","var":"this.role","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{"loginCount":{"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]}},"instances":{"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]}},"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/name","kind":"field"},"role":{"name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/User/role","kind":"field"}},"extends_ids":["can://typescript/sample-app/src/models.ts/Entity"],"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Robot":{"name":"Robot","signature":"src/models.Robot","comments":[{"content":"A second, unrelated implementer of Named — drives RTA subtype expansion.","is_docstring":true,"start_line":58,"end_line":58,"start_column":1,"end_column":80}],"decorators":[],"base_classes":["src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"callables":{"describe":{"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/describe","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]}},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]}},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]}},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"62:5","kind":"fallthrough"},{"src":"62:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"62:5"}],"ddg":[{"src":"@entry","dst":"62:5","var":"this.name","prov":["reaching-defs"]},{"src":"62:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/models.Robot.constructor","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"accessibility":"public","decorators":[],"start_line":60,"end_line":60,"start_column":15,"end_column":34}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Robot/constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]}},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]}},"@formal_in:0":{"kind":"formal_in","of":"name"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Robot/name","kind":"field"}},"implements_ids":["can://typescript/sample-app/src/models.ts/Named"]},"Identifiable":{"name":"Identifiable","signature":"src/models.Identifiable","comments":[{"content":"Domain models for the sample app.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":41}],"base_classes":[],"type_parameters":[{"name":"T","default":"string"}],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"callables":{},"fields":{"id":{"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]}}}},"Named":{"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"callables":{"describe":{"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/models.ts/Named/describe","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"body":{}}},"fields":{"name":{"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]}}}},"Role":{"name":"Role","signature":"src/models.Role","comments":[],"is_const":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"fields":{"Admin":{"name":"Admin","value":"admin","id":"can://typescript/sample-app/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]}},"Member":{"name":"Member","value":"member","id":"can://typescript/sample-app/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]}},"Guest":{"name":"Guest","value":"guest","id":"can://typescript/sample-app/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]}}}},"Flag":{"name":"Flag","signature":"src/models.Flag","comments":[],"is_const":true,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"fields":{"None":{"name":"None","value":"0","id":"can://typescript/sample-app/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]}},"Active":{"name":"Active","value":"1","id":"can://typescript/sample-app/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]}}}},"UserId":{"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]}}},"functions":{},"fields":{}},"src/services.ts":{"source":"import { type Named, Role, User, type UserId } from \"./models\";\n\n/** Pure helper — top-level function. */\nexport function makeGuestName(seed: number): string {\n return `guest-${seed}`;\n}\n\n/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */\nexport function announce(thing: Named): string {\n return thing.describe();\n}\n\n/** Arrow function bound to a const (function_expression-style callable). */\nexport const nextId = (n: number): UserId => n + 1;\n\nexport class UserService {\n private users: User[] = [];\n\n constructor(private readonly startId: number = 0) {}\n\n create(name: string, role: Role = Role.Member): User {\n const id = nextId(this.users.length + this.startId);\n const user = new User(id, name, role);\n this.users.push(user);\n return user;\n }\n\n createGuest(): User {\n const name = makeGuestName(this.users.length);\n return this.create(name, Role.Guest);\n }\n\n describeAll(): string[] {\n return this.users.map((u) => u.describe());\n }\n\n async loginAll(): Promise {\n let total = 0;\n for (const u of this.users) {\n total += await u.recordLogin();\n }\n return total;\n }\n}\n","imports":[{"module":"./models","name":"Named","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64}],"exports":[],"comments":[{"content":"/** Pure helper — top-level function. */","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41},{"content":"/**\n * Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\n * concrete implementer of Named (User, Robot, ...).\n */","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4},{"content":"/** Arrow function bound to a const (function_expression-style callable). */","is_docstring":true,"start_line":16,"end_line":16,"start_column":1,"end_column":77}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"types":{"UserService":{"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"callables":{"create":{"name":"create","signature":"src/services.UserService.create","comments":[],"decorators":[],"parameters":[{"name":"name","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":10,"end_column":22},{"name":"role","type":"Role","default_value":"Role.Member","is_optional":true,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":24,"end_column":48}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/create","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"body":{"25:16":{"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/sample-app/src/services.ts/nextId"},"26:18":{"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/sample-app/src/models.ts/User/constructor"},"27:5":{"method_name":"push","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["User"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]}},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]}},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]}},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]}},"@formal_in:0":{"kind":"formal_in","of":"name"},"@formal_in:1":{"kind":"formal_in","of":"role"},"@formal_out":{"kind":"formal_out","of":"$ret"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5"}},"cfg":[{"src":"@entry","dst":"25:5","kind":"fallthrough"},{"src":"25:5","dst":"@exit","kind":"exception"},{"src":"25:5","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"27:5","kind":"fallthrough"},{"src":"27:5","dst":"@exit","kind":"exception"},{"src":"27:5","dst":"28:5","kind":"fallthrough"},{"src":"28:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:5"},{"src":"25:5","dst":"26:5"},{"src":"26:5","dst":"27:5"},{"src":"27:5","dst":"28:5"}],"ddg":[{"src":"@entry","dst":"25:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@entry","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@entry","dst":"27:5","var":"this.users.push","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"26:5","dst":"27:5","var":"user","prov":["reaching-defs"]},{"src":"26:5","dst":"28:5","var":"user","prov":["reaching-defs"]},{"src":"28:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"25:5/actual_in:0","dst":"25:5/actual_out"},{"src":"27:5/actual_in:0","dst":"27:5/actual_out"}]},"createGuest":{"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/createGuest","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"body":{"32:18":{"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/sample-app/src/services.ts/makeGuestName"},"33:12":{"method_name":"create","receiver_expr":"this","receiver_type":"this","argument_types":["string","Role.Guest"],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/sample-app/src/services.ts/UserService/create"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]}},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]}},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]}},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5"}},"cfg":[{"src":"@entry","dst":"32:5","kind":"fallthrough"},{"src":"32:5","dst":"@exit","kind":"exception"},{"src":"32:5","dst":"33:5","kind":"fallthrough"},{"src":"33:5","dst":"@exit","kind":"exception"},{"src":"33:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"32:5"},{"src":"32:5","dst":"33:5"}],"ddg":[{"src":"@entry","dst":"32:5","var":"this.users.length","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"src/services.nextId","prov":["reaching-defs"]},{"src":"@entry","dst":"33:5","var":"this.create","prov":["reaching-defs"]},{"src":"32:5","dst":"33:5","var":"name","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"32:5/actual_in:0","dst":"32:5/actual_out"},{"src":"33:5","dst":"33:5","var":"src/services.nextId"},{"src":"33:5/actual_in:0","dst":"33:5/actual_out"},{"src":"33:5/actual_in:1","dst":"33:5/actual_out"}]},"describeAll":{"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"body":{"37:12":{"method_name":"map","receiver_expr":"this.users","receiver_type":"User[]","argument_types":["(u: User) => string"],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/sample-app/@external/(builtin)/map"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]}},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]}},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5"}},"callables":{"":{"name":"(anonymous)","signature":"src/services.UserService.describeAll.","comments":[],"decorators":[],"parameters":[{"name":"u","type":"User","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":37,"end_line":37,"start_column":28,"end_column":29}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"body":{"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]}},"37:34":{"kind":"statement","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]}},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]}},"@formal_in:0":{"kind":"formal_in","of":"u"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"37:34","kind":"fallthrough"},{"src":"37:34","dst":"@exit","kind":"exception"},{"src":"37:34","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:34"}],"ddg":[{"src":"@entry","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"cfg":[{"src":"@entry","dst":"37:5","kind":"fallthrough"},{"src":"37:5","dst":"@exit","kind":"exception"},{"src":"37:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"37:5"}],"ddg":[{"src":"@entry","dst":"37:5","var":"this.users.map","prov":["reaching-defs"]},{"src":"37:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"37:5/actual_in:0","dst":"37:5/actual_out"}]},"loginAll":{"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"kind":"method","is_static":false,"is_abstract":false,"is_async":true,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/loginAll","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"body":{"43:22":{"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/sample-app/src/models.ts/User/recordLogin"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]}},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]}},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]}},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]}},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]}},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7"}},"cfg":[{"src":"@entry","dst":"41:5","kind":"fallthrough"},{"src":"41:5","dst":"42:5","kind":"fallthrough"},{"src":"42:5","dst":"43:7","kind":"true"},{"src":"42:5","dst":"45:5","kind":"false"},{"src":"43:7","dst":"@exit","kind":"exception"},{"src":"43:7","dst":"42:5","kind":"loop_back"},{"src":"45:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"41:5"},{"src":"@entry","dst":"42:5"},{"src":"42:5","dst":"43:7"},{"src":"42:5","dst":"45:5"},{"src":"43:7","dst":"42:5"}],"ddg":[{"src":"@entry","dst":"42:5","var":"this.users","prov":["reaching-defs"]},{"src":"41:5","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"41:5","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"42:5","dst":"43:7","var":"u.recordLogin","prov":["reaching-defs"]},{"src":"43:7","dst":"43:7","var":"total","prov":["reaching-defs"]},{"src":"43:7","dst":"45:5","var":"total","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"name":"constructor","signature":"src/services.UserService.constructor","comments":[],"decorators":[],"parameters":[{"name":"startId","type":"number","default_value":"0","is_optional":true,"is_rest":false,"is_readonly":true,"accessibility":"private","decorators":[],"start_line":22,"end_line":22,"start_column":15,"end_column":51}],"type_parameters":[],"cyclomatic_complexity":1,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/UserService/constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]}},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]}},"@formal_in:0":{"kind":"formal_in","of":"startId"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]}},"startId":{"name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false,"id":"can://typescript/sample-app/src/services.ts/UserService/startId","kind":"field"}}}},"functions":{"makeGuestName":{"name":"makeGuestName","signature":"src/services.makeGuestName","comments":[{"content":"Pure helper — top-level function.","is_docstring":true,"start_line":3,"end_line":3,"start_column":1,"end_column":41}],"decorators":[],"parameters":[{"name":"seed","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":4,"end_line":4,"start_column":31,"end_column":43}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/makeGuestName","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]}},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]}},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]}},"@formal_in:0":{"kind":"formal_in","of":"seed"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[{"src":"@entry","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"name":"announce","signature":"src/services.announce","comments":[{"content":"Calls describe() on an interface-typed receiver. Under RTA this expands to every instantiated\nconcrete implementer of Named (User, Robot, ...).","is_docstring":true,"start_line":8,"end_line":11,"start_column":1,"end_column":4}],"decorators":[],"parameters":[{"name":"thing","type":"Named","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":12,"end_line":12,"start_column":26,"end_column":38}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/announce","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"body":{"13:10":{"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/sample-app/src/models.ts/Named/describe"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]}},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]}},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]}},"@formal_in:0":{"kind":"formal_in","of":"thing"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"13:3","kind":"fallthrough"},{"src":"13:3","dst":"@exit","kind":"exception"},{"src":"13:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"13:3"}],"ddg":[{"src":"@entry","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"name":"nextId","signature":"src/services.nextId","comments":[],"decorators":[],"parameters":[{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":17,"end_line":17,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"kind":"arrow","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/services.ts/nextId","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]}},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]}},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]}},"@formal_in:0":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"}},"cfg":[{"src":"@entry","dst":"17:46","kind":"fallthrough"},{"src":"17:46","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"17:46"}],"ddg":[{"src":"@entry","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{}},"src/util.ts":{"source":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */\nexport namespace StringUtil {\n export function repeat(s: string, n: number): string {\n return slug(s).repeat(n);\n }\n\n export function slug(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, \"-\");\n }\n\n export class Builder {\n private parts: string[] = [];\n add(part: string): this {\n this.parts.push(slug(part));\n return this;\n }\n build(): string {\n return this.parts.join(\"/\");\n }\n }\n}\n\n/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */\nexport function classify(items: T[]): Record {\n function keyOf(item: T): string {\n return item.name.charAt(0);\n }\n const out: Record = {};\n for (const item of items) {\n const k = keyOf(item);\n (out[k] ??= []).push(item);\n }\n return out;\n}\n","imports":[],"exports":[],"comments":[{"content":"/** A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures. */","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106},{"content":"/** Generic top-level function with a nested helper, to exercise inner_callables + generics. */","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"is_tsx":false,"is_declaration_file":false,"id":"can://typescript/sample-app/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"types":{"StringUtil":{"name":"StringUtil","signature":"src/util.StringUtil","comments":[{"content":"A namespace with nested declarations, to exercise the namespaces{} collection + nested signatures.","is_docstring":true,"start_line":1,"end_line":1,"start_column":1,"end_column":106}],"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"types":{"Builder":{"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"is_abstract":false,"is_exported":true,"is_ambient":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"callables":{"add":{"name":"add","signature":"src/util.StringUtil.Builder.add","comments":[],"decorators":[],"parameters":[{"name":"part","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":13,"end_line":13,"start_column":9,"end_column":21}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"body":{"14:7":{"method_name":"push","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["string"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"14:23":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]}},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]}},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]}},"@formal_in:0":{"kind":"formal_in","of":"part"},"@formal_out":{"kind":"formal_out","of":"$ret"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7"}},"cfg":[{"src":"@entry","dst":"14:7","kind":"fallthrough"},{"src":"14:7","dst":"@exit","kind":"exception"},{"src":"14:7","dst":"15:7","kind":"fallthrough"},{"src":"15:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"14:7"},{"src":"14:7","dst":"15:7"}],"ddg":[{"src":"@entry","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@entry","dst":"14:7","var":"this.parts.push","prov":["reaching-defs"]},{"src":"@entry","dst":"15:7","var":"this","prov":["reaching-defs"]},{"src":"15:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"14:7/actual_in:0","dst":"14:7/actual_out"}]},"build":{"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"method","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"body":{"18:14":{"method_name":"join","receiver_expr":"this.parts","receiver_type":"string[]","argument_types":["\"/\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/sample-app/@external/(builtin)/join"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]}},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]}},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]}},"@formal_out":{"kind":"formal_out","of":"$ret"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7"}},"cfg":[{"src":"@entry","dst":"18:7","kind":"fallthrough"},{"src":"18:7","dst":"@exit","kind":"exception"},{"src":"18:7","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"18:7"}],"ddg":[{"src":"@entry","dst":"18:7","var":"this.parts.join","prov":["reaching-defs"]},{"src":"18:7","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"18:7/actual_in:0","dst":"18:7/actual_out"}]},"constructor":{"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"kind":"constructor","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":true,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"body":{}}},"fields":{"parts":{"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false,"id":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]}}}}},"functions":{"repeat":{"name":"repeat","signature":"src/util.StringUtil.repeat","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":26,"end_column":35},{"name":"n","type":"number","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":3,"end_line":3,"start_column":37,"end_column":46}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"body":{"4:12":{"method_name":"repeat","receiver_expr":"slug(s)","receiver_type":"string","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/sample-app/@external/(builtin)/repeat"},"4:12/2":{"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/sample-app/src/util.ts/StringUtil/slug"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]}},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]}},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_in:1":{"kind":"formal_in","of":"n"},"@formal_out":{"kind":"formal_out","of":"$ret"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5"}},"cfg":[{"src":"@entry","dst":"4:5","kind":"fallthrough"},{"src":"4:5","dst":"@exit","kind":"exception"},{"src":"4:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"4:5"}],"ddg":[{"src":"@entry","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@entry","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"name":"slug","signature":"src/util.StringUtil.slug","comments":[],"decorators":[],"parameters":[{"name":"s","type":"string","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":7,"end_line":7,"start_column":24,"end_column":33}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/StringUtil/slug","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"body":{"8:12":{"method_name":"replace","receiver_expr":"s.toLowerCase()","receiver_type":"string","argument_types":["RegExp","\"-\""],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/sample-app/@external/(builtin)/replace"},"8:12/2":{"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/sample-app/@external/(builtin)/toLowerCase"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]}},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]}},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]}},"@formal_in:0":{"kind":"formal_in","of":"s"},"@formal_out":{"kind":"formal_out","of":"$ret"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5"}},"cfg":[{"src":"@entry","dst":"8:5","kind":"fallthrough"},{"src":"8:5","dst":"@exit","kind":"exception"},{"src":"8:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:5"}],"ddg":[{"src":"@entry","dst":"8:5","var":"s.toLowerCase","prov":["reaching-defs"]},{"src":"8:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"8:5/actual_in:0","dst":"8:5/actual_out"},{"src":"8:5/actual_in:1","dst":"8:5/actual_out"}]}},"fields":{}}},"functions":{"classify":{"name":"classify","signature":"src/util.classify","comments":[{"content":"Generic top-level function with a nested helper, to exercise inner_callables + generics.","is_docstring":true,"start_line":23,"end_line":23,"start_column":1,"end_column":96}],"decorators":[],"parameters":[{"name":"items","type":"T[]","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":24,"end_line":24,"start_column":54,"end_column":64}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"body":{"30:15":{"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/sample-app/src/util.ts/classify/keyOf"},"31:5":{"method_name":"push","receiver_expr":"(out[k] ??= [])","receiver_type":"T[]","argument_types":["T"],"type_arguments":[],"return_type":"number","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/sample-app/@external/(builtin)/push"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]}},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]}},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]}},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]}},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]}},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]}},"@formal_in:0":{"kind":"formal_in","of":"items"},"@formal_out":{"kind":"formal_out","of":"$ret"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5"}},"callables":{"keyOf":{"name":"keyOf","signature":"src/util.classify.keyOf","comments":[],"decorators":[],"parameters":[{"name":"item","type":"T","is_optional":false,"is_rest":false,"is_readonly":false,"decorators":[],"start_line":25,"end_line":25,"start_column":18,"end_column":25}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"kind":"function","is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"id":"can://typescript/sample-app/src/util.ts/classify/keyOf","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"body":{"26:12":{"method_name":"charAt","receiver_expr":"item.name","receiver_type":"string","argument_types":["0"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/sample-app/@external/(builtin)/charAt"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]}},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]}},"@formal_in:0":{"kind":"formal_in","of":"item"},"@formal_out":{"kind":"formal_out","of":"$ret"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5"}},"cfg":[{"src":"@entry","dst":"26:5","kind":"fallthrough"},{"src":"26:5","dst":"@exit","kind":"exception"},{"src":"26:5","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"26:5"}],"ddg":[{"src":"@entry","dst":"26:5","var":"item.name.charAt","prov":["reaching-defs"]},{"src":"26:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"26:5/actual_in:0","dst":"26:5/actual_out"}]}},"cfg":[{"src":"@entry","dst":"25:3","kind":"fallthrough"},{"src":"25:3","dst":"@exit","kind":"exception"},{"src":"25:3","dst":"28:3","kind":"fallthrough"},{"src":"28:3","dst":"29:3","kind":"fallthrough"},{"src":"29:3","dst":"30:5","kind":"true"},{"src":"29:3","dst":"33:3","kind":"false"},{"src":"30:5","dst":"@exit","kind":"exception"},{"src":"30:5","dst":"31:5","kind":"fallthrough"},{"src":"31:5","dst":"@exit","kind":"exception"},{"src":"31:5","dst":"29:3","kind":"loop_back"},{"src":"33:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"25:3"},{"src":"25:3","dst":"28:3"},{"src":"25:3","dst":"29:3"},{"src":"29:3","dst":"30:5"},{"src":"29:3","dst":"33:3"},{"src":"30:5","dst":"31:5"},{"src":"31:5","dst":"29:3"}],"ddg":[{"src":"@entry","dst":"29:3","var":"items","prov":["reaching-defs"]},{"src":"28:3","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"28:3","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"29:3","dst":"30:5","var":"item","prov":["reaching-defs"]},{"src":"29:3","dst":"31:5","var":"item","prov":["reaching-defs"]},{"src":"30:5","dst":"31:5","var":"k","prov":["reaching-defs"]},{"src":"31:5","dst":"31:5","var":"out[*]","prov":["reaching-defs"]},{"src":"31:5","dst":"33:3","var":"out","prov":["reaching-defs"]},{"src":"33:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[{"src":"30:5/actual_in:0","dst":"30:5/actual_out"},{"src":"31:5/actual_in:0","dst":"31:5/actual_out"}]}},"fields":{}}},"call_graph":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/external-calls.ts/readsConfig","dst":"can://typescript/sample-app/@external/node:fs/readFileSync","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/Command","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/description","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/name","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesCommand","dst":"can://typescript/sample-app/@external/commander/parse","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesDriver","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/driver","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/basic","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver-core/session","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/makesSession","dst":"can://typescript/sample-app/@external/neo4j-driver/rxSession","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external-calls.ts/unsafeEval","dst":"can://typescript/sample-app/@external/(builtin)/eval","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/randomUUID","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/fingerprint","dst":"can://typescript/sample-app/@external/node:crypto/createHash","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/external.ts/extensionOf","dst":"can://typescript/sample-app/@external/node:path/extname","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/list","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/services.ts/announce","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","prov":["tsc","jelly"],"weight":3},{"src":"can://typescript/sample-app/src/index.ts/main","dst":"can://typescript/sample-app/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/models.ts/User/constructor","dst":"can://typescript/sample-app/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/announce","dst":"can://typescript/sample-app/src/models.ts/Robot/describe","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/services.ts/nextId","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/create","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/makeGuestName","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest","dst":"can://typescript/sample-app/src/services.ts/UserService/create","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/loginAll","dst":"can://typescript/sample-app/src/models.ts/User/recordLogin","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/src/util.ts/classify/keyOf","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/classify","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/classify/keyOf","dst":"can://typescript/sample-app/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug","dst":"can://typescript/sample-app/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug","prov":["tsc","jelly"],"weight":2},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/sample-app/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show","dst":"can://typescript/sample-app/src/controllers.ts/Param","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list","dst":"can://typescript/sample-app/src/controllers.ts/Get","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll","dst":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","prov":["jelly"],"weight":1},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","dst":"can://typescript/sample-app/src/models.ts/User/describe","prov":["jelly"],"weight":1}],"param_in":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show@20:5","dst":"can://typescript/sample-app/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0","dst":"can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@13:3","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1"},{"src":"can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@8:3","dst":"can://typescript/sample-app/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/sample-app/src/index.ts/main@9:3","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/nextId@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5","dst":"can://typescript/sample-app/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0"}],"param_out":[{"src":"can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@11:3/actual_out"},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@12:3/actual_out"},{"src":"can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@13:3/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out","dst":"can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/User/constructor@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/User/constructor@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/User/describe@formal_out","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out"},{"src":"can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/announce@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/announce@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/makeGuestName@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/nextId@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@7:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@formal_out","dst":"can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@8:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/create@formal_out","dst":"can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@9:3/actual_out"},{"src":"can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out","dst":"can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out","dst":"can://typescript/sample-app/src/util.ts/classify@30:5/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out","dst":"can://typescript/sample-app/src/index.ts/main@19:3/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out"},{"src":"can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out"}],"external_symbols":{"can://typescript/sample-app/@external/node:fs/readFileSync":{"id":"can://typescript/sample-app/@external/node:fs/readFileSync","kind":"external","module":"node:fs","name":"readFileSync"},"can://typescript/sample-app/@external/commander/Command":{"id":"can://typescript/sample-app/@external/commander/Command","kind":"external","module":"commander","name":"Command"},"can://typescript/sample-app/@external/commander/description":{"id":"can://typescript/sample-app/@external/commander/description","kind":"external","module":"commander","name":"description"},"can://typescript/sample-app/@external/commander/name":{"id":"can://typescript/sample-app/@external/commander/name","kind":"external","module":"commander","name":"name"},"can://typescript/sample-app/@external/commander/parse":{"id":"can://typescript/sample-app/@external/commander/parse","kind":"external","module":"commander","name":"parse"},"can://typescript/sample-app/@external/neo4j-driver/driver":{"id":"can://typescript/sample-app/@external/neo4j-driver/driver","kind":"external","module":"neo4j-driver","name":"driver"},"can://typescript/sample-app/@external/neo4j-driver/basic":{"id":"can://typescript/sample-app/@external/neo4j-driver/basic","kind":"external","module":"neo4j-driver","name":"basic"},"can://typescript/sample-app/@external/neo4j-driver-core/session":{"id":"can://typescript/sample-app/@external/neo4j-driver-core/session","kind":"external","module":"neo4j-driver-core","name":"session"},"can://typescript/sample-app/@external/neo4j-driver/rxSession":{"id":"can://typescript/sample-app/@external/neo4j-driver/rxSession","kind":"external","module":"neo4j-driver","name":"rxSession"},"can://typescript/sample-app/@external/(builtin)/eval":{"id":"can://typescript/sample-app/@external/(builtin)/eval","kind":"external","module":"(builtin)","name":"eval"},"can://typescript/sample-app/@external/node:crypto/randomUUID":{"id":"can://typescript/sample-app/@external/node:crypto/randomUUID","kind":"external","module":"node:crypto","name":"randomUUID"},"can://typescript/sample-app/@external/node:crypto/createHash":{"id":"can://typescript/sample-app/@external/node:crypto/createHash","kind":"external","module":"node:crypto","name":"createHash"},"can://typescript/sample-app/@external/node:path/extname":{"id":"can://typescript/sample-app/@external/node:path/extname","kind":"external","module":"node:path","name":"extname"},"can://typescript/sample-app/@external/(builtin)/log":{"id":"can://typescript/sample-app/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/sample-app/@external/(builtin)/push":{"id":"can://typescript/sample-app/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/sample-app/@external/(builtin)/map":{"id":"can://typescript/sample-app/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/sample-app/@external/(builtin)/charAt":{"id":"can://typescript/sample-app/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/sample-app/@external/(builtin)/repeat":{"id":"can://typescript/sample-app/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/sample-app/@external/(builtin)/replace":{"id":"can://typescript/sample-app/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/sample-app/@external/(builtin)/toLowerCase":{"id":"can://typescript/sample-app/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/sample-app/@external/(builtin)/join":{"id":"can://typescript/sample-app/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/sample-app/src/controllers.ts/Controller@5:10":{"id":"can://typescript/sample-app/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Get@8:10":{"id":"can://typescript/sample-app/src/controllers.ts/Get/","kind":"callable"},"can://typescript/sample-app/src/controllers.ts/Param@11:10":{"id":"can://typescript/sample-app/src/controllers.ts/Param/","kind":"callable"},"can://typescript/sample-app/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/sample-app/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/test/goldens/sample-app.cypher b/test/goldens/sample-app.cypher deleted file mode 100644 index b93cc18..0000000 --- a/test/goldens/sample-app.cypher +++ /dev/null @@ -1,1532 +0,0 @@ - - - - - {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/controllers.ts', p: {}}, - {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/external-calls.ts', p: {}}, - {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/external.ts', p: {}}, - {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/index.ts', p: {}}, - {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/models.ts', p: {}}, - {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/services.ts', p: {}}, - {f: 'can://typescript/sample-app', t: 'can://typescript/sample-app/src/util.ts', p: {}} - {f: 'can://typescript/sample-app/src/controllers.ts', t: 'can://typescript/sample-app/src/controllers.ts/Controller', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts', t: 'can://typescript/sample-app/src/controllers.ts/Get', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts', t: 'can://typescript/sample-app/src/controllers.ts/Param', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts', t: 'can://typescript/sample-app/src/controllers.ts/UserController', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller/', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller', t: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller/', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller/', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller/', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller/', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', t: 'can://typescript/sample-app/src/controllers.ts/Controller@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', t: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', t: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', t: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get/', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get', t: 'can://typescript/sample-app/src/controllers.ts/Get@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get/', t: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get/', t: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get/', t: 'can://typescript/sample-app/src/controllers.ts/Get/@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get/', t: 'can://typescript/sample-app/src/controllers.ts/Get/@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', t: 'can://typescript/sample-app/src/controllers.ts/Get/@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', t: 'can://typescript/sample-app/src/controllers.ts/Get/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', t: 'can://typescript/sample-app/src/controllers.ts/Get@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', t: 'can://typescript/sample-app/src/controllers.ts/Get@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get@entry', t: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Get@entry', t: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param/', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param', t: 'can://typescript/sample-app/src/controllers.ts/Param@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param/', t: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param/', t: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param/', t: 'can://typescript/sample-app/src/controllers.ts/Param/@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param/', t: 'can://typescript/sample-app/src/controllers.ts/Param/@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', t: 'can://typescript/sample-app/src/controllers.ts/Param/@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', t: 'can://typescript/sample-app/src/controllers.ts/Param/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', t: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', t: 'can://typescript/sample-app/src/controllers.ts/Param@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', t: 'can://typescript/sample-app/src/controllers.ts/Param@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param@entry', t: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/Param@entry', t: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController', t: 'can://typescript/sample-app/src/controllers.ts/UserController/service', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/Get', p: {weight: 1, prov: ['jelly']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:12', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:12', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', k: 'this.service.describeAll|reaching-defs', p: {var: 'this.service.describeAll', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@12:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/Get', p: {weight: 1, prov: ['jelly']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/Param', p: {weight: 1, prov: ['jelly']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:18', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:12', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:18', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', k: 'user.describe|reaching-defs', p: {var: 'user.describe', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:12', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', k: 'id|reaching-defs', p: {var: 'id', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', k: 'this.service.create|reaching-defs', p: {var: 'this.service.create', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', p: {}}, - {f: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/@external/commander/Command', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/@external/commander/description', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/@external/commander/name', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/@external/commander/parse', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:15', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/2', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:15', t: 'can://typescript/sample-app/@external/commander/Command', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', k: 'cmd.name|reaching-defs', p: {var: 'cmd.name', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', k: 'cmd.parse|reaching-defs', p: {var: 'cmd.parse', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', k: 'cmd|reaching-defs', p: {var: 'cmd', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', t: 'can://typescript/sample-app/@external/commander/description', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/2', t: 'can://typescript/sample-app/@external/commander/name', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', t: 'can://typescript/sample-app/@external/commander/parse', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:10', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:10', t: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/@external/neo4j-driver-core/session', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/@external/neo4j-driver/basic', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:13', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:46', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:13', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:13', t: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', k: 'd.session|reaching-defs', p: {var: 'd.session', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', k: 'd.rxSession|reaching-defs', p: {var: 'd.rxSession', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:1', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:46', t: 'can://typescript/sample-app/@external/neo4j-driver/basic', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:13', t: 'can://typescript/sample-app/@external/neo4j-driver-core/session', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', t: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', t: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/@external/node:fs/readFileSync', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:10', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:10', t: 'can://typescript/sample-app/@external/node:fs/readFileSync', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:1', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', t: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/@external/(builtin)/eval', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:10', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:10', t: 'can://typescript/sample-app/@external/(builtin)/eval', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_in:0', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', k: 'raw|reaching-defs', p: {var: 'raw', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', t: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts', t: 'can://typescript/sample-app/src/external.ts/extensionOf', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts', t: 'can://typescript/sample-app/src/external.ts/fingerprint', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/@external/node:path/extname', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:10', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf', t: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:10', t: 'can://typescript/sample-app/@external/node:path/extname', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', t: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', t: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', t: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_in:0', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', k: 'file|reaching-defs', p: {var: 'file', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', t: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/@external/node:crypto/createHash', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/@external/node:crypto/randomUUID', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@7:14', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/2', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/3', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint', t: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:14', t: 'can://typescript/sample-app/@external/node:crypto/randomUUID', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', k: 'id|reaching-defs', p: {var: 'id', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/3', t: 'can://typescript/sample-app/@external/node:crypto/createHash', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', t: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_in:0', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', t: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', t: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', p: {}}, - {f: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', t: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts', t: 'can://typescript/sample-app/src/index.ts/main', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/@external/(builtin)/log', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@11:22', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@11:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@12:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@12:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@13:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:12', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@17:12', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@17:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:16', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@20:19', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@20:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3/2', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3/3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@22:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@7:19', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@7:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@8:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@9:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@9:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@entry', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@exit', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/index.ts/main@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/services.ts/announce', p: {weight: 3, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {weight: 3, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/sample-app/src/index.ts/main', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@11:22', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@12:3', k: 'controller.list|reaching-defs', p: {var: 'controller.list', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@12:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@12:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@13:3', k: 'controller.show|reaching-defs', p: {var: 'controller.show', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@11:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0', t: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@12:3', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@12:3', t: 'can://typescript/sample-app/src/index.ts/main@13:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@12:3', t: 'can://typescript/sample-app/src/index.ts/main@13:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@12:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/index.ts/main@13:3', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/index.ts/main@16:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/index.ts/main@16:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@13:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:12', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3', t: 'can://typescript/sample-app/src/index.ts/main@17:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3', t: 'can://typescript/sample-app/src/index.ts/main@17:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3', t: 'can://typescript/sample-app/src/services.ts/announce', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@17:12', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@17:3', t: 'can://typescript/sample-app/src/index.ts/main@19:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@17:3', t: 'can://typescript/sample-app/src/index.ts/main@19:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@17:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@17:3', t: 'can://typescript/sample-app/src/services.ts/announce', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:16', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:3', t: 'can://typescript/sample-app/src/index.ts/main@20:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:3', t: 'can://typescript/sample-app/src/index.ts/main@20:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:3', t: 'can://typescript/sample-app/src/index.ts/main@22:3', k: 'slug|reaching-defs', p: {var: 'slug', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@20:19', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@20:3', t: 'can://typescript/sample-app/src/index.ts/main@21:3', k: 'builder.add|reaching-defs', p: {var: 'builder.add', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@20:3', t: 'can://typescript/sample-app/src/index.ts/main@21:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@20:3', t: 'can://typescript/sample-app/src/index.ts/main@21:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@20:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@21:3', t: 'can://typescript/sample-app/src/index.ts/main@22:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@21:3', t: 'can://typescript/sample-app/src/index.ts/main@22:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@21:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@21:3', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@21:3/2', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@21:3/3', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@22:3', t: 'can://typescript/sample-app/@external/(builtin)/log', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@22:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@22:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@7:19', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@11:3', k: 'service|reaching-defs', p: {var: 'service', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@8:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@8:3', k: 'service.create|reaching-defs', p: {var: 'service.create', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@8:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@9:3', k: 'service.createGuest|reaching-defs', p: {var: 'service.createGuest', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@7:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/index.ts/main@8:3', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/index.ts/main@9:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/index.ts/main@9:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3', t: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/index.ts/main@11:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/index.ts/main@11:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/index.ts/main@9:3', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/index.ts/main@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@9:3', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@13:3', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@7:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@7:3', p: {}}, - {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@8:3', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/index.ts/main@entry', t: 'can://typescript/sample-app/src/index.ts/main@9:3', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Entity', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Flag', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Identifiable', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Named', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Robot', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/Role', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/User', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts', t: 'can://typescript/sample-app/src/models.ts/UserId', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity', t: 'can://typescript/sample-app/src/models.ts/Entity/describe', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity', t: 'can://typescript/sample-app/src/models.ts/Entity/id', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity', t: 'can://typescript/sample-app/src/models.ts/Identifiable', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@entry', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@exit', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Flag', t: 'can://typescript/sample-app/src/models.ts/Flag/Active', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Flag', t: 'can://typescript/sample-app/src/models.ts/Flag/None', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Identifiable', t: 'can://typescript/sample-app/src/models.ts/Identifiable/id', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Named', t: 'can://typescript/sample-app/src/models.ts/Named/describe', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Named', t: 'can://typescript/sample-app/src/models.ts/Named/name', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot', t: 'can://typescript/sample-app/src/models.ts/Named', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot', t: 'can://typescript/sample-app/src/models.ts/Robot/describe', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot', t: 'can://typescript/sample-app/src/models.ts/Robot/name', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@entry', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@exit', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/Robot/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@exit', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', k: 'this.name|reaching-defs', p: {var: 'this.name', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', t: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Role', t: 'can://typescript/sample-app/src/models.ts/Role/Admin', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Role', t: 'can://typescript/sample-app/src/models.ts/Role/Guest', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/Role', t: 'can://typescript/sample-app/src/models.ts/Role/Member', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/Entity', p: {}} - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/Named', p: {}} - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/instances', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/loginCount', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/name', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User', t: 'can://typescript/sample-app/src/models.ts/User/role', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', t: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', t: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', t: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0', t: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', t: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', k: 'id|reaching-defs', p: {var: 'id', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', t: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe', t: 'can://typescript/sample-app/src/models.ts/User/describe@entry', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe', t: 'can://typescript/sample-app/src/models.ts/User/describe@exit', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe', t: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', t: 'can://typescript/sample-app/src/models.ts/User/describe@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', t: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe@entry', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe@entry', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', k: 'this.name|reaching-defs', p: {var: 'this.name', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe@entry', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', k: 'this.role|reaching-defs', p: {var: 'this.role', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe@entry', t: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@exit', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', k: 'this.role|reaching-defs', p: {var: 'this.role', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', t: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@exit', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', k: 'this.loginCount|reaching-defs', p: {var: 'this.loginCount', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', k: 'this.loginCount|reaching-defs', p: {var: 'this.loginCount', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', k: 'this.loginCount|reaching-defs', p: {var: 'this.loginCount', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', p: {}}, - {f: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts', t: 'can://typescript/sample-app/src/services.ts/UserService', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts', t: 'can://typescript/sample-app/src/services.ts/announce', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts', t: 'can://typescript/sample-app/src/services.ts/makeGuestName', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts', t: 'can://typescript/sample-app/src/services.ts/nextId', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/startId', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService', t: 'can://typescript/sample-app/src/services.ts/UserService/users', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/constructor@exit', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:16', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:18', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create', t: 'can://typescript/sample-app/src/services.ts/nextId', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:16', t: 'can://typescript/sample-app/src/services.ts/nextId', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', k: 'id|reaching-defs', p: {var: 'id', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/nextId@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:18', t: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', k: 'user|reaching-defs', p: {var: 'user', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', k: 'user|reaching-defs', p: {var: 'user', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2', t: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', k: 'this.startId|reaching-defs', p: {var: 'this.startId', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', k: 'this.users.length|reaching-defs', p: {var: 'this.users.length', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', k: 'role|reaching-defs', p: {var: 'role', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', k: 'this.users.push|reaching-defs', p: {var: 'this.users.push', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', t: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:18', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:12', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', t: 'can://typescript/sample-app/src/services.ts/makeGuestName', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:18', t: 'can://typescript/sample-app/src/services.ts/makeGuestName', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', k: 'name|reaching-defs', p: {var: 'name', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:12', t: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', p: {var: 'src/services.nextId'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', t: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', k: 'this.users.length|reaching-defs', p: {var: 'this.users.length', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', k: 'src/services.nextId|reaching-defs', p: {var: 'src/services.nextId', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', k: 'this.create|reaching-defs', p: {var: 'this.create', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@9:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/@external/(builtin)/map', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', p: {weight: 1, prov: ['jelly']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:12', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {weight: 1, prov: ['jelly']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', k: 'u.describe|reaching-defs', p: {var: 'u.describe', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:12', t: 'can://typescript/sample-app/@external/(builtin)/map', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_in:0', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', k: 'this.users.map|reaching-defs', p: {var: 'this.users.map', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', t: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:22', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', k: 'total|reaching-defs', p: {var: 'total', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', k: 'total|reaching-defs', p: {var: 'total', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', k: 'u.recordLogin|reaching-defs', p: {var: 'u.recordLogin', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:22', t: 'can://typescript/sample-app/src/models.ts/User/recordLogin', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', k: 'loop_back', p: {kind: 'loop_back'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', k: 'total|reaching-defs', p: {var: 'total', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', k: 'total|reaching-defs', p: {var: 'total', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', k: 'this.users|reaching-defs', p: {var: 'this.users', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', t: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/models.ts/Named/describe', p: {weight: 1, prov: ['tsc']}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/models.ts/Robot/describe', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/models.ts/User/describe', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@13:10', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@13:3', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce', t: 'can://typescript/sample-app/src/services.ts/announce@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@13:10', t: 'can://typescript/sample-app/src/models.ts/Named/describe', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@13:3', t: 'can://typescript/sample-app/src/services.ts/announce@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@13:3', t: 'can://typescript/sample-app/src/services.ts/announce@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@13:3', t: 'can://typescript/sample-app/src/services.ts/announce@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@entry', t: 'can://typescript/sample-app/src/services.ts/announce@13:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@entry', t: 'can://typescript/sample-app/src/services.ts/announce@13:3', k: 'thing.describe|reaching-defs', p: {var: 'thing.describe', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@entry', t: 'can://typescript/sample-app/src/services.ts/announce@13:3', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/announce@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', k: 'seed|reaching-defs', p: {var: 'seed', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', t: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@17:46', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@entry', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@exit', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId', t: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId@17:46', t: 'can://typescript/sample-app/src/services.ts/nextId@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId@17:46', t: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId@entry', t: 'can://typescript/sample-app/src/services.ts/nextId@17:46', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId@entry', t: 'can://typescript/sample-app/src/services.ts/nextId@17:46', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId@entry', t: 'can://typescript/sample-app/src/services.ts/nextId@17:46', p: {}}, - {f: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', t: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts', t: 'can://typescript/sample-app/src/util.ts/StringUtil', p: {}} - {f: 'can://typescript/sample-app/src/util.ts', t: 'can://typescript/sample-app/src/util.ts/classify', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', p: {}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts', p: {}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:23', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:23', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', k: 'part|reaching-defs', p: {var: 'part', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', k: 'this.parts.push|reaching-defs', p: {var: 'this.parts.push', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', k: 'this|reaching-defs', p: {var: 'this', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/@external/(builtin)/join', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:14', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:14', t: 'can://typescript/sample-app/@external/(builtin)/join', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', k: 'this.parts.join|reaching-defs', p: {var: 'this.parts.join', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/@external/(builtin)/repeat', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12/2', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12', t: 'can://typescript/sample-app/@external/(builtin)/repeat', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12/2', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', p: {}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', k: 'n|reaching-defs', p: {var: 'n', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', k: 's|reaching-defs', p: {var: 's', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', t: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/@external/(builtin)/replace', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', p: {weight: 1, prov: ['import']}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12/2', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:1', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', p: {}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12', t: 'can://typescript/sample-app/@external/(builtin)/replace', p: {}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12/2', t: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:1', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', p: {}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', k: 'fallthrough', p: {kind: 'fallthrough'}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', k: 's.toLowerCase|reaching-defs', p: {var: 's.toLowerCase', prov: ['reaching-defs']}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', t: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', p: {}} - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', t: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', t: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', p: {}} - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf', p: {weight: 2, prov: ['tsc', 'jelly']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@25:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@28:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@30:15', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@30:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@entry', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@exit', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify', t: 'can://typescript/sample-app/src/util.ts/classify@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/@external/(builtin)/charAt', p: {weight: 1, prov: ['import']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:12', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:12', t: 'can://typescript/sample-app/@external/(builtin)/charAt', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', k: 'item.name.charAt|reaching-defs', p: {var: 'item.name.charAt', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', t: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@25:3', t: 'can://typescript/sample-app/src/util.ts/classify@28:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@25:3', t: 'can://typescript/sample-app/src/util.ts/classify@28:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@25:3', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@25:3', t: 'can://typescript/sample-app/src/util.ts/classify@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@28:3', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@28:3', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'out[*]|reaching-defs', p: {var: 'out[*]', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@28:3', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@30:5', k: 'item|reaching-defs', p: {var: 'item', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@30:5', k: 'true', p: {kind: 'true'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@30:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'item|reaching-defs', p: {var: 'item', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', k: 'false', p: {kind: 'false'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@29:3', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@30:15', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@30:5', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@30:5', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'k|reaching-defs', p: {var: 'k', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@30:5', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@30:5', t: 'can://typescript/sample-app/src/util.ts/classify@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/@external/(builtin)/push', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', k: 'loop_back', p: {kind: 'loop_back'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@31:5', k: 'out[*]|reaching-defs', p: {var: 'out[*]', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@33:3', k: 'out|reaching-defs', p: {var: 'out', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@31:5', t: 'can://typescript/sample-app/src/util.ts/classify@exit', k: 'exception', p: {kind: 'exception'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_in:0', t: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_out', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@33:3', t: 'can://typescript/sample-app/src/util.ts/classify@exit', k: 'return', p: {kind: 'return'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@33:3', t: 'can://typescript/sample-app/src/util.ts/classify@formal_out', k: 'return|reaching-defs', p: {var: 'return', prov: ['reaching-defs']}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@entry', t: 'can://typescript/sample-app/src/util.ts/classify@25:3', k: 'fallthrough', p: {kind: 'fallthrough'}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@entry', t: 'can://typescript/sample-app/src/util.ts/classify@25:3', p: {}}, - {f: 'can://typescript/sample-app/src/util.ts/classify@entry', t: 'can://typescript/sample-app/src/util.ts/classify@29:3', k: 'items|reaching-defs', p: {var: 'items', prov: ['reaching-defs']}}, - {k: 'can://typescript/sample-app', p: {id: 'can://typescript/sample-app', schema_version: '2.1.0', language: 'typescript', max_level: 4, k_limit: 3, analyzer_name: 'codeanalyzer-typescript', analyzer_version: '1.0.0'}} - {k: 'can://typescript/sample-app/@external/(builtin)/charAt', p: {id: 'can://typescript/sample-app/@external/(builtin)/charAt', kind: 'external', name: 'charAt', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/(builtin)/eval', p: {id: 'can://typescript/sample-app/@external/(builtin)/eval', kind: 'external', name: 'eval', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/(builtin)/join', p: {id: 'can://typescript/sample-app/@external/(builtin)/join', kind: 'external', name: 'join', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/(builtin)/log', p: {id: 'can://typescript/sample-app/@external/(builtin)/log', kind: 'external', name: 'log', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/(builtin)/map', p: {id: 'can://typescript/sample-app/@external/(builtin)/map', kind: 'external', name: 'map', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/(builtin)/push', p: {id: 'can://typescript/sample-app/@external/(builtin)/push', kind: 'external', name: 'push', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/(builtin)/repeat', p: {id: 'can://typescript/sample-app/@external/(builtin)/repeat', kind: 'external', name: 'repeat', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/(builtin)/replace', p: {id: 'can://typescript/sample-app/@external/(builtin)/replace', kind: 'external', name: 'replace', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', p: {id: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', kind: 'external', name: 'toLowerCase', module: '(builtin)'}}, - {k: 'can://typescript/sample-app/@external/commander/Command', p: {id: 'can://typescript/sample-app/@external/commander/Command', kind: 'external', name: 'Command', module: 'commander'}}, - {k: 'can://typescript/sample-app/@external/commander/description', p: {id: 'can://typescript/sample-app/@external/commander/description', kind: 'external', name: 'description', module: 'commander'}}, - {k: 'can://typescript/sample-app/@external/commander/name', p: {id: 'can://typescript/sample-app/@external/commander/name', kind: 'external', name: 'name', module: 'commander'}}, - {k: 'can://typescript/sample-app/@external/commander/parse', p: {id: 'can://typescript/sample-app/@external/commander/parse', kind: 'external', name: 'parse', module: 'commander'}}, - {k: 'can://typescript/sample-app/@external/neo4j-driver-core/session', p: {id: 'can://typescript/sample-app/@external/neo4j-driver-core/session', kind: 'external', name: 'session', module: 'neo4j-driver-core'}}, - {k: 'can://typescript/sample-app/@external/neo4j-driver/basic', p: {id: 'can://typescript/sample-app/@external/neo4j-driver/basic', kind: 'external', name: 'basic', module: 'neo4j-driver'}}, - {k: 'can://typescript/sample-app/@external/neo4j-driver/driver', p: {id: 'can://typescript/sample-app/@external/neo4j-driver/driver', kind: 'external', name: 'driver', module: 'neo4j-driver'}}, - {k: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', p: {id: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', kind: 'external', name: 'rxSession', module: 'neo4j-driver'}}, - {k: 'can://typescript/sample-app/@external/node:crypto/createHash', p: {id: 'can://typescript/sample-app/@external/node:crypto/createHash', kind: 'external', name: 'createHash', module: 'node:crypto'}}, - {k: 'can://typescript/sample-app/@external/node:crypto/randomUUID', p: {id: 'can://typescript/sample-app/@external/node:crypto/randomUUID', kind: 'external', name: 'randomUUID', module: 'node:crypto'}}, - {k: 'can://typescript/sample-app/@external/node:fs/readFileSync', p: {id: 'can://typescript/sample-app/@external/node:fs/readFileSync', kind: 'external', name: 'readFileSync', module: 'node:fs'}}, - {k: 'can://typescript/sample-app/@external/node:path/extname', p: {id: 'can://typescript/sample-app/@external/node:path/extname', kind: 'external', name: 'extname', module: 'node:path'}} - {k: 'can://typescript/sample-app/src/controllers.ts', p: {id: 'can://typescript/sample-app/src/controllers.ts', kind: 'module', name: 'src/controllers.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 29, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller', kind: 'function', signature: 'src/controllers.Controller', name: 'Controller', return_type: 'ClassDecorator', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 4, end_line: 6, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller/', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/', kind: 'arrow', signature: 'src/controllers.Controller.', name: '(anonymous)', return_type: 'undefined', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/@5:16', kind: 'statement', start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/@entry', kind: 'entry', start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller/@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/@exit', kind: 'exit', start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller/@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@5:3', kind: 'statement', start_line: 5, end_line: 5, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@entry', kind: 'entry', start_line: 4, end_line: 6, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@exit', kind: 'exit', start_line: 4, end_line: 6, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_in:0', kind: 'formal_in', of: 'prefix', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Controller@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get', kind: 'function', signature: 'src/controllers.Get', name: 'Get', return_type: 'MethodDecorator', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 7, end_line: 9, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get/', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/', kind: 'arrow', signature: 'src/controllers.Get.', name: '(anonymous)', return_type: 'undefined', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/@8:16', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/@entry', kind: 'entry', start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get/@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/@exit', kind: 'exit', start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get/@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@8:3', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@entry', kind: 'entry', start_line: 7, end_line: 9, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@exit', kind: 'exit', start_line: 7, end_line: 9, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@formal_in:0', kind: 'formal_in', of: 'path', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Get@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Get@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param', kind: 'function', signature: 'src/controllers.Param', name: 'Param', return_type: 'ParameterDecorator', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 10, end_line: 12, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param/', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/', kind: 'arrow', signature: 'src/controllers.Param.', name: '(anonymous)', return_type: 'undefined', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/@11:16', kind: 'statement', start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/@entry', kind: 'entry', start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param/@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/@exit', kind: 'exit', start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param/@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@11:3', kind: 'statement', start_line: 11, end_line: 11, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@entry', kind: 'entry', start_line: 10, end_line: 12, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@exit', kind: 'exit', start_line: 10, end_line: 12, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@formal_in:0', kind: 'formal_in', of: 'name', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/Param@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/Param@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController', kind: 'class', signature: 'src/controllers.UserController', name: 'UserController', is_abstract: false, is_exported: true, is_ambient: false, start_line: 14, end_line: 28}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', kind: 'constructor', signature: 'src/controllers.UserController.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 16, end_line: 16, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@entry', kind: 'entry', start_line: 16, end_line: 16, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@exit', kind: 'exit', start_line: 16, end_line: 16, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_in:0', kind: 'formal_in', of: 'service', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list', kind: 'method', signature: 'src/controllers.UserController.list', name: 'list', return_type: 'string[]', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 24, end_line: 27, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:12', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:12', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', start_line: 26, end_line: 26, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5', kind: 'statement', start_line: 26, end_line: 26, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@26:5/actual_out', kind: 'actual_out', of: '$ret', parent: '26:5', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@entry', kind: 'entry', start_line: 24, end_line: 27, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@exit', kind: 'exit', start_line: 24, end_line: 27, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/list@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/service', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/service', kind: 'field', name: 'service', type: 'UserService', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show', kind: 'method', signature: 'src/controllers.UserController.show', name: 'show', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 18, end_line: 22, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:18', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:18', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/create', start_line: 20, end_line: 20, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '20:5', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@20:5/actual_out', kind: 'actual_out', of: '$ret', parent: '20:5', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:12', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:12', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/User/describe', start_line: 21, end_line: 21, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5', kind: 'statement', start_line: 21, end_line: 21, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@21:5/actual_out', kind: 'actual_out', of: '$ret', parent: '21:5', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@entry', kind: 'entry', start_line: 18, end_line: 22, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@exit', kind: 'exit', start_line: 18, end_line: 22, _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_in:0', kind: 'formal_in', of: 'id', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', p: {id: 'can://typescript/sample-app/src/controllers.ts/UserController/show@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/controllers.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts', p: {id: 'can://typescript/sample-app/src/external-calls.ts', kind: 'module', name: 'src/external-calls.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 62, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand', kind: 'function', signature: 'src/external-calls.makesCommand', name: 'makesCommand', return_type: 'Command', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 26, end_line: 31, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:15', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:15', kind: 'call', callee: 'can://typescript/sample-app/@external/commander/Command', start_line: 27, end_line: 27, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@27:3', kind: 'statement', start_line: 27, end_line: 27, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3', kind: 'call', callee: 'can://typescript/sample-app/@external/commander/description', start_line: 28, end_line: 28, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/2', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/2', kind: 'call', callee: 'can://typescript/sample-app/@external/commander/name', start_line: 28, end_line: 28, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '28:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@28:3/actual_out', kind: 'actual_out', of: '$ret', parent: '28:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3', kind: 'call', callee: 'can://typescript/sample-app/@external/commander/parse', start_line: 29, end_line: 29, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '29:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@29:3/actual_out', kind: 'actual_out', of: '$ret', parent: '29:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@30:3', kind: 'statement', start_line: 30, end_line: 30, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@entry', kind: 'entry', start_line: 26, end_line: 31, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@exit', kind: 'exit', start_line: 26, end_line: 31, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesCommand@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver', kind: 'function', signature: 'src/external-calls.makesDriver', name: 'makesDriver', return_type: 'unknown', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 38, end_line: 40, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:10', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:10', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver/driver', start_line: 39, end_line: 39, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3', kind: 'statement', start_line: 39, end_line: 39, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '39:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@39:3/actual_out', kind: 'actual_out', of: '$ret', parent: '39:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@entry', kind: 'entry', start_line: 38, end_line: 40, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@exit', kind: 'exit', start_line: 38, end_line: 40, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesDriver@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession', kind: 'function', signature: 'src/external-calls.makesSession', name: 'makesSession', return_type: 'unknown', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 51, end_line: 56, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:13', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:13', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver/driver', start_line: 52, end_line: 52, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3', kind: 'statement', start_line: 52, end_line: 52, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '52:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '52:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:3/actual_out', kind: 'actual_out', of: '$ret', parent: '52:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:46', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@52:46', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver/basic', start_line: 52, end_line: 52, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:13', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:13', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver-core/session', start_line: 53, end_line: 53, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@53:3', kind: 'statement', start_line: 53, end_line: 53, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@54:3', kind: 'call', callee: 'can://typescript/sample-app/@external/neo4j-driver/rxSession', start_line: 54, end_line: 54, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@55:3', kind: 'statement', start_line: 55, end_line: 55, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@entry', kind: 'entry', start_line: 51, end_line: 56, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@exit', kind: 'exit', start_line: 51, end_line: 56, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/makesSession@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/makesSession@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig', kind: 'function', signature: 'src/external-calls.readsConfig', name: 'readsConfig', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 14, end_line: 16, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:10', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:10', kind: 'call', callee: 'can://typescript/sample-app/@external/node:fs/readFileSync', start_line: 15, end_line: 15, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '15:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '15:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@15:3/actual_out', kind: 'actual_out', of: '$ret', parent: '15:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@entry', kind: 'entry', start_line: 14, end_line: 16, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@exit', kind: 'exit', start_line: 14, end_line: 16, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/readsConfig@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval', kind: 'function', signature: 'src/external-calls.unsafeEval', name: 'unsafeEval', return_type: 'unknown', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 59, end_line: 61, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:10', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:10', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/eval', start_line: 60, end_line: 60, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3', kind: 'statement', start_line: 60, end_line: 60, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '60:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@60:3/actual_out', kind: 'actual_out', of: '$ret', parent: '60:3', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@entry', kind: 'entry', start_line: 59, end_line: 61, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@exit', kind: 'exit', start_line: 59, end_line: 61, _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_in:0', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_in:0', kind: 'formal_in', of: 'raw', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_out', p: {id: 'can://typescript/sample-app/src/external-calls.ts/unsafeEval@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external-calls.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts', p: {id: 'can://typescript/sample-app/src/external.ts', kind: 'module', name: 'src/external.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 17, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf', kind: 'function', signature: 'src/external.extensionOf', name: 'extensionOf', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 14, end_line: 16, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf@15:10', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@15:10', kind: 'call', callee: 'can://typescript/sample-app/@external/node:path/extname', start_line: 15, end_line: 15, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '15:3', _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_out', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@15:3/actual_out', kind: 'actual_out', of: '$ret', parent: '15:3', _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@entry', kind: 'entry', start_line: 14, end_line: 16, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@exit', kind: 'exit', start_line: 14, end_line: 16, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_in:0', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_in:0', kind: 'formal_in', of: 'file', _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_out', p: {id: 'can://typescript/sample-app/src/external.ts/extensionOf@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint', kind: 'function', signature: 'src/external.fingerprint', name: 'fingerprint', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 6, end_line: 11, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@7:14', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@7:14', kind: 'call', callee: 'can://typescript/sample-app/@external/node:crypto/randomUUID', start_line: 7, end_line: 7, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@7:3', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10', kind: 'call', start_line: 8, end_line: 10, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/2', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/2', kind: 'call', start_line: 8, end_line: 9, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/3', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:10/3', kind: 'call', callee: 'can://typescript/sample-app/@external/node:crypto/createHash', start_line: 8, end_line: 8, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3', kind: 'statement', start_line: 8, end_line: 10, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '8:3', _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_out', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@8:3/actual_out', kind: 'actual_out', of: '$ret', parent: '8:3', _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@entry', kind: 'entry', start_line: 6, end_line: 11, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@exit', kind: 'exit', start_line: 6, end_line: 11, _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_in:0', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_in:0', kind: 'formal_in', of: 'name', _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_out', p: {id: 'can://typescript/sample-app/src/external.ts/fingerprint@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/external.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts', p: {id: 'can://typescript/sample-app/src/index.ts', kind: 'module', name: 'src/index.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 26, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main', p: {id: 'can://typescript/sample-app/src/index.ts/main', kind: 'function', signature: 'src/index.main', name: 'main', return_type: 'void', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 6, end_line: 23, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@11:22', p: {id: 'can://typescript/sample-app/src/index.ts/main@11:22', kind: 'call', callee: 'can://typescript/sample-app/src/controllers.ts/UserController/constructor', start_line: 11, end_line: 11, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@11:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@11:3', kind: 'statement', start_line: 11, end_line: 11, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '11:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@11:3/actual_out', kind: 'actual_out', of: '$ret', parent: '11:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@12:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@12:3', kind: 'call', callee: 'can://typescript/sample-app/src/controllers.ts/UserController/list', start_line: 12, end_line: 12, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@12:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@12:3/actual_out', kind: 'actual_out', of: '$ret', parent: '12:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@13:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@13:3', kind: 'call', callee: 'can://typescript/sample-app/src/controllers.ts/UserController/show', start_line: 13, end_line: 13, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '13:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@13:3/actual_out', kind: 'actual_out', of: '$ret', parent: '13:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@16:12', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:12', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/User/constructor', start_line: 16, end_line: 16, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@16:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/announce', start_line: 16, end_line: 16, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '16:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '16:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_in:2', kind: 'actual_in', of: 'arg2', parent: '16:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@16:3/actual_out', kind: 'actual_out', of: '$ret', parent: '16:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@17:12', p: {id: 'can://typescript/sample-app/src/index.ts/main@17:12', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/Robot/constructor', start_line: 17, end_line: 17, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@17:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@17:3', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/announce', start_line: 17, end_line: 17, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '17:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@17:3/actual_out', kind: 'actual_out', of: '$ret', parent: '17:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@19:16', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:16', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', start_line: 19, end_line: 19, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@19:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:3', kind: 'statement', start_line: 19, end_line: 19, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '19:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '19:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@19:3/actual_out', kind: 'actual_out', of: '$ret', parent: '19:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@20:19', p: {id: 'can://typescript/sample-app/src/index.ts/main@20:19', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', start_line: 20, end_line: 20, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@20:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@20:3', kind: 'statement', start_line: 20, end_line: 20, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@21:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', start_line: 21, end_line: 21, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@21:3/2', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3/2', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', start_line: 21, end_line: 21, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@21:3/3', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3/3', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', start_line: 21, end_line: 21, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '21:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@21:3/actual_out', kind: 'actual_out', of: '$ret', parent: '21:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@22:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@22:3', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/log', start_line: 22, end_line: 22, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '22:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@22:3/actual_out', kind: 'actual_out', of: '$ret', parent: '22:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@7:19', p: {id: 'can://typescript/sample-app/src/index.ts/main@7:19', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/constructor', start_line: 7, end_line: 7, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@7:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@7:3', kind: 'statement', start_line: 7, end_line: 7, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '7:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@7:3/actual_out', kind: 'actual_out', of: '$ret', parent: '7:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@8:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@8:3', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/create', start_line: 8, end_line: 8, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', p: {id: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '8:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', p: {id: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '8:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@8:3/actual_out', kind: 'actual_out', of: '$ret', parent: '8:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@9:3', p: {id: 'can://typescript/sample-app/src/index.ts/main@9:3', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', start_line: 9, end_line: 9, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@9:3/actual_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@9:3/actual_out', kind: 'actual_out', of: '$ret', parent: '9:3', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@entry', p: {id: 'can://typescript/sample-app/src/index.ts/main@entry', kind: 'entry', start_line: 6, end_line: 23, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@exit', p: {id: 'can://typescript/sample-app/src/index.ts/main@exit', kind: 'exit', start_line: 6, end_line: 23, _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/index.ts/main@formal_out', p: {id: 'can://typescript/sample-app/src/index.ts/main@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/index.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts', p: {id: 'can://typescript/sample-app/src/models.ts', kind: 'module', name: 'src/models.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 65, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Entity', p: {id: 'can://typescript/sample-app/src/models.ts/Entity', kind: 'class', signature: 'src/models.Entity', name: 'Entity', base_classes: ['src/models.Identifiable'], implements_types: ['src/models.Identifiable'], is_abstract: true, is_exported: true, is_ambient: false, start_line: 26, end_line: 29}}, - {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor', kind: 'constructor', signature: 'src/models.Entity.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 27, end_line: 27, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor@entry', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor@entry', kind: 'entry', start_line: 27, end_line: 27, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor@exit', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor@exit', kind: 'exit', start_line: 27, end_line: 27, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_in:0', kind: 'formal_in', of: 'id', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Entity/describe', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/describe', kind: 'method', signature: 'src/models.Entity.describe', name: 'describe', return_type: 'string', cyclomatic_complexity: 0, is_static: false, is_abstract: true, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 28, end_line: 28, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Entity/id', p: {id: 'can://typescript/sample-app/src/models.ts/Entity/id', kind: 'field', name: 'id', type: 'ID', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Flag', p: {id: 'can://typescript/sample-app/src/models.ts/Flag', kind: 'enum', signature: 'src/models.Flag', name: 'Flag', is_const: true, is_exported: true, is_ambient: false, start_line: 20, end_line: 23}}, - {k: 'can://typescript/sample-app/src/models.ts/Flag/Active', p: {id: 'can://typescript/sample-app/src/models.ts/Flag/Active', kind: 'field', name: 'Active', start_line: 22, end_line: 22, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Flag/None', p: {id: 'can://typescript/sample-app/src/models.ts/Flag/None', kind: 'field', name: 'None', start_line: 21, end_line: 21, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Identifiable', p: {id: 'can://typescript/sample-app/src/models.ts/Identifiable', kind: 'interface', signature: 'src/models.Identifiable', name: 'Identifiable', is_exported: true, is_ambient: false, start_line: 3, end_line: 5}}, - {k: 'can://typescript/sample-app/src/models.ts/Identifiable/id', p: {id: 'can://typescript/sample-app/src/models.ts/Identifiable/id', kind: 'field', name: 'id', type: 'T', start_line: 4, end_line: 4, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Named', p: {id: 'can://typescript/sample-app/src/models.ts/Named', kind: 'interface', signature: 'src/models.Named', name: 'Named', is_exported: true, is_ambient: false, start_line: 7, end_line: 10}} - {k: 'can://typescript/sample-app/src/models.ts/Named/describe', p: {id: 'can://typescript/sample-app/src/models.ts/Named/describe', kind: 'method', signature: 'src/models.Named.describe', name: 'describe', return_type: 'string', cyclomatic_complexity: 0, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 9, end_line: 9, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Named/name', p: {id: 'can://typescript/sample-app/src/models.ts/Named/name', kind: 'field', name: 'name', type: 'string', start_line: 8, end_line: 8, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot', p: {id: 'can://typescript/sample-app/src/models.ts/Robot', kind: 'class', signature: 'src/models.Robot', name: 'Robot', base_classes: ['src/models.Named'], implements_types: ['src/models.Named'], is_abstract: false, is_exported: true, is_ambient: false, start_line: 59, end_line: 64}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor', kind: 'constructor', signature: 'src/models.Robot.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 60, end_line: 60, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor@entry', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor@entry', kind: 'entry', start_line: 60, end_line: 60, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor@exit', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor@exit', kind: 'exit', start_line: 60, end_line: 60, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_in:0', kind: 'formal_in', of: 'name', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/describe', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe', kind: 'method', signature: 'src/models.Robot.describe', name: 'describe', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 61, end_line: 63, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe@62:5', kind: 'statement', start_line: 62, end_line: 62, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe@entry', kind: 'entry', start_line: 61, end_line: 63, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/describe@exit', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe@exit', kind: 'exit', start_line: 61, end_line: 63, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/describe@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/describe@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Robot/name', p: {id: 'can://typescript/sample-app/src/models.ts/Robot/name', kind: 'field', name: 'name', type: 'string', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Role', p: {id: 'can://typescript/sample-app/src/models.ts/Role', kind: 'enum', signature: 'src/models.Role', name: 'Role', is_const: false, is_exported: true, is_ambient: false, start_line: 14, end_line: 18}} - {k: 'can://typescript/sample-app/src/models.ts/Role/Admin', p: {id: 'can://typescript/sample-app/src/models.ts/Role/Admin', kind: 'field', name: 'Admin', start_line: 15, end_line: 15, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Role/Guest', p: {id: 'can://typescript/sample-app/src/models.ts/Role/Guest', kind: 'field', name: 'Guest', start_line: 17, end_line: 17, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/Role/Member', p: {id: 'can://typescript/sample-app/src/models.ts/Role/Member', kind: 'field', name: 'Member', start_line: 16, end_line: 16, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User', p: {id: 'can://typescript/sample-app/src/models.ts/User', kind: 'class', signature: 'src/models.User', name: 'User', base_classes: ['src/models.Entity', 'src/models.Named'], implements_types: ['src/models.Named'], is_abstract: false, is_exported: true, is_ambient: false, start_line: 31, end_line: 56}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor', kind: 'constructor', signature: 'src/models.User.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 35, end_line: 42, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/Entity/constructor', start_line: 40, end_line: 40, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '40:5', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@40:5/actual_out', kind: 'actual_out', of: '$ret', parent: '40:5', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@41:5', kind: 'statement', start_line: 41, end_line: 41, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@entry', kind: 'entry', start_line: 35, end_line: 42, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@exit', kind: 'exit', start_line: 35, end_line: 42, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:0', kind: 'formal_in', of: 'id', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:1', kind: 'formal_in', of: 'name', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_in:2', kind: 'formal_in', of: 'role', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/describe', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe', kind: 'method', signature: 'src/models.User.describe', name: 'describe', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 48, end_line: 50, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe@49:5', kind: 'statement', start_line: 49, end_line: 49, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/describe@entry', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe@entry', kind: 'entry', start_line: 48, end_line: 50, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/describe@exit', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe@exit', kind: 'exit', start_line: 48, end_line: 50, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/describe@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/instances', p: {id: 'can://typescript/sample-app/src/models.ts/User/instances', kind: 'field', name: 'instances', type: 'number', start_line: 33, end_line: 33, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin', kind: 'getter', signature: 'src/models.User.isAdmin', name: 'isAdmin', return_type: 'boolean', cyclomatic_complexity: 1, accessor_kind: 'getter', is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 44, end_line: 46, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin@45:5', kind: 'statement', start_line: 45, end_line: 45, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin@entry', kind: 'entry', start_line: 44, end_line: 46, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin@exit', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin@exit', kind: 'exit', start_line: 44, end_line: 46, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/isAdmin@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/isAdmin@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/loginCount', p: {id: 'can://typescript/sample-app/src/models.ts/User/loginCount', kind: 'field', name: 'loginCount', type: 'number', start_line: 32, end_line: 32, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/name', p: {id: 'can://typescript/sample-app/src/models.ts/User/name', kind: 'field', name: 'name', type: 'string', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin', kind: 'method', signature: 'src/models.User.recordLogin', name: 'recordLogin', return_type: 'Promise', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: true, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 52, end_line: 55, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@53:5', kind: 'statement', start_line: 53, end_line: 53, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@54:5', kind: 'statement', start_line: 54, end_line: 54, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@entry', kind: 'entry', start_line: 52, end_line: 55, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@exit', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@exit', kind: 'exit', start_line: 52, end_line: 55, _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', p: {id: 'can://typescript/sample-app/src/models.ts/User/recordLogin@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/User/role', p: {id: 'can://typescript/sample-app/src/models.ts/User/role', kind: 'field', name: 'role', type: 'Role', _module: 'src/models.ts'}}, - {k: 'can://typescript/sample-app/src/models.ts/UserId', p: {id: 'can://typescript/sample-app/src/models.ts/UserId', kind: 'type_alias', signature: 'src/models.UserId', name: 'UserId', aliased_type: 'string | number', is_exported: true, is_ambient: false, start_line: 12, end_line: 12}} - {k: 'can://typescript/sample-app/src/services.ts', p: {id: 'can://typescript/sample-app/src/services.ts', kind: 'module', name: 'src/services.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 48, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService', p: {id: 'can://typescript/sample-app/src/services.ts/UserService', kind: 'class', signature: 'src/services.UserService', name: 'UserService', is_abstract: false, is_exported: true, is_ambient: false, start_line: 19, end_line: 47}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor', kind: 'constructor', signature: 'src/services.UserService.constructor', name: 'constructor', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 22, end_line: 22, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor@entry', kind: 'entry', start_line: 22, end_line: 22, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor@exit', kind: 'exit', start_line: 22, end_line: 22, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_in:0', kind: 'formal_in', of: 'startId', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/constructor@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create', kind: 'method', signature: 'src/services.UserService.create', name: 'create', return_type: 'User', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 24, end_line: 29, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@25:16', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@25:16', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/nextId', start_line: 25, end_line: 25, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5', kind: 'statement', start_line: 25, end_line: 25, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '25:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@25:5/actual_out', kind: 'actual_out', of: '$ret', parent: '25:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:18', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:18', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/User/constructor', start_line: 26, end_line: 26, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5', kind: 'statement', start_line: 26, end_line: 26, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '26:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '26:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_in:2', kind: 'actual_in', of: 'arg2', parent: '26:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@26:5/actual_out', kind: 'actual_out', of: '$ret', parent: '26:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/push', start_line: 27, end_line: 27, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '27:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@27:5/actual_out', kind: 'actual_out', of: '$ret', parent: '27:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@28:5', kind: 'statement', start_line: 28, end_line: 28, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@entry', kind: 'entry', start_line: 24, end_line: 29, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@exit', kind: 'exit', start_line: 24, end_line: 29, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:0', kind: 'formal_in', of: 'name', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_in:1', kind: 'formal_in', of: 'role', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/create@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest', kind: 'method', signature: 'src/services.UserService.createGuest', name: 'createGuest', return_type: 'User', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 31, end_line: 34, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:18', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:18', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/makeGuestName', start_line: 32, end_line: 32, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5', kind: 'statement', start_line: 32, end_line: 32, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '32:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@32:5/actual_out', kind: 'actual_out', of: '$ret', parent: '32:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:12', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:12', kind: 'call', callee: 'can://typescript/sample-app/src/services.ts/UserService/create', start_line: 33, end_line: 33, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5', kind: 'statement', start_line: 33, end_line: 33, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '33:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '33:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@33:5/actual_out', kind: 'actual_out', of: '$ret', parent: '33:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@entry', kind: 'entry', start_line: 31, end_line: 34, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@exit', kind: 'exit', start_line: 31, end_line: 34, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/createGuest@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll', kind: 'method', signature: 'src/services.UserService.describeAll', name: 'describeAll', return_type: 'string[]', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 36, end_line: 38, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/', kind: 'arrow', signature: 'src/services.UserService.describeAll.', name: '(anonymous)', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 37, end_line: 37, _module: 'src/services.ts'}} - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@37:34', kind: 'statement', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@entry', kind: 'entry', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@exit', kind: 'exit', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_in:0', kind: 'formal_in', of: 'u', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll/@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:12', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:12', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/map', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5', kind: 'statement', start_line: 37, end_line: 37, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '37:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@37:5/actual_out', kind: 'actual_out', of: '$ret', parent: '37:5', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@entry', kind: 'entry', start_line: 36, end_line: 38, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@exit', kind: 'exit', start_line: 36, end_line: 38, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/describeAll@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll', kind: 'method', signature: 'src/services.UserService.loginAll', name: 'loginAll', return_type: 'Promise', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: true, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 40, end_line: 46, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@41:5', kind: 'statement', start_line: 41, end_line: 41, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@42:5', kind: 'statement', start_line: 42, end_line: 44, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:22', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:22', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/User/recordLogin', start_line: 43, end_line: 43, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7', kind: 'statement', start_line: 43, end_line: 43, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@43:7/actual_out', kind: 'actual_out', of: '$ret', parent: '43:7', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@45:5', kind: 'statement', start_line: 45, end_line: 45, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@entry', kind: 'entry', start_line: 40, end_line: 46, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@exit', kind: 'exit', start_line: 40, end_line: 46, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/loginAll@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/startId', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/startId', kind: 'field', name: 'startId', type: 'number', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/UserService/users', p: {id: 'can://typescript/sample-app/src/services.ts/UserService/users', kind: 'field', name: 'users', type: 'User[]', start_line: 20, end_line: 20, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/announce', p: {id: 'can://typescript/sample-app/src/services.ts/announce', kind: 'function', signature: 'src/services.announce', name: 'announce', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 12, end_line: 14, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/announce@13:10', p: {id: 'can://typescript/sample-app/src/services.ts/announce@13:10', kind: 'call', callee: 'can://typescript/sample-app/src/models.ts/Named/describe', start_line: 13, end_line: 13, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/announce@13:3', p: {id: 'can://typescript/sample-app/src/services.ts/announce@13:3', kind: 'statement', start_line: 13, end_line: 13, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/announce@entry', p: {id: 'can://typescript/sample-app/src/services.ts/announce@entry', kind: 'entry', start_line: 12, end_line: 14, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/announce@exit', p: {id: 'can://typescript/sample-app/src/services.ts/announce@exit', kind: 'exit', start_line: 12, end_line: 14, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/announce@formal_in:0', kind: 'formal_in', of: 'thing', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/announce@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/announce@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/makeGuestName', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName', kind: 'function', signature: 'src/services.makeGuestName', name: 'makeGuestName', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 4, end_line: 6, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@5:3', kind: 'statement', start_line: 5, end_line: 5, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@entry', kind: 'entry', start_line: 4, end_line: 6, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@exit', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@exit', kind: 'exit', start_line: 4, end_line: 6, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_in:0', kind: 'formal_in', of: 'seed', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/makeGuestName@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/nextId', p: {id: 'can://typescript/sample-app/src/services.ts/nextId', kind: 'arrow', signature: 'src/services.nextId', name: 'nextId', return_type: 'UserId', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 17, end_line: 17, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/nextId@17:46', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@17:46', kind: 'statement', start_line: 17, end_line: 17, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/nextId@entry', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@entry', kind: 'entry', start_line: 17, end_line: 17, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/nextId@exit', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@exit', kind: 'exit', start_line: 17, end_line: 17, _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/nextId@formal_in:0', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@formal_in:0', kind: 'formal_in', of: 'n', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', p: {id: 'can://typescript/sample-app/src/services.ts/nextId@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/services.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts', p: {id: 'can://typescript/sample-app/src/util.ts', kind: 'module', name: 'src/util.ts', is_tsx: false, is_declaration_file: false, start_line: 1, end_line: 35, _module: 'src/util.ts'}} - {k: 'can://typescript/sample-app/src/util.ts/StringUtil', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil', kind: 'namespace', signature: 'src/util.StringUtil', name: 'StringUtil', is_exported: true, is_ambient: false, start_line: 2, end_line: 21}} - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder', kind: 'class', signature: 'src/util.StringUtil.Builder', name: 'Builder', is_abstract: false, is_exported: true, is_ambient: false, start_line: 11, end_line: 20}} - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add', kind: 'method', signature: 'src/util.StringUtil.Builder.add', name: 'add', return_type: 'this', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 13, end_line: 16, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:23', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:23', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', start_line: 14, end_line: 14, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/push', start_line: 14, end_line: 14, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '14:7', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@14:7/actual_out', kind: 'actual_out', of: '$ret', parent: '14:7', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@15:7', kind: 'statement', start_line: 15, end_line: 15, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@entry', kind: 'entry', start_line: 13, end_line: 16, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@exit', kind: 'exit', start_line: 13, end_line: 16, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_in:0', kind: 'formal_in', of: 'part', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/add@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build', kind: 'method', signature: 'src/util.StringUtil.Builder.build', name: 'build', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 17, end_line: 19, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:14', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:14', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/join', start_line: 18, end_line: 18, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7', kind: 'statement', start_line: 18, end_line: 18, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '18:7', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@18:7/actual_out', kind: 'actual_out', of: '$ret', parent: '18:7', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@entry', kind: 'entry', start_line: 17, end_line: 19, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@exit', kind: 'exit', start_line: 17, end_line: 19, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/build@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/constructor', kind: 'constructor', signature: 'src/util.StringUtil.Builder.constructor', name: 'constructor', cyclomatic_complexity: 0, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: true, start_line: 0, end_line: 0, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/Builder/parts', kind: 'field', name: 'parts', type: 'string[]', start_line: 12, end_line: 12, _module: 'src/util.ts'}} - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat', kind: 'function', signature: 'src/util.StringUtil.repeat', name: 'repeat', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 3, end_line: 5, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/repeat', start_line: 4, end_line: 4, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12/2', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:12/2', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', start_line: 4, end_line: 4, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5', kind: 'statement', start_line: 4, end_line: 4, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '4:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@4:5/actual_out', kind: 'actual_out', of: '$ret', parent: '4:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@entry', kind: 'entry', start_line: 3, end_line: 5, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@exit', kind: 'exit', start_line: 3, end_line: 5, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_in:1', kind: 'formal_in', of: 'n', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/repeat@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug', kind: 'function', signature: 'src/util.StringUtil.slug', name: 'slug', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 7, end_line: 9, _module: 'src/util.ts'}} - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/replace', start_line: 8, end_line: 8, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12/2', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:12/2', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/toLowerCase', start_line: 8, end_line: 8, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5', kind: 'statement', start_line: 8, end_line: 8, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '8:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:1', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_in:1', kind: 'actual_in', of: 'arg1', parent: '8:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@8:5/actual_out', kind: 'actual_out', of: '$ret', parent: '8:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@entry', kind: 'entry', start_line: 7, end_line: 9, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@exit', kind: 'exit', start_line: 7, end_line: 9, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_in:0', kind: 'formal_in', of: 's', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/StringUtil/slug@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}} - {k: 'can://typescript/sample-app/src/util.ts/classify', p: {id: 'can://typescript/sample-app/src/util.ts/classify', kind: 'function', signature: 'src/util.classify', name: 'classify', return_type: 'Record', cyclomatic_complexity: 2, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: true, is_ambient: false, is_implicit: false, start_line: 24, end_line: 34, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf', kind: 'function', signature: 'src/util.classify.keyOf', name: 'keyOf', return_type: 'string', cyclomatic_complexity: 1, is_static: false, is_abstract: false, is_async: false, is_generator: false, is_exported: false, is_ambient: false, is_implicit: false, start_line: 25, end_line: 27, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:12', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:12', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/charAt', start_line: 26, end_line: 26, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5', kind: 'statement', start_line: 26, end_line: 26, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '26:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@26:5/actual_out', kind: 'actual_out', of: '$ret', parent: '26:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@entry', kind: 'entry', start_line: 25, end_line: 27, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@exit', kind: 'exit', start_line: 25, end_line: 27, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_in:0', kind: 'formal_in', of: 'item', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify/keyOf@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@25:3', p: {id: 'can://typescript/sample-app/src/util.ts/classify@25:3', kind: 'statement', start_line: 25, end_line: 27, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@28:3', p: {id: 'can://typescript/sample-app/src/util.ts/classify@28:3', kind: 'statement', start_line: 28, end_line: 28, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@29:3', p: {id: 'can://typescript/sample-app/src/util.ts/classify@29:3', kind: 'statement', start_line: 29, end_line: 32, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@30:15', p: {id: 'can://typescript/sample-app/src/util.ts/classify@30:15', kind: 'call', callee: 'can://typescript/sample-app/src/util.ts/classify/keyOf', start_line: 30, end_line: 30, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@30:5', p: {id: 'can://typescript/sample-app/src/util.ts/classify@30:5', kind: 'statement', start_line: 30, end_line: 30, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '30:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify@30:5/actual_out', kind: 'actual_out', of: '$ret', parent: '30:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@31:5', p: {id: 'can://typescript/sample-app/src/util.ts/classify@31:5', kind: 'call', callee: 'can://typescript/sample-app/@external/(builtin)/push', start_line: 31, end_line: 31, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_in:0', kind: 'actual_in', of: 'arg0', parent: '31:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify@31:5/actual_out', kind: 'actual_out', of: '$ret', parent: '31:5', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@33:3', p: {id: 'can://typescript/sample-app/src/util.ts/classify@33:3', kind: 'statement', start_line: 33, end_line: 33, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@entry', p: {id: 'can://typescript/sample-app/src/util.ts/classify@entry', kind: 'entry', start_line: 24, end_line: 34, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@exit', p: {id: 'can://typescript/sample-app/src/util.ts/classify@exit', kind: 'exit', start_line: 24, end_line: 34, _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@formal_in:0', p: {id: 'can://typescript/sample-app/src/util.ts/classify@formal_in:0', kind: 'formal_in', of: 'items', _module: 'src/util.ts'}}, - {k: 'can://typescript/sample-app/src/util.ts/classify@formal_out', p: {id: 'can://typescript/sample-app/src/util.ts/classify@formal_out', kind: 'formal_out', of: '$ret', _module: 'src/util.ts'}}, -// ── constraints & indexes ── -// ── nodes ── -// ── relationships ── -// ── wipe this project's prior subgraph (external targets are shared) ── -CREATE CONSTRAINT application_id IF NOT EXISTS FOR (x:Application) REQUIRE x.id IS UNIQUE; -CREATE CONSTRAINT cannode_id IF NOT EXISTS FOR (x:CanNode) REQUIRE x.id IS UNIQUE; -CREATE INDEX callable_name IF NOT EXISTS FOR (c:TSCallable) ON (c.name); -CREATE INDEX cannode_kind IF NOT EXISTS FOR (n:CanNode) ON (n.kind); -CREATE INDEX cannode_module IF NOT EXISTS FOR (n:CanNode) ON (n._module); -DETACH DELETE x, m, a; -MATCH (a:Application {id: 'can://typescript/sample-app'}) -MATCH (a:Application {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (a:CanNode {id: row.f}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MATCH (b:CanNode {id: row.t}) -MERGE (a)-[r:TS_CALLS]->(b) -MERGE (a)-[r:TS_CDG]->(b) -MERGE (a)-[r:TS_CFG_NEXT {_k: row.k}]->(b) -MERGE (a)-[r:TS_DDG {_k: row.k}]->(b) -MERGE (a)-[r:TS_DECLARES]->(b) -MERGE (a)-[r:TS_EXTENDS]->(b) -MERGE (a)-[r:TS_HAS_BODY_NODE]->(b) -MERGE (a)-[r:TS_HAS_FIELD]->(b) -MERGE (a)-[r:TS_HAS_METHOD]->(b) -MERGE (a)-[r:TS_HAS_MODULE]->(b) -MERGE (a)-[r:TS_IMPLEMENTS]->(b) -MERGE (a)-[r:TS_PARAM_IN]->(b) -MERGE (a)-[r:TS_PARAM_OUT]->(b) -MERGE (a)-[r:TS_RESOLVES_TO]->(b) -MERGE (a)-[r:TS_SUMMARY]->(b) -MERGE (n:Application {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -MERGE (n:CanNode {id: row.k}) -OPTIONAL MATCH (a)-[:TS_HAS_MODULE]->(m:TSModule) -OPTIONAL MATCH (m)-[:TS_DECLARES|TS_HAS_METHOD|TS_HAS_FIELD|TS_HAS_BODY_NODE*1..]->(x) -SET n += row.p, n:TSApplication; -SET n += row.p, n:TSBodyNode; -SET n += row.p, n:TSCallable:TSAnonymousCallable; -SET n += row.p, n:TSCallable; -SET n += row.p, n:TSClass; -SET n += row.p, n:TSEnum; -SET n += row.p, n:TSExternal; -SET n += row.p, n:TSField; -SET n += row.p, n:TSInterface; -SET n += row.p, n:TSModule; -SET n += row.p, n:TSNamespace; -SET n += row.p, n:TSTypeAlias; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -SET r += row.p; -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -UNWIND [ -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row -] AS row \ No newline at end of file diff --git a/test/native-rewrite-goldens.test.ts b/test/native-rewrite-goldens.test.ts deleted file mode 100644 index 5d941b1..0000000 --- a/test/native-rewrite-goldens.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Transition gate for the native-v2-model rewrite (#96, docs/design/specs/native-v2-model.md). - * - * Captured from the branch base (pre-rewrite `main` behavior), these goldens pin the wire — - * `analysis.json` at every level plus the Neo4j cypher projection — so each rewrite stage can - * prove itself wire-stable. Comparison is DEEP-EQUAL after parsing (JSON object key order is - * meaningless to consumers; the SDK parses, never diffs bytes); cypher is compared as a sorted - * line set (row emission order follows object iteration order, which re-bucketing legitimately - * changes; the graph is the set of rows). `analyzer.version` is normalized out. - * - * Regenerate (Stage 0 only): GOLDEN_REGEN=1 bun test test/native-rewrite-goldens.test.ts - * - * This file and test/goldens/ are TRANSITION-SCOPED: deleted at Stage 4 teardown, when the - * standing conformance + monotonicity gates take back over. - */ -import { describe, expect, test } from "bun:test"; -import * as fs from "node:fs"; -import * as os from "node:os"; -import * as path from "node:path"; -import { analyze } from "../src/core"; -import type { AnalysisOptions } from "../src/options"; -import { renderCypher, project } from "../src/build/neo4j"; - -const GOLDEN_DIR = path.resolve(import.meta.dir, "goldens"); -const REGEN = !!process.env["GOLDEN_REGEN"]; -const FIXTURES = ["sample-app", "dataflow-app", "anon-app"] as const; -const LEVELS = [1, 2, 3, 4] as const; - -function options(fixture: string, level: number): AnalysisOptions { - return { - input: path.resolve(import.meta.dir, "fixtures", fixture), - output: null, - emit: "json", - appName: null, - neo4jUri: null, - neo4jUser: "neo4j", - neo4jPassword: "", - neo4jDatabase: null, - analysisLevel: level, - graphs: ["cfg", "dfg", "pdg", "sdg"], - graphFieldDepth: 3, - jobs: 1, - targetFiles: null, - skipTests: true, - eager: true, - noBuild: true, - phantoms: true, - callGraphProvider: "union", // the default provider — exercises tsc, jelly, and the merge - cacheDir: null, - verbosity: 0, - }; -} - -/** Parse-roundtrip (drops undefined exactly like the real emit) and pin the analyzer version. */ -function normalize(v2: unknown): Record { - const out = JSON.parse(JSON.stringify(v2)) as Record; - (out["analyzer"] as Record)["version"] = "GOLDEN"; - return out; -} - -interface Captured { - json: Record; - cypher: string[] | null; // sorted rows, level-4 runs only (--emit neo4j is always full-depth) -} - -async function capture(fixture: string, level: number): Promise { - const cacheDir = fs.mkdtempSync(path.join(os.tmpdir(), "cants-golden-")); - try { - const opts = { ...options(fixture, level), cacheDir }; - const { application } = await analyze(opts); - const cypher = - level === 4 - ? renderCypher(project(application, application.application.id), application.application.id).split("\n").sort() - : null; - return { json: normalize(application), cypher }; - } finally { - fs.rmSync(cacheDir, { recursive: true, force: true }); - } -} - -for (const fixture of FIXTURES) { - describe(`goldens: ${fixture}`, () => { - for (const level of LEVELS) { - test(`analysis.json -a ${level}${level === 4 ? " + graph.cypher" : ""} matches the pre-rewrite wire`, async () => { - const got = await capture(fixture, level); - const jsonPath = path.join(GOLDEN_DIR, `${fixture}-a${level}.json`); - const cypherPath = path.join(GOLDEN_DIR, `${fixture}.cypher`); - if (REGEN) { - fs.mkdirSync(GOLDEN_DIR, { recursive: true }); - fs.writeFileSync(jsonPath, JSON.stringify(got.json)); - if (got.cypher) fs.writeFileSync(cypherPath, got.cypher.join("\n")); - return; - } - expect(got.json).toEqual(JSON.parse(fs.readFileSync(jsonPath, "utf-8"))); - if (got.cypher) expect(got.cypher).toEqual(fs.readFileSync(cypherPath, "utf-8").split("\n")); - }, 240_000); - } - }); -} From f49b3f89cbb94eceff9f9f1358a66fd796511b6b Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 26 Aug 2026 18:37:34 -0400 Subject: [PATCH 8/8] docs(design): record the native-v2-model spec as implemented (#96) --- docs/design/specs/native-v2-model.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/design/specs/native-v2-model.md b/docs/design/specs/native-v2-model.md index 2f89238..a67db81 100644 --- a/docs/design/specs/native-v2-model.md +++ b/docs/design/specs/native-v2-model.md @@ -1,6 +1,6 @@ # Native v2 model — retire the v1 compute model and the emit-time transform -- **Status:** accepted, not yet implemented +- **Status:** implemented (branch `refactor/issue-096-native-v2-model`) - **Scope:** `codeanalyzer-typescript` only — no wire change, no SDK change, no sibling change - **Schema version:** 2.1.0, unchanged. This is an internal rewrite; `analysis.json` and the Neo4j projection stay semantically identical at every level. @@ -38,7 +38,7 @@ in `src/utils/serialize.ts`); python has since retired its shim. This spec retir | Wire gate | **Deep-equal goldens** captured from pre-rewrite `main`, both fixtures, `-a 1..4` + `graph.cypher`; key order free, arrays order-sensitive | | Tracking | **One issue, one PR**; stages are commits, each green on the goldens | | Release | **1.1.0 at completion**; stages merge nothing individually; no SDK lockstep | -| Terminal naming | `V2*` → `TS*` at teardown; `src/schema/v2/model.ts` folds into `src/schema/schema.ts` | +| Terminal naming | `V2*` → `TS*` at teardown; `src/schema/v2/model.ts` folds into `src/schema/schema.ts`. As implemented: envelope `TSAnalysis`, root node `TSApplication` (python's `PyApplication` analog), internal working set `AnalysisInternal`, wire edges `TSCallGraphEdge`/`TSParamEdge` | | Goldens lifetime | Transition-scoped — harness and goldens deleted at teardown | | L3/L4 tree-attach | Moves to `src/dataflow/attach.ts` (python parity: its dataflow emits onto the tree, python 5600542) | @@ -132,6 +132,11 @@ goldens are deleted at teardown. ## Stages (commits within the one PR; each green on goldens + full suite) +*As implemented:* Stages 2 and 3 landed as one commit — the pass chain is order-coupled +(the L2 passes join on `assignIds` output, the attach on both), so relocating it into the +core spine piecemeal would have produced two incoherent halves. The goldens also cover a +third fixture (`anon-app`) for the 2.1.0 synthesized-callable homing paths. + 1. **Stage 0 — harness.** Goldens captured from the branch base + the deep-equal test. 2. **Stage 1 — L1 native.** Containers in `schema.ts` become v2-bucketed and span-only; `builders.ts`/`symbolTable.ts` fill them; leaf nullables go optional; `assignIds`, `l1Body`,